You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by gi...@apache.org on 2024/04/29 14:44:03 UTC
(hbase-site) branch asf-site updated: Published site at 4230c42b402f909be9e90e71ae62c5778a14100c.
This is an automated email from the ASF dual-hosted git repository.
git-site-role pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/hbase-site.git
The following commit(s) were added to refs/heads/asf-site by this push:
new 0e2b7c1c09a Published site at 4230c42b402f909be9e90e71ae62c5778a14100c.
0e2b7c1c09a is described below
commit 0e2b7c1c09acbbc484c3de674770132b1253b7ff
Author: jenkins <bu...@apache.org>
AuthorDate: Mon Apr 29 14:43:46 2024 +0000
Published site at 4230c42b402f909be9e90e71ae62c5778a14100c.
---
acid-semantics.html | 2 +-
apache_hbase_reference_guide.pdf | 4 +-
book.html | 2 +-
bulk-loads.html | 2 +-
checkstyle-aggregate.html | 6 +-
coc.html | 2 +-
dependencies.html | 2 +-
dependency-convergence.html | 2 +-
dependency-info.html | 2 +-
dependency-management.html | 2 +-
devapidocs/index-all.html | 4 +
.../apache/hadoop/hbase/backup/package-tree.html | 4 +-
.../apache/hadoop/hbase/chaos/package-tree.html | 2 +-
.../apache/hadoop/hbase/client/package-tree.html | 20 +-
.../hadoop/hbase/coprocessor/package-tree.html | 2 +-
.../apache/hadoop/hbase/executor/package-tree.html | 2 +-
.../apache/hadoop/hbase/filter/package-tree.html | 10 +-
.../hadoop/hbase/hbtop/terminal/package-tree.html | 2 +-
.../org/apache/hadoop/hbase/http/package-tree.html | 2 +-
.../hadoop/hbase/io/crypto/tls/package-tree.html | 4 +-
...eredDataBlockEncoder.BufferedEncodedSeeker.html | 30 +-
.../io/encoding/BufferedDataBlockEncoder.html | 16 +-
.../hadoop/hbase/io/encoding/package-tree.html | 2 +-
.../apache/hadoop/hbase/io/hfile/package-tree.html | 4 +-
.../org/apache/hadoop/hbase/io/package-tree.html | 2 +-
.../org/apache/hadoop/hbase/ipc/package-tree.html | 2 +-
.../hadoop/hbase/mapreduce/package-tree.html | 6 +-
.../assignment/MergeTableRegionsProcedure.html | 103 +-
.../hadoop/hbase/master/balancer/package-tree.html | 2 +-
.../apache/hadoop/hbase/master/package-tree.html | 8 +-
.../procedure/class-use/MasterProcedureEnv.html | 68 +-
.../hbase/master/procedure/package-tree.html | 6 +-
.../org/apache/hadoop/hbase/package-tree.html | 18 +-
.../hadoop/hbase/procedure2/package-tree.html | 6 +-
.../apache/hadoop/hbase/quotas/package-tree.html | 6 +-
.../hadoop/hbase/regionserver/package-tree.html | 20 +-
.../regionserver/querymatcher/package-tree.html | 2 +-
.../storefiletracker/package-tree.html | 2 +-
.../hbase/regionserver/wal/package-tree.html | 6 +-
.../hadoop/hbase/replication/package-tree.html | 2 +-
.../replication/regionserver/package-tree.html | 4 +-
.../hadoop/hbase/security/access/package-tree.html | 6 +-
.../apache/hadoop/hbase/security/package-tree.html | 2 +-
.../apache/hadoop/hbase/thrift/package-tree.html | 4 +-
.../apache/hadoop/hbase/trace/package-tree.html | 2 +-
.../org/apache/hadoop/hbase/util/package-tree.html | 10 +-
.../org/apache/hadoop/hbase/wal/package-tree.html | 2 +-
...eredDataBlockEncoder.BufferedEncodedSeeker.html | 852 +++++++--------
...ataBlockEncoder.OffheapDecodedExtendedCell.html | 852 +++++++--------
...BufferedDataBlockEncoder.OnheapDecodedCell.html | 852 +++++++--------
.../BufferedDataBlockEncoder.SeekerState.html | 852 +++++++--------
.../io/encoding/BufferedDataBlockEncoder.html | 852 +++++++--------
.../assignment/MergeTableRegionsProcedure.html | 946 +++++++++--------
downloads.html | 2 +-
export_control.html | 2 +-
index.html | 2 +-
issue-management.html | 2 +-
licenses.html | 2 +-
mailing-lists.html | 2 +-
metrics.html | 2 +-
old_news.html | 2 +-
plugin-management.html | 2 +-
plugins.html | 2 +-
poweredbyhbase.html | 2 +-
project-info.html | 2 +-
project-reports.html | 2 +-
pseudo-distributed.html | 2 +-
replication.html | 2 +-
resources.html | 2 +-
scm.html | 2 +-
sponsors.html | 2 +-
summary.html | 2 +-
supportingprojects.html | 2 +-
team.html | 2 +-
testdevapidocs/index-all.html | 6 +-
.../example/TestZooKeeperScanPolicyObserver.html | 30 +-
.../org/apache/hadoop/hbase/package-tree.html | 18 +-
.../hadoop/hbase/procedure2/package-tree.html | 4 +-
.../TestTags.TestCoprocessorForTags.html | 20 +-
.../apache/hadoop/hbase/regionserver/TestTags.html | 50 +-
.../hadoop/hbase/regionserver/package-tree.html | 6 +-
.../org/apache/hadoop/hbase/test/package-tree.html | 4 +-
.../org/apache/hadoop/hbase/wal/package-tree.html | 2 +-
.../example/TestZooKeeperScanPolicyObserver.html | 194 ++--
.../TestNamespaceAuditor.CPMasterObserver.html | 32 +-
...estNamespaceAuditor.CPRegionServerObserver.html | 32 +-
.../TestNamespaceAuditor.CustomObserver.html | 32 +-
.../TestNamespaceAuditor.MasterSyncObserver.html | 32 +-
.../hbase/namespace/TestNamespaceAuditor.html | 32 +-
.../TestTags.TestCoprocessorForTags.html | 1104 ++++++++++----------
.../apache/hadoop/hbase/regionserver/TestTags.html | 1104 ++++++++++----------
91 files changed, 4255 insertions(+), 4114 deletions(-)
diff --git a/acid-semantics.html b/acid-semantics.html
index cf9ea180258..28501dcf758 100644
--- a/acid-semantics.html
+++ b/acid-semantics.html
@@ -464,7 +464,7 @@
<div class="row">
<p>Copyright ©2007–2024
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-26</li>
+All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-29</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 5bc5db6608a..118644f620a 100644
--- a/apache_hbase_reference_guide.pdf
+++ b/apache_hbase_reference_guide.pdf
@@ -5,8 +5,8 @@
/Author (Apache HBase Team)
/Creator (Asciidoctor PDF 2.0.6, based on Prawn 2.4.0)
/Producer (Apache HBase Team)
-/ModDate (D:20240426142957+00'00')
-/CreationDate (D:20240426144108+00'00')
+/ModDate (D:20240429142955+00'00')
+/CreationDate (D:20240429144109+00'00')
>>
endobj
2 0 obj
diff --git a/book.html b/book.html
index c6c5a6dc0b4..a9db27435ba 100644
--- a/book.html
+++ b/book.html
@@ -49196,7 +49196,7 @@ org/apache/hadoop/hbase/security/access/AccessControlClient.revoke:(Lorg/apache/
<div id="footer">
<div id="footer-text">
Version 4.0.0-alpha-1-SNAPSHOT<br>
-Last updated 2024-04-26 14:29:57 UTC
+Last updated 2024-04-29 14:29:55 UTC
</div>
</div>
<script type="text/x-mathjax-config">
diff --git a/bulk-loads.html b/bulk-loads.html
index c62400335dc..ad1a3cb6f11 100644
--- a/bulk-loads.html
+++ b/bulk-loads.html
@@ -180,7 +180,7 @@
<div class="row">
<p>Copyright ©2007–2024
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-26</li>
+All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-29</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 8b8f222e8d0..ec205859f5e 100644
--- a/checkstyle-aggregate.html
+++ b/checkstyle-aggregate.html
@@ -14236,13 +14236,13 @@
<td>blocks</td>
<td>NeedBraces</td>
<td>'if' construct must use '{}'s.</td>
-<td>304</td></tr>
+<td>318</td></tr>
<tr class="a">
<td><figure><img src="images/icon_error_sml.gif" alt="" /></figure> Error</td>
<td>blocks</td>
<td>NeedBraces</td>
<td>'if' construct must use '{}'s.</td>
-<td>615</td></tr></table></section><section>
+<td>629</td></tr></table></section><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">
@@ -18733,7 +18733,7 @@
<div class="row">
<p>Copyright ©2007–2024
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-26</li>
+All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-29</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/coc.html b/coc.html
index f8986502c65..1c6d141c552 100644
--- a/coc.html
+++ b/coc.html
@@ -248,7 +248,7 @@ email to <a class="externalLink" href="mailto:private@hbase.apache.org">the priv
<div class="row">
<p>Copyright ©2007–2024
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-26</li>
+All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-29</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 7b7db78ea99..0efb0542123 100644
--- a/dependencies.html
+++ b/dependencies.html
@@ -313,7 +313,7 @@
<div class="row">
<p>Copyright ©2007–2024
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-26</li>
+All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-29</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 c46ffbb9a75..1106b14f192 100644
--- a/dependency-convergence.html
+++ b/dependency-convergence.html
@@ -1050,7 +1050,7 @@
<div class="row">
<p>Copyright ©2007–2024
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-26</li>
+All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-29</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 5b1e0608a5c..69884313805 100644
--- a/dependency-info.html
+++ b/dependency-info.html
@@ -195,7 +195,7 @@
<div class="row">
<p>Copyright ©2007–2024
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-26</li>
+All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-29</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 408324e46ee..7f8465958ba 100644
--- a/dependency-management.html
+++ b/dependency-management.html
@@ -1758,7 +1758,7 @@
<div class="row">
<p>Copyright ©2007–2024
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-26</li>
+All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-29</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/index-all.html b/devapidocs/index-all.html
index dc87fc21c9d..4d58b022a22 100644
--- a/devapidocs/index-all.html
+++ b/devapidocs/index-all.html
@@ -115621,6 +115621,10 @@ service.</div>
<dd>
<div class="block">Rollback close regions</div>
</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#rollbackPrepareMerge-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">rollbackPrepareMerge(MasterProcedureEnv)</a></span> - Method in class org.apache.hadoop.hbase.master.assignment.<a href="org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">MergeTableRegionsProcedure</a></dt>
+<dd>
+<div class="block">Action for rollback a merge table after prepare merge</div>
+</dd>
<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#rollbackStack">rollbackStack</a></span> - Variable in class org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureExecutor</a></dt>
<dd>
<div class="block">Map the the procId returned by submitProcedure(), the Root-ProcID, to the RootProcedureState.</div>
diff --git a/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html b/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
index 78d25380a57..3f86c51ffb6 100644
--- a/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
@@ -166,10 +166,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><E> (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><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
<ul>
+<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupInfo.BackupState.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupInfo.BackupState</span></a></li>
<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/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/BackupRestoreConstants.BackupCommand.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupRestoreConstants.BackupCommand</span></a></li>
</ul>
</li>
</ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/chaos/package-tree.html b/devapidocs/org/apache/hadoop/hbase/chaos/package-tree.html
index 850346e4964..0ca699ee4ec 100644
--- a/devapidocs/org/apache/hadoop/hbase/chaos/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/chaos/package-tree.html
@@ -103,8 +103,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><E> (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><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
<ul>
-<li type="circle">org.apache.hadoop.hbase.chaos.<a href="../../../../../org/apache/hadoop/hbase/chaos/ChaosService.ChaosServiceName.html" title="enum in org.apache.hadoop.hbase.chaos"><span class="typeNameLink">ChaosService.ChaosServiceName</span></a></li>
<li type="circle">org.apache.hadoop.hbase.chaos.<a href="../../../../../org/apache/hadoop/hbase/chaos/ChaosService.ExecutorAction.html" title="enum in org.apache.hadoop.hbase.chaos"><span class="typeNameLink">ChaosService.ExecutorAction</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.chaos.<a href="../../../../../org/apache/hadoop/hbase/chaos/ChaosService.ChaosServiceName.html" title="enum in org.apache.hadoop.hbase.chaos"><span class="typeNameLink">ChaosService.ChaosServiceName</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 0a16d13d173..bb96a9ef38d 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
@@ -479,23 +479,23 @@
<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><E> (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><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
<ul>
<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/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/ServerType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">ServerType</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/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/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/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/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/LogQueryFilter.FilterByOperator.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">LogQueryFilter.FilterByOperator</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/LogQueryFilter.Type.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">LogQueryFilter.Type</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/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/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/LogQueryFilter.Type.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">LogQueryFilter.Type</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/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/ServerType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">ServerType</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/Durability.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Durability</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Consistency.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Consistency</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/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/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/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/LogQueryFilter.FilterByOperator.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">LogQueryFilter.FilterByOperator</span></a></li>
</ul>
</li>
</ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/coprocessor/package-tree.html b/devapidocs/org/apache/hadoop/hbase/coprocessor/package-tree.html
index 8876907557b..a21ece27067 100644
--- a/devapidocs/org/apache/hadoop/hbase/coprocessor/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/coprocessor/package-tree.html
@@ -176,8 +176,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><E> (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><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
<ul>
-<li type="circle">org.apache.hadoop.hbase.coprocessor.<a href="../../../../../org/apache/hadoop/hbase/coprocessor/MetaTableMetrics.MetaTableOps.html" title="enum in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">MetaTableMetrics.MetaTableOps</span></a></li>
<li type="circle">org.apache.hadoop.hbase.coprocessor.<a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.MutationType.html" title="enum in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">RegionObserver.MutationType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.coprocessor.<a href="../../../../../org/apache/hadoop/hbase/coprocessor/MetaTableMetrics.MetaTableOps.html" title="enum in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">MetaTableMetrics.MetaTableOps</span></a></li>
</ul>
</li>
</ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html b/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html
index b749d914cd8..5a7e3a69d58 100644
--- a/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html
@@ -105,8 +105,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><E> (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><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
<ul>
-<li type="circle">org.apache.hadoop.hbase.executor.<a href="../../../../../org/apache/hadoop/hbase/executor/ExecutorType.html" title="enum in org.apache.hadoop.hbase.executor"><span class="typeNameLink">ExecutorType</span></a></li>
<li type="circle">org.apache.hadoop.hbase.executor.<a href="../../../../../org/apache/hadoop/hbase/executor/EventType.html" title="enum in org.apache.hadoop.hbase.executor"><span class="typeNameLink">EventType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.executor.<a href="../../../../../org/apache/hadoop/hbase/executor/ExecutorType.html" title="enum in org.apache.hadoop.hbase.executor"><span class="typeNameLink">ExecutorType</span></a></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 33704d4ea36..79faf28338f 100644
--- a/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
@@ -190,13 +190,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><E> (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><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
<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/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/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/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/Filter.ReturnCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">Filter.ReturnCode</span></a></li>
<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FilterWrapper.FilterRowRetCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FilterWrapper.FilterRowRetCode</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/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/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/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/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/FuzzyRowFilter.SatisfiesCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FuzzyRowFilter.SatisfiesCode</span></a></li>
</ul>
</li>
</ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/hbtop/terminal/package-tree.html b/devapidocs/org/apache/hadoop/hbase/hbtop/terminal/package-tree.html
index 931fbbfaef2..ca792fda23b 100644
--- a/devapidocs/org/apache/hadoop/hbase/hbtop/terminal/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/hbtop/terminal/package-tree.html
@@ -107,8 +107,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><E> (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><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
<ul>
-<li type="circle">org.apache.hadoop.hbase.hbtop.terminal.<a href="../../../../../../org/apache/hadoop/hbase/hbtop/terminal/Color.html" title="enum in org.apache.hadoop.hbase.hbtop.terminal"><span class="typeNameLink">Color</span></a></li>
<li type="circle">org.apache.hadoop.hbase.hbtop.terminal.<a href="../../../../../../org/apache/hadoop/hbase/hbtop/terminal/KeyPress.Type.html" title="enum in org.apache.hadoop.hbase.hbtop.terminal"><span class="typeNameLink">KeyPress.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.hbtop.terminal.<a href="../../../../../../org/apache/hadoop/hbase/hbtop/terminal/Color.html" title="enum in org.apache.hadoop.hbase.hbtop.terminal"><span class="typeNameLink">Color</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 6e4b0511795..59a19e7ad29 100644
--- a/devapidocs/org/apache/hadoop/hbase/http/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/http/package-tree.html
@@ -141,8 +141,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><E> (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><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
<ul>
-<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/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>
</ul>
</li>
diff --git a/devapidocs/org/apache/hadoop/hbase/io/crypto/tls/package-tree.html b/devapidocs/org/apache/hadoop/hbase/io/crypto/tls/package-tree.html
index c9f08afafef..37fb529fb54 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/crypto/tls/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/crypto/tls/package-tree.html
@@ -124,9 +124,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><E> (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><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
<ul>
-<li type="circle">org.apache.hadoop.hbase.io.crypto.tls.<a href="../../../../../../../org/apache/hadoop/hbase/io/crypto/tls/X509Util.ClientAuth.html" title="enum in org.apache.hadoop.hbase.io.crypto.tls"><span class="typeNameLink">X509Util.ClientAuth</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.io.crypto.tls.<a href="../../../../../../../org/apache/hadoop/hbase/io/crypto/tls/KeyStoreFileType.html" title="enum in org.apache.hadoop.hbase.io.crypto.tls"><span class="typeNameLink">KeyStoreFileType</span></a></li>
<li type="circle">org.apache.hadoop.hbase.io.crypto.tls.<a href="../../../../../../../org/apache/hadoop/hbase/io/crypto/tls/StandardTypeFileKeyStoreLoader.SupportedStandardKeyFormat.html" title="enum in org.apache.hadoop.hbase.io.crypto.tls"><span class="typeNameLink">StandardTypeFileKeyStoreLoader.SupportedStandardKeyFormat</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.crypto.tls.<a href="../../../../../../../org/apache/hadoop/hbase/io/crypto/tls/KeyStoreFileType.html" title="enum in org.apache.hadoop.hbase.io.crypto.tls"><span class="typeNameLink">KeyStoreFileType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.crypto.tls.<a href="../../../../../../../org/apache/hadoop/hbase/io/crypto/tls/X509Util.ClientAuth.html" title="enum in org.apache.hadoop.hbase.io.crypto.tls"><span class="typeNameLink">X509Util.ClientAuth</span></a></li>
</ul>
</li>
</ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.BufferedEncodedSeeker.html b/devapidocs/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.BufferedEncodedSeeker.html
index b1f569b3ed0..34ff0e1f217 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.BufferedEncodedSeeker.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.BufferedEncodedSeeker.html
@@ -452,7 +452,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/encoding/AbstractD
<ul class="blockList">
<li class="blockList">
<h4>getKey</h4>
-<pre>public <a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.BufferedEncodedSeeker.html#line.849">getKey</a>()</pre>
+<pre>public <a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.BufferedEncodedSeeker.html#line.856">getKey</a>()</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface: <code><a href="../../../../../../org/apache/hadoop/hbase/io/encoding/DataBlockEncoder.EncodedSeeker.html#getKey--">DataBlockEncoder.EncodedSeeker</a></code></span></div>
<div class="block">From the current position creates a cell using the key part of the current buffer</div>
<dl>
@@ -467,7 +467,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/encoding/AbstractD
<ul class="blockList">
<li class="blockList">
<h4>getValueShallowCopy</h4>
-<pre>public <a href="https://docs.oracle.com/javase/8/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.BufferedEncodedSeeker.html#line.856">getValueShallowCopy</a>()</pre>
+<pre>public <a href="https://docs.oracle.com/javase/8/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.BufferedEncodedSeeker.html#line.863">getValueShallowCopy</a>()</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface: <code><a href="../../../../../../org/apache/hadoop/hbase/io/encoding/DataBlockEncoder.EncodedSeeker.html#getValueShallowCopy--">DataBlockEncoder.EncodedSeeker</a></code></span></div>
<div class="block">Does a shallow copy of the value at the current position. A shallow copy is possible because
the returned buffer refers to the backing array of the original encoded buffer.</div>
@@ -483,7 +483,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/encoding/AbstractD
<ul class="blockList">
<li class="blockList">
<h4>getCell</h4>
-<pre>public <a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.BufferedEncodedSeeker.html#line.865">getCell</a>()</pre>
+<pre>public <a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.BufferedEncodedSeeker.html#line.872">getCell</a>()</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface: <code><a href="../../../../../../org/apache/hadoop/hbase/io/encoding/DataBlockEncoder.EncodedSeeker.html#getCell--">DataBlockEncoder.EncodedSeeker</a></code></span></div>
<div class="block">Returns the Cell at the current position. Includes memstore timestamp.</div>
</li>
@@ -494,7 +494,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/encoding/AbstractD
<ul class="blockList">
<li class="blockList">
<h4>rewind</h4>
-<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.BufferedEncodedSeeker.html#line.870">rewind</a>()</pre>
+<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.BufferedEncodedSeeker.html#line.877">rewind</a>()</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface: <code><a href="../../../../../../org/apache/hadoop/hbase/io/encoding/DataBlockEncoder.EncodedSeeker.html#rewind--">DataBlockEncoder.EncodedSeeker</a></code></span></div>
<div class="block">Set position to beginning of given block</div>
</li>
@@ -505,7 +505,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/encoding/AbstractD
<ul class="blockList">
<li class="blockList">
<h4>next</h4>
-<pre>public boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.BufferedEncodedSeeker.html#line.890">next</a>()</pre>
+<pre>public boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.BufferedEncodedSeeker.html#line.894">next</a>()</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface: <code><a href="../../../../../../org/apache/hadoop/hbase/io/encoding/DataBlockEncoder.EncodedSeeker.html#next--">DataBlockEncoder.EncodedSeeker</a></code></span></div>
<div class="block">Move to next position</div>
<dl>
@@ -520,7 +520,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/encoding/AbstractD
<ul class="blockList">
<li class="blockList">
<h4>decodeTags</h4>
-<pre>protected void <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.BufferedEncodedSeeker.html#line.900">decodeTags</a>()</pre>
+<pre>protected void <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.BufferedEncodedSeeker.html#line.904">decodeTags</a>()</pre>
</li>
</ul>
<a name="seekToKeyInBlock-org.apache.hadoop.hbase.Cell-boolean-">
@@ -529,7 +529,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/encoding/AbstractD
<ul class="blockList">
<li class="blockList">
<h4>seekToKeyInBlock</h4>
-<pre>public int <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.BufferedEncodedSeeker.html#line.926">seekToKeyInBlock</a>(<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a> seekCell,
+<pre>public int <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.BufferedEncodedSeeker.html#line.930">seekToKeyInBlock</a>(<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a> seekCell,
boolean seekBefore)</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface: <code><a href="../../../../../../org/apache/hadoop/hbase/io/encoding/DataBlockEncoder.EncodedSeeker.html#seekToKeyInBlock-org.apache.hadoop.hbase.Cell-boolean-">DataBlockEncoder.EncodedSeeker</a></code></span></div>
<div class="block">Moves the seeker position within the current block to:
@@ -556,7 +556,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/encoding/AbstractD
<ul class="blockList">
<li class="blockList">
<h4>compareTypeBytes</h4>
-<pre>private int <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.BufferedEncodedSeeker.html#line.1019">compareTypeBytes</a>(<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a> key,
+<pre>private int <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.BufferedEncodedSeeker.html#line.1023">compareTypeBytes</a>(<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a> key,
<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a> right)</pre>
</li>
</ul>
@@ -566,7 +566,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/encoding/AbstractD
<ul class="blockList">
<li class="blockList">
<h4>findCommonPrefixInRowPart</h4>
-<pre>private static int <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.BufferedEncodedSeeker.html#line.1039">findCommonPrefixInRowPart</a>(<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a> left,
+<pre>private static int <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.BufferedEncodedSeeker.html#line.1043">findCommonPrefixInRowPart</a>(<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a> left,
<a href="../../../../../../org/apache/hadoop/hbase/KeyValue.KeyOnlyKeyValue.html" title="class in org.apache.hadoop.hbase">KeyValue.KeyOnlyKeyValue</a> right,
int rowCommonPrefix)</pre>
</li>
@@ -577,7 +577,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/encoding/AbstractD
<ul class="blockList">
<li class="blockList">
<h4>findCommonPrefixInFamilyPart</h4>
-<pre>private static int <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.BufferedEncodedSeeker.html#line.1054">findCommonPrefixInFamilyPart</a>(<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a> left,
+<pre>private static int <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.BufferedEncodedSeeker.html#line.1058">findCommonPrefixInFamilyPart</a>(<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a> left,
<a href="../../../../../../org/apache/hadoop/hbase/KeyValue.KeyOnlyKeyValue.html" title="class in org.apache.hadoop.hbase">KeyValue.KeyOnlyKeyValue</a> right,
int familyCommonPrefix)</pre>
</li>
@@ -588,7 +588,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/encoding/AbstractD
<ul class="blockList">
<li class="blockList">
<h4>findCommonPrefixInQualifierPart</h4>
-<pre>private static int <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.BufferedEncodedSeeker.html#line.1071">findCommonPrefixInQualifierPart</a>(<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a> left,
+<pre>private static int <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.BufferedEncodedSeeker.html#line.1075">findCommonPrefixInQualifierPart</a>(<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a> left,
<a href="../../../../../../org/apache/hadoop/hbase/KeyValue.KeyOnlyKeyValue.html" title="class in org.apache.hadoop.hbase">KeyValue.KeyOnlyKeyValue</a> right,
int qualifierCommonPrefix)</pre>
</li>
@@ -599,7 +599,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/encoding/AbstractD
<ul class="blockList">
<li class="blockList">
<h4>moveToPrevious</h4>
-<pre>private void <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.BufferedEncodedSeeker.html#line.1089">moveToPrevious</a>()</pre>
+<pre>private void <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.BufferedEncodedSeeker.html#line.1093">moveToPrevious</a>()</pre>
</li>
</ul>
<a name="createSeekerState--">
@@ -608,7 +608,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/encoding/AbstractD
<ul class="blockList">
<li class="blockList">
<h4>createSeekerState</h4>
-<pre>protected <a href="../../../../../../org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.BufferedEncodedSeeker.html" title="type parameter in BufferedDataBlockEncoder.BufferedEncodedSeeker">STATE</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.BufferedEncodedSeeker.html#line.1116">createSeekerState</a>()</pre>
+<pre>protected <a href="../../../../../../org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.BufferedEncodedSeeker.html" title="type parameter in BufferedDataBlockEncoder.BufferedEncodedSeeker">STATE</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.BufferedEncodedSeeker.html#line.1120">createSeekerState</a>()</pre>
</li>
</ul>
<a name="decodeFirst--">
@@ -617,7 +617,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/encoding/AbstractD
<ul class="blockList">
<li class="blockList">
<h4>decodeFirst</h4>
-<pre>protected abstract void <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.BufferedEncodedSeeker.html#line.1122">decodeFirst</a>()</pre>
+<pre>protected abstract void <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.BufferedEncodedSeeker.html#line.1126">decodeFirst</a>()</pre>
</li>
</ul>
<a name="decodeNext--">
@@ -626,7 +626,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/encoding/AbstractD
<ul class="blockListLast">
<li class="blockList">
<h4>decodeNext</h4>
-<pre>protected abstract void <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.BufferedEncodedSeeker.html#line.1124">decodeNext</a>()</pre>
+<pre>protected abstract void <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.BufferedEncodedSeeker.html#line.1128">decodeNext</a>()</pre>
</li>
</ul>
</li>
diff --git a/devapidocs/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.html b/devapidocs/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.html
index dffb51edc71..7814e41e3bb 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.html
@@ -447,7 +447,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/encoding/AbstractD
<ul class="blockList">
<li class="blockList">
<h4>afterEncodingKeyValue</h4>
-<pre>protected final int <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.html#line.1128">afterEncodingKeyValue</a>(<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a> cell,
+<pre>protected final int <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.html#line.1132">afterEncodingKeyValue</a>(<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a> cell,
<a href="https://docs.oracle.com/javase/8/docs/api/java/io/DataOutputStream.html?is-external=true" title="class or interface in java.io">DataOutputStream</a> out,
<a href="../../../../../../org/apache/hadoop/hbase/io/encoding/HFileBlockDefaultEncodingContext.html" title="class in org.apache.hadoop.hbase.io.encoding">HFileBlockDefaultEncodingContext</a> encodingCtx)
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>
@@ -464,7 +464,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/encoding/AbstractD
<ul class="blockList">
<li class="blockList">
<h4>afterDecodingKeyValue</h4>
-<pre>protected final void <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.html#line.1159">afterDecodingKeyValue</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/io/DataInputStream.html?is-external=true" title="class or interface in java.io">DataInputStream</a> source,
+<pre>protected final void <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.html#line.1163">afterDecodingKeyValue</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/io/DataInputStream.html?is-external=true" title="class or interface in java.io">DataInputStream</a> source,
<a href="https://docs.oracle.com/javase/8/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a> dest,
<a href="../../../../../../org/apache/hadoop/hbase/io/encoding/HFileBlockDefaultDecodingContext.html" title="class in org.apache.hadoop.hbase.io.encoding">HFileBlockDefaultDecodingContext</a> decodingCtx)
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>
@@ -480,7 +480,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/encoding/AbstractD
<ul class="blockList">
<li class="blockList">
<h4>internalDecodeKeyValues</h4>
-<pre>protected abstract <a href="https://docs.oracle.com/javase/8/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.html#line.1191">internalDecodeKeyValues</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/io/DataInputStream.html?is-external=true" title="class or interface in java.io">DataInputStream</a> source,
+<pre>protected abstract <a href="https://docs.oracle.com/javase/8/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.html#line.1195">internalDecodeKeyValues</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/io/DataInputStream.html?is-external=true" title="class or interface in java.io">DataInputStream</a> source,
int allocateHeaderLength,
int skipLastBytes,
<a href="../../../../../../org/apache/hadoop/hbase/io/encoding/HFileBlockDefaultDecodingContext.html" title="class in org.apache.hadoop.hbase.io.encoding">HFileBlockDefaultDecodingContext</a> decodingCtx)
@@ -497,7 +497,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/encoding/AbstractD
<ul class="blockList">
<li class="blockList">
<h4>ensureSpace</h4>
-<pre>protected static void <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.html#line.1202">ensureSpace</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a> out,
+<pre>protected static void <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.html#line.1206">ensureSpace</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a> out,
int length)
throws <a href="../../../../../../org/apache/hadoop/hbase/io/encoding/EncoderBufferTooSmallException.html" title="class in org.apache.hadoop.hbase.io.encoding">EncoderBufferTooSmallException</a></pre>
<div class="block">Asserts that there is at least the given amount of unfilled space remaining in the given
@@ -517,7 +517,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/encoding/AbstractD
<ul class="blockList">
<li class="blockList">
<h4>startBlockEncoding</h4>
-<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.html#line.1211">startBlockEncoding</a>(<a href="../../../../../../org/apache/hadoop/hbase/io/encoding/HFileBlockEncodingContext.html" title="interface in org.apache.hadoop.hbase.io.encoding">HFileBlockEncodingContext</a> blkEncodingCtx,
+<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.html#line.1215">startBlockEncoding</a>(<a href="../../../../../../org/apache/hadoop/hbase/io/encoding/HFileBlockEncodingContext.html" title="interface in org.apache.hadoop.hbase.io.encoding">HFileBlockEncodingContext</a> blkEncodingCtx,
<a href="https://docs.oracle.com/javase/8/docs/api/java/io/DataOutputStream.html?is-external=true" title="class or interface in java.io">DataOutputStream</a> out)
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: <code><a href="../../../../../../org/apache/hadoop/hbase/io/encoding/DataBlockEncoder.html#startBlockEncoding-org.apache.hadoop.hbase.io.encoding.HFileBlockEncodingContext-java.io.DataOutputStream-">DataBlockEncoder</a></code></span></div>
@@ -536,7 +536,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/encoding/AbstractD
<ul class="blockList">
<li class="blockList">
<h4>encode</h4>
-<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.html#line.1244">encode</a>(<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a> cell,
+<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.html#line.1248">encode</a>(<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a> cell,
<a href="../../../../../../org/apache/hadoop/hbase/io/encoding/HFileBlockEncodingContext.html" title="interface in org.apache.hadoop.hbase.io.encoding">HFileBlockEncodingContext</a> encodingCtx,
<a href="https://docs.oracle.com/javase/8/docs/api/java/io/DataOutputStream.html?is-external=true" title="class or interface in java.io">DataOutputStream</a> out)
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>
@@ -555,7 +555,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/encoding/AbstractD
<ul class="blockList">
<li class="blockList">
<h4>internalEncode</h4>
-<pre>public abstract int <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.html#line.1252">internalEncode</a>(<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a> cell,
+<pre>public abstract int <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.html#line.1256">internalEncode</a>(<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a> cell,
<a href="../../../../../../org/apache/hadoop/hbase/io/encoding/HFileBlockDefaultEncodingContext.html" title="class in org.apache.hadoop.hbase.io.encoding">HFileBlockDefaultEncodingContext</a> encodingCtx,
<a href="https://docs.oracle.com/javase/8/docs/api/java/io/DataOutputStream.html?is-external=true" title="class or interface in java.io">DataOutputStream</a> out)
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>
@@ -571,7 +571,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/encoding/AbstractD
<ul class="blockListLast">
<li class="blockList">
<h4>endBlockEncoding</h4>
-<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.html#line.1256">endBlockEncoding</a>(<a href="../../../../../../org/apache/hadoop/hbase/io/encoding/HFileBlockEncodingContext.html" title="interface in org.apache.hadoop.hbase.io.encoding">HFileBlockEncodingContext</a> encodingCtx,
+<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.html#line.1260">endBlockEncoding</a>(<a href="../../../../../../org/apache/hadoop/hbase/io/encoding/HFileBlockEncodingContext.html" title="interface in org.apache.hadoop.hbase.io.encoding">HFileBlockEncodingContext</a> encodingCtx,
<a href="https://docs.oracle.com/javase/8/docs/api/java/io/DataOutputStream.html?is-external=true" title="class or interface in java.io">DataOutputStream</a> out,
byte[] uncompressedBytesWithHeader)
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>
diff --git a/devapidocs/org/apache/hadoop/hbase/io/encoding/package-tree.html b/devapidocs/org/apache/hadoop/hbase/io/encoding/package-tree.html
index 5e6b85325fd..84749717230 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/encoding/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/encoding/package-tree.html
@@ -166,8 +166,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><E> (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><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
<ul>
-<li type="circle">org.apache.hadoop.hbase.io.encoding.<a href="../../../../../../org/apache/hadoop/hbase/io/encoding/IndexBlockEncoding.html" title="enum in org.apache.hadoop.hbase.io.encoding"><span class="typeNameLink">IndexBlockEncoding</span></a></li>
<li type="circle">org.apache.hadoop.hbase.io.encoding.<a href="../../../../../../org/apache/hadoop/hbase/io/encoding/DataBlockEncoding.html" title="enum in org.apache.hadoop.hbase.io.encoding"><span class="typeNameLink">DataBlockEncoding</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.encoding.<a href="../../../../../../org/apache/hadoop/hbase/io/encoding/IndexBlockEncoding.html" title="enum in org.apache.hadoop.hbase.io.encoding"><span class="typeNameLink">IndexBlockEncoding</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 c57246f2543..f5c7be184ca 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
@@ -321,11 +321,11 @@
<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><E> (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><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
<ul>
<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/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/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/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/ReaderContext.ReaderType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">ReaderContext.ReaderType</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>
</ul>
</li>
</ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/io/package-tree.html b/devapidocs/org/apache/hadoop/hbase/io/package-tree.html
index 0eb02f9bc11..0ff35c94455 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/package-tree.html
@@ -185,8 +185,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><E> (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><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
<ul>
-<li type="circle">org.apache.hadoop.hbase.io.<a href="../../../../../org/apache/hadoop/hbase/io/FileChangeWatcher.State.html" title="enum in org.apache.hadoop.hbase.io"><span class="typeNameLink">FileChangeWatcher.State</span></a></li>
<li type="circle">org.apache.hadoop.hbase.io.<a href="../../../../../org/apache/hadoop/hbase/io/Reference.Range.html" title="enum in org.apache.hadoop.hbase.io"><span class="typeNameLink">Reference.Range</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.<a href="../../../../../org/apache/hadoop/hbase/io/FileChangeWatcher.State.html" title="enum in org.apache.hadoop.hbase.io"><span class="typeNameLink">FileChangeWatcher.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 fa9c071945d..d26d4caab9f 100644
--- a/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
@@ -375,9 +375,9 @@
<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><E> (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><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
<ul>
<li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/ServerRpcConnection.PreambleResponse.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">ServerRpcConnection.PreambleResponse</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>
<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/CallEvent.Type.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">CallEvent.Type</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 4d05f05046f..8ea456497da 100644
--- a/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
@@ -303,11 +303,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><E> (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><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
<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/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/WALPlayer.Counter.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">WALPlayer.Counter</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/CellCounter.CellCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">CellCounter.CellCounterMapper.Counters</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/RowCounter.RowCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">RowCounter.RowCounterMapper.Counters</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/SyncTable.SyncMapper.Counter.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">SyncTable.SyncMapper.Counter</span></a></li>
</ul>
</li>
</ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html b/devapidocs/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html
index 388d5f5cdb1..9eb253044e4 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html
@@ -18,7 +18,7 @@
catch(err) {
}
//-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":9,"i4":10,"i5":10,"i6":10,"i7":9,"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};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":9,"i4":10,"i5":10,"i6":10,"i7":9,"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};
var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
var altColor = "altColor";
var rowColor = "rowColor";
@@ -459,6 +459,12 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
</td>
</tr>
<tr id="i33" class="rowColor">
+<td class="colFirst"><code>private void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#rollbackPrepareMerge-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">rollbackPrepareMerge</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a> env)</code>
+<div class="block">Action for rollback a merge table after prepare merge</div>
+</td>
+</tr>
+<tr id="i34" class="altColor">
<td class="colFirst"><code>protected void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#rollbackState-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.MergeTableRegionsState-">rollbackState</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master. [...]
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.MergeTableRegionsState state)</code>
@@ -467,31 +473,31 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
AssignProcedures) .</div>
</td>
</tr>
-<tr id="i34" class="altColor">
+<tr id="i35" class="rowColor">
<td class="colFirst"><code>protected void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#serializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">serializeStateData</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a> serializer)</code>
<div class="block">The user-level code of the procedure may have some state to persist (e.g.</div>
</td>
</tr>
-<tr id="i35" class="rowColor">
+<tr id="i36" class="altColor">
<td class="colFirst"><code>private void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#setRegionStateToMerging-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">setRegionStateToMerging</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a> env)</code>
<div class="block">Set the region states to MERGING state</div>
</td>
</tr>
-<tr id="i36" class="altColor">
+<tr id="i37" class="rowColor">
<td class="colFirst"><code>void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#toStringClassDetails-java.lang.StringBuilder-">toStringClassDetails</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/StringBuilder.html?is-external=true" title="class or interface in java.lang">StringBuilder</a> sb)</code>
<div class="block">Extend the toString() information with the procedure details e.g.</div>
</td>
</tr>
-<tr id="i37" class="rowColor">
+<tr id="i38" class="altColor">
<td class="colFirst"><code>private void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#updateMetaForMergedRegions-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">updateMetaForMergedRegions</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a> env)</code>
<div class="block">Add merged region to META and delete original regions.</div>
</td>
</tr>
-<tr id="i38" class="altColor">
+<tr id="i39" class="rowColor">
<td class="colFirst"><code>private void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#writeMaxSequenceIdFile-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">writeMaxSequenceIdFile</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a> env)</code> </td>
</tr>
@@ -702,7 +708,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
<ul class="blockList">
<li class="blockList">
<h4>isRollbackSupported</h4>
-<pre>protected boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.311">isRollbackSupported</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.MergeTableRegionsState state)</pre>
+<pre>protected boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.312">isRollbackSupported</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.MergeTableRegionsState state)</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from class: <code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#isRollbackSupported-TState-">StateMachineProcedure</a></code></span></div>
<div class="block">Used by the default implementation of abort() to know if the current state can be aborted and
rollback can be triggered.</div>
@@ -718,7 +724,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
<ul class="blockList">
<li class="blockList">
<h4>removeNonDefaultReplicas</h4>
-<pre>private void <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.325">removeNonDefaultReplicas</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a> env)
+<pre>private void <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.326">removeNonDefaultReplicas</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a> env)
throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
<dl>
<dt><span class="throwsLabel">Throws:</span></dt>
@@ -732,7 +738,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
<ul class="blockList">
<li class="blockList">
<h4>checkClosedRegions</h4>
-<pre>private void <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.330">checkClosedRegions</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a> env)
+<pre>private void <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.331">checkClosedRegions</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a> env)
throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
<dl>
<dt><span class="throwsLabel">Throws:</span></dt>
@@ -746,7 +752,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
<ul class="blockList">
<li class="blockList">
<h4>getState</h4>
-<pre>protected org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.MergeTableRegionsState <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.339">getState</a>(int stateId)</pre>
+<pre>protected org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.MergeTableRegionsState <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.340">getState</a>(int stateId)</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from class: <code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#getState-int-">StateMachineProcedure</a></code></span></div>
<div class="block">Convert an ordinal (or state id) to an Enum (or more descriptive) state object.</div>
<dl>
@@ -765,7 +771,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
<ul class="blockList">
<li class="blockList">
<h4>getStateId</h4>
-<pre>protected int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.344">getStateId</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.MergeTableRegionsState state)</pre>
+<pre>protected int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.345">getStateId</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.MergeTableRegionsState state)</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from class: <code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#getStateId-TState-">StateMachineProcedure</a></code></span></div>
<div class="block">Convert the Enum (or more descriptive) state object to an ordinal (or state id).</div>
<dl>
@@ -784,7 +790,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
<ul class="blockList">
<li class="blockList">
<h4>getInitialState</h4>
-<pre>protected org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.MergeTableRegionsState <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.349">getInitialState</a>()</pre>
+<pre>protected org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.MergeTableRegionsState <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.350">getInitialState</a>()</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from class: <code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#getInitialState--">StateMachineProcedure</a></code></span></div>
<div class="block">Return the initial state object that will be used for the first call to executeFromState().</div>
<dl>
@@ -801,7 +807,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
<ul class="blockList">
<li class="blockList">
<h4>serializeStateData</h4>
-<pre>protected void <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.354">serializeStateData</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a> serializer)
+<pre>protected void <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.355">serializeStateData</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a> serializer)
throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from class: <code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#serializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">Procedure</a></code></span></div>
<div class="block">The user-level code of the procedure may have some state to persist (e.g. input arguments or
@@ -822,7 +828,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
<ul class="blockList">
<li class="blockList">
<h4>deserializeStateData</h4>
-<pre>protected void <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.368">deserializeStateData</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a> serializer)
+<pre>protected void <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.369">deserializeStateData</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a> serializer)
throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from class: <code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#deserializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">Procedure</a></code></span></div>
<div class="block">Called on store load to allow the user to decode the previously serialized state.</div>
@@ -842,7 +848,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
<ul class="blockList">
<li class="blockList">
<h4>toStringClassDetails</h4>
-<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.385">toStringClassDetails</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/StringBuilder.html?is-external=true" title="class or interface in java.lang">StringBuilder</a> sb)</pre>
+<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.386">toStringClassDetails</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/StringBuilder.html?is-external=true" title="class or interface in java.lang">StringBuilder</a> sb)</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from class: <code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#toStringClassDetails-java.lang.StringBuilder-">Procedure</a></code></span></div>
<div class="block">Extend the toString() information with the procedure details e.g. className and parameters</div>
<dl>
@@ -859,7 +865,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
<ul class="blockList">
<li class="blockList">
<h4>acquireLock</h4>
-<pre>protected <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.LockState.html" title="enum in org.apache.hadoop.hbase.procedure2">Procedure.LockState</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.396">acquireLock</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEn [...]
+<pre>protected <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.LockState.html" title="enum in org.apache.hadoop.hbase.procedure2">Procedure.LockState</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.397">acquireLock</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEn [...]
<div class="block"><span class="descfrmTypeLabel">Description copied from class: <code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#acquireLock-TEnvironment-">Procedure</a></code></span></div>
<div class="block">The user should override this method if they need a lock on an Entity. A lock can be anything,
and it is up to the implementor. The Procedure Framework will call this method just before it
@@ -896,7 +902,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
<ul class="blockList">
<li class="blockList">
<h4>releaseLock</h4>
-<pre>protected void <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.412">releaseLock</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a> env)</pre>
+<pre>protected void <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.413">releaseLock</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a> env)</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from class: <code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#releaseLock-TEnvironment-">Procedure</a></code></span></div>
<div class="block">The user should override this method, and release lock if necessary.</div>
<dl>
@@ -911,7 +917,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
<ul class="blockList">
<li class="blockList">
<h4>holdLock</h4>
-<pre>protected boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.420">holdLock</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a> env)</pre>
+<pre>protected boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.421">holdLock</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a> env)</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from class: <code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#holdLock-TEnvironment-">Procedure</a></code></span></div>
<div class="block">Used to keep the procedure lock even when the procedure is yielding or suspended.</div>
<dl>
@@ -928,7 +934,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
<ul class="blockList">
<li class="blockList">
<h4>getTableName</h4>
-<pre>public <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.425">getTableName</a>()</pre>
+<pre>public <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.426">getTableName</a>()</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface: <code><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.html#getTableName--">TableProcedureInterface</a></code></span></div>
<div class="block">Returns the name of the table the procedure is operating on</div>
<dl>
@@ -945,7 +951,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
<ul class="blockList">
<li class="blockList">
<h4>getTableOperationType</h4>
-<pre>public <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.TableOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure">TableProcedureInterface.TableOperationType</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.430">getTableOperationType</a>()</pre>
+<pre>public <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.TableOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure">TableProcedureInterface.TableOperationType</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.431">getTableOperationType</a>()</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface: <code><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.html#getTableOperationType--">TableProcedureInterface</a></code></span></div>
<div class="block">Given an operation type we can take decisions about what to do with pending operations. e.g. if
we get a delete and we have some table operation pending (e.g. add column) we can abort those
@@ -966,7 +972,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
<ul class="blockList">
<li class="blockList">
<h4>getProcedureMetrics</h4>
-<pre>protected <a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureMetrics.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureMetrics</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.435">getProcedureMetrics</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProc [...]
+<pre>protected <a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureMetrics.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureMetrics</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.436">getProcedureMetrics</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProc [...]
<div class="block"><span class="descfrmTypeLabel">Description copied from class: <code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#getProcedureMetrics-TEnvironment-">Procedure</a></code></span></div>
<div class="block">Override this method to provide procedure specific counters for submitted count, failed count
and time histogram.</div>
@@ -986,7 +992,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
<ul class="blockList">
<li class="blockList">
<h4>prepareMergeRegion</h4>
-<pre>private boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.442">prepareMergeRegion</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a> env)
+<pre>private boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.443">prepareMergeRegion</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a> env)
throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
<div class="block">Prepare merge and do some check</div>
<dl>
@@ -1001,7 +1007,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
<ul class="blockList">
<li class="blockList">
<h4>isMergeable</h4>
-<pre>private boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.510">isMergeable</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a> env,
+<pre>private boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.511">isMergeable</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a> env,
<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.html" title="class in org.apache.hadoop.hbase.master">RegionState</a> rs)
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>
@@ -1010,13 +1016,28 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
</dl>
</li>
</ul>
+<a name="rollbackPrepareMerge-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">
+<!-- -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>rollbackPrepareMerge</h4>
+<pre>private void <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.521">rollbackPrepareMerge</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a> env)
+ throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
+<div class="block">Action for rollback a merge table after prepare merge</div>
+<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="preMergeRegions-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>preMergeRegions</h4>
-<pre>private void <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.521">preMergeRegions</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a> env)
+<pre>private void <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.535">preMergeRegions</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a> env)
throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
<div class="block">Pre merge region action</div>
<dl>
@@ -1033,7 +1054,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
<ul class="blockList">
<li class="blockList">
<h4>postRollBackMergeRegions</h4>
-<pre>private void <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.540">postRollBackMergeRegions</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a> env)
+<pre>private void <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.554">postRollBackMergeRegions</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a> env)
throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
<div class="block">Action after rollback a merge table regions action.</div>
<dl>
@@ -1048,7 +1069,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
<ul class="blockList">
<li class="blockList">
<h4>setRegionStateToMerging</h4>
-<pre>private void <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.550">setRegionStateToMerging</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a> env)</pre>
+<pre>private void <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.564">setRegionStateToMerging</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a> env)</pre>
<div class="block">Set the region states to MERGING state</div>
</li>
</ul>
@@ -1058,7 +1079,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
<ul class="blockList">
<li class="blockList">
<h4>createMergedRegion</h4>
-<pre>private void <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.572">createMergedRegion</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a> env)
+<pre>private void <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.586">createMergedRegion</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a> env)
throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
<div class="block">Create merged region. The way the merge works is that we make a 'merges' temporary directory in
the FIRST parent region to merge (Do not change this without also changing the rollback where
@@ -1084,7 +1105,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
<ul class="blockList">
<li class="blockList">
<h4>mergeStoreFiles</h4>
-<pre>private <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><org.apache.hadoop.fs.Path> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.593">mergeStoreFiles</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterP [...]
+<pre>private <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><org.apache.hadoop.fs.Path> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.607">mergeStoreFiles</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterP [...]
<a href="../../../../../../org/apache/hadoop/hbase/regionserver/HRegionFileSystem.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionFileSystem</a> regionFs,
<a href="../../../../../../org/apache/hadoop/hbase/regionserver/HRegionFileSystem.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionFileSystem</a> mergeRegionFs,
<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a> mergedRegion)
@@ -1101,7 +1122,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
<ul class="blockList">
<li class="blockList">
<h4>cleanupMergedRegion</h4>
-<pre>private void <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.626">cleanupMergedRegion</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a> env)
+<pre>private void <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.640">cleanupMergedRegion</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a> env)
throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
<div class="block">Clean up a merged region on rollback after failure.</div>
<dl>
@@ -1116,7 +1137,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
<ul class="blockList">
<li class="blockList">
<h4>rollbackCloseRegionsForMerge</h4>
-<pre>private void <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.641">rollbackCloseRegionsForMerge</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a> env)
+<pre>private void <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.655">rollbackCloseRegionsForMerge</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a> env)
throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
<div class="block">Rollback close regions</div>
<dl>
@@ -1131,7 +1152,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
<ul class="blockList">
<li class="blockList">
<h4>createUnassignProcedures</h4>
-<pre>private <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a>[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.646">createUnassignProcedures</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hado [...]
+<pre>private <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a>[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.672">createUnassignProcedures</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hado [...]
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>
@@ -1145,7 +1166,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
<ul class="blockList">
<li class="blockList">
<h4>createAssignProcedures</h4>
-<pre>private <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a>[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.652">createAssignProcedures</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop [...]
+<pre>private <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a>[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.678">createAssignProcedures</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop [...]
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>
@@ -1159,7 +1180,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
<ul class="blockList">
<li class="blockList">
<h4>getRegionReplication</h4>
-<pre>private int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.658">getRegionReplication</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a> env)
+<pre>private int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.684">getRegionReplication</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a> env)
throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
<dl>
<dt><span class="throwsLabel">Throws:</span></dt>
@@ -1173,7 +1194,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
<ul class="blockList">
<li class="blockList">
<h4>preMergeRegionsCommit</h4>
-<pre>private void <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.666">preMergeRegionsCommit</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a> env)
+<pre>private void <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.692">preMergeRegionsCommit</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a> env)
throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
<div class="block">Post merge region action</div>
<dl>
@@ -1190,7 +1211,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
<ul class="blockList">
<li class="blockList">
<h4>updateMetaForMergedRegions</h4>
-<pre>private void <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.687">updateMetaForMergedRegions</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a> env)
+<pre>private void <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.713">updateMetaForMergedRegions</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a> env)
throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
<div class="block">Add merged region to META and delete original regions.</div>
<dl>
@@ -1205,7 +1226,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
<ul class="blockList">
<li class="blockList">
<h4>postMergeRegionsCommit</h4>
-<pre>private void <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.696">postMergeRegionsCommit</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a> env)
+<pre>private void <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.722">postMergeRegionsCommit</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a> env)
throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
<div class="block">Post merge region action</div>
<dl>
@@ -1222,7 +1243,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
<ul class="blockList">
<li class="blockList">
<h4>postCompletedMergeRegions</h4>
-<pre>private void <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.707">postCompletedMergeRegions</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a> env)
+<pre>private void <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.733">postCompletedMergeRegions</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a> env)
throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
<div class="block">Post merge region action</div>
<dl>
@@ -1239,7 +1260,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
<ul class="blockList">
<li class="blockList">
<h4>getServerName</h4>
-<pre>private <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.719">getServerName</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a> env)</pre>
+<pre>private <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.745">getServerName</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a> env)</pre>
<div class="block">The procedure could be restarted from a different machine. If the variable is null, we need to
retrieve it.</div>
<dl>
@@ -1254,7 +1275,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
<ul class="blockList">
<li class="blockList">
<h4>writeMaxSequenceIdFile</h4>
-<pre>private void <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.731">writeMaxSequenceIdFile</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a> env)
+<pre>private void <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.757">writeMaxSequenceIdFile</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a> env)
throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
<dl>
<dt><span class="throwsLabel">Throws:</span></dt>
@@ -1268,7 +1289,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
<ul class="blockList">
<li class="blockList">
<h4>getMergedRegion</h4>
-<pre><a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.746">getMergedRegion</a>()</pre>
+<pre><a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.772">getMergedRegion</a>()</pre>
<div class="block">Returns The merged region. Maybe be null if called to early or we failed.</div>
</li>
</ul>
@@ -1278,7 +1299,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
<ul class="blockListLast">
<li class="blockList">
<h4>abort</h4>
-<pre>protected boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.751">abort</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a> env)</pre>
+<pre>protected boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#line.777">abort</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a> env)</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from class: <code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#abort-TEnvironment-">Procedure</a></code></span></div>
<div class="block">The abort() call is asynchronous and each procedure must decide how to deal with it, if they
want to be abortable. The simplest implementation is to have an AtomicBoolean set in the
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html
index 9dc73b3bb5e..83a3fa28928 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html
@@ -230,9 +230,9 @@
<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><E> (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><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
<ul>
<li type="circle">org.apache.hadoop.hbase.master.balancer.<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BalancerClusterState.LocalityType.html" title="enum in org.apache.hadoop.hbase.master.balancer"><span class="typeNameLink">BalancerClusterState.LocalityType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.master.balancer.<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CacheAwareLoadBalancer.GeneratorFunctionType.html" title="enum in org.apache.hadoop.hbase.master.balancer"><span class="typeNameLink">CacheAwareLoadBalancer.GeneratorFunctionType</span></a></li>
<li type="circle">org.apache.hadoop.hbase.master.balancer.<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.GeneratorType.html" title="enum in org.apache.hadoop.hbase.master.balancer"><span class="typeNameLink">StochasticLoadBalancer.GeneratorType</span></a></li>
<li type="circle">org.apache.hadoop.hbase.master.balancer.<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BalanceAction.Type.html" title="enum in org.apache.hadoop.hbase.master.balancer"><span class="typeNameLink">BalanceAction.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.balancer.<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CacheAwareLoadBalancer.GeneratorFunctionType.html" title="enum in org.apache.hadoop.hbase.master.balancer"><span class="typeNameLink">CacheAwareLoadBalancer.GeneratorFunctionType</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 2b1a201ca3b..e293123c82e 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
@@ -323,12 +323,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><E> (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><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
<ul>
-<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>
-<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/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/MasterRpcServices.BalanceSwitchMode.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">MasterRpcServices.BalanceSwitchMode</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.ResubmitDirective.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">SplitLogManager.ResubmitDirective</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">RegionState.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/ServerManager.ServerLiveState.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">ServerManager.ServerLiveState</span></a></li>
</ul>
</li>
</ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/procedure/class-use/MasterProcedureEnv.html b/devapidocs/org/apache/hadoop/hbase/master/procedure/class-use/MasterProcedureEnv.html
index 241bdf11e5f..ed08636322e 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/procedure/class-use/MasterProcedureEnv.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/procedure/class-use/MasterProcedureEnv.html
@@ -878,23 +878,29 @@
</td>
</tr>
<tr class="rowColor">
+<td class="colFirst"><code>private void</code></td>
+<td class="colLast"><span class="typeNameLabel">MergeTableRegionsProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#rollbackPrepareMerge-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">rollbackPrepareMerge</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">Ma [...]
+<div class="block">Action for rollback a merge table after prepare merge</div>
+</td>
+</tr>
+<tr class="altColor">
<td class="colFirst"><code>protected void</code></td>
<td class="colLast"><span class="typeNameLabel">GCMultipleMergedRegionsProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/GCMultipleMergedRegionsProcedure.html#rollbackState-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.GCMergedRegionsState-">rollbackState</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/proc [...]
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.GCMergedRegionsState state)</code> </td>
</tr>
-<tr class="altColor">
+<tr class="rowColor">
<td class="colFirst"><code>protected void</code></td>
<td class="colLast"><span class="typeNameLabel">GCMergedRegionsProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/GCMergedRegionsProcedure.html#rollbackState-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.GCMergedRegionsState-">rollbackState</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProc [...]
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.GCMergedRegionsState state)</code>
<div class="block"><span class="deprecatedLabel">Deprecated.</span> </div>
</td>
</tr>
-<tr class="rowColor">
+<tr class="altColor">
<td class="colFirst"><code>protected void</code></td>
<td class="colLast"><span class="typeNameLabel">GCRegionProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/GCRegionProcedure.html#rollbackState-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.GCRegionState-">rollbackState</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title= [...]
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.GCRegionState state)</code> </td>
</tr>
-<tr class="altColor">
+<tr class="rowColor">
<td class="colFirst"><code>protected void</code></td>
<td class="colLast"><span class="typeNameLabel">MergeTableRegionsProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#rollbackState-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.MergeTableRegionsState-">rollbackState</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/Mast [...]
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.MergeTableRegionsState state)</code>
@@ -903,19 +909,19 @@
AssignProcedures) .</div>
</td>
</tr>
-<tr class="rowColor">
+<tr class="altColor">
<td class="colFirst"><code>protected void</code></td>
<td class="colLast"><span class="typeNameLabel">MoveRegionProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/MoveRegionProcedure.html#rollbackState-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.MoveRegionState-">rollbackState</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" [...]
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.MoveRegionState state)</code>
<div class="block"><span class="deprecatedLabel">Deprecated.</span> </div>
</td>
</tr>
-<tr class="altColor">
+<tr class="rowColor">
<td class="colFirst"><code>protected void</code></td>
<td class="colLast"><span class="typeNameLabel">TransitRegionStateProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#rollbackState-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionState-">rollbackState</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedur [...]
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionState state)</code> </td>
</tr>
-<tr class="rowColor">
+<tr class="altColor">
<td class="colFirst"><code>protected void</code></td>
<td class="colLast"><span class="typeNameLabel">SplitTableRegionProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/SplitTableRegionProcedure.html#rollbackState-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.SplitTableRegionState-">rollbackState</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterP [...]
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.SplitTableRegionState state)</code>
@@ -924,149 +930,149 @@
.</div>
</td>
</tr>
-<tr class="altColor">
+<tr class="rowColor">
<td class="colFirst"><code>(package private) void</code></td>
<td class="colLast"><span class="typeNameLabel">RegionRemoteProcedureBase.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#serverCrashed-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.ServerName-">serverCrashed</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterPr [...]
<a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a> regionNode,
<a href="../../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a> serverName)</code> </td>
</tr>
-<tr class="rowColor">
+<tr class="altColor">
<td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html?is-external=true" title="class or interface in java.util.concurrent">CompletableFuture</a><<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>></code></td>
<td class="colLast"><span class="typeNameLabel">TransitRegionStateProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#serverCrashed-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.ServerName-boolean-">serverCrashed</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/proced [...]
<a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a> regionNode,
<a href="../../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a> serverName,
boolean forceNewPlan)</code> </td>
</tr>
-<tr class="altColor">
+<tr class="rowColor">
<td class="colFirst"><code>private static <a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a></code></td>
<td class="colLast"><span class="typeNameLabel">TransitRegionStateProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#setOwner-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.TransitRegionStateProcedure-">setOwner</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class [...]
<a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a> proc)</code> </td>
</tr>
-<tr class="rowColor">
+<tr class="altColor">
<td class="colFirst"><code>private void</code></td>
<td class="colLast"><span class="typeNameLabel">MergeTableRegionsProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#setRegionStateToMerging-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">setRegionStateToMerging</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedu [...]
<div class="block">Set the region states to MERGING state</div>
</td>
</tr>
-<tr class="altColor">
+<tr class="rowColor">
<td class="colFirst"><code>protected boolean</code></td>
<td class="colLast"><span class="typeNameLabel">RegionRemoteProcedureBase.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#setTimeoutFailure-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">setTimeoutFailure</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProc [...]
</tr>
-<tr class="rowColor">
+<tr class="altColor">
<td class="colFirst"><code>protected boolean</code></td>
<td class="colLast"><span class="typeNameLabel">TransitRegionStateProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#setTimeoutFailure-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">setTimeoutFailure</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">Master [...]
<div class="block">At end of timeout, wake ourselves up so we run again.</div>
</td>
</tr>
-<tr class="altColor">
+<tr class="rowColor">
<td class="colFirst"><code>private <a href="../../../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</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><org.apache.hadoop.fs.Path>,<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><org.apache.hadoop [...]
<td class="colLast"><span class="typeNameLabel">SplitTableRegionProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/SplitTableRegionProcedure.html#splitStoreFiles-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.regionserver.HRegionFileSystem-">splitStoreFiles</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in o [...]
<a href="../../../../../../../org/apache/hadoop/hbase/regionserver/HRegionFileSystem.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionFileSystem</a> regionFs)</code>
<div class="block">Create Split directory</div>
</td>
</tr>
-<tr class="rowColor">
+<tr class="altColor">
<td class="colFirst"><code>protected boolean</code></td>
<td class="colLast"><span class="typeNameLabel">AssignProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/AssignProcedure.html#startTransition-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">startTransition</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop. [...]
<a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a> regionNode)</code>
<div class="block"><span class="deprecatedLabel">Deprecated.</span> </div>
</td>
</tr>
-<tr class="altColor">
+<tr class="rowColor">
<td class="colFirst"><code>protected boolean</code></td>
<td class="colLast"><span class="typeNameLabel">UnassignProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/UnassignProcedure.html#startTransition-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">startTransition</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.had [...]
<a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a> regionNode)</code>
<div class="block"><span class="deprecatedLabel">Deprecated.</span> </div>
</td>
</tr>
-<tr class="rowColor">
+<tr class="altColor">
<td class="colFirst"><code>protected abstract boolean</code></td>
<td class="colLast"><span class="typeNameLabel">RegionTransitionProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionTransitionProcedure.html#startTransition-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">startTransition</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class i [...]
<a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a> regionNode)</code>
<div class="block"><span class="deprecatedLabel">Deprecated.</span> </div>
</td>
</tr>
-<tr class="altColor">
+<tr class="rowColor">
<td class="colFirst"><code>static <a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a></code></td>
<td class="colLast"><span class="typeNameLabel">TransitRegionStateProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#unassign-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.client.RegionInfo-">unassign</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase. [...]
<a href="../../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a> region)</code> </td>
</tr>
-<tr class="rowColor">
+<tr class="altColor">
<td class="colFirst"><code>static <a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a></code></td>
<td class="colLast"><span class="typeNameLabel">TransitRegionStateProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#unassignSplitMerge-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.client.RegionInfo-">unassignSplitMerge</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org. [...]
<a href="../../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a> region)</code> </td>
</tr>
-<tr class="altColor">
+<tr class="rowColor">
<td class="colFirst"><code>private void</code></td>
<td class="colLast"><span class="typeNameLabel">RegionRemoteProcedureBase.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#unattach-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">unattach</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a> [...]
</tr>
-<tr class="rowColor">
+<tr class="altColor">
<td class="colFirst"><code>private void</code></td>
<td class="colLast"><span class="typeNameLabel">SplitTableRegionProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/SplitTableRegionProcedure.html#updateMeta-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">updateMeta</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&n [...]
<div class="block">Add daughter regions to META</div>
</td>
</tr>
-<tr class="altColor">
+<tr class="rowColor">
<td class="colFirst"><code>private void</code></td>
<td class="colLast"><span class="typeNameLabel">MergeTableRegionsProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#updateMetaForMergedRegions-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">updateMetaForMergedRegions</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.p [...]
<div class="block">Add merged region to META and delete original regions.</div>
</td>
</tr>
-<tr class="rowColor">
+<tr class="altColor">
<td class="colFirst"><code>protected boolean</code></td>
<td class="colLast"><span class="typeNameLabel">AssignProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/AssignProcedure.html#updateTransition-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">updateTransition</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoo [...]
<a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a> regionNode)</code>
<div class="block"><span class="deprecatedLabel">Deprecated.</span> </div>
</td>
</tr>
-<tr class="altColor">
+<tr class="rowColor">
<td class="colFirst"><code>protected boolean</code></td>
<td class="colLast"><span class="typeNameLabel">UnassignProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/UnassignProcedure.html#updateTransition-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">updateTransition</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.h [...]
<a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a> regionNode)</code>
<div class="block"><span class="deprecatedLabel">Deprecated.</span> </div>
</td>
</tr>
-<tr class="rowColor">
+<tr class="altColor">
<td class="colFirst"><code>protected abstract boolean</code></td>
<td class="colLast"><span class="typeNameLabel">RegionTransitionProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionTransitionProcedure.html#updateTransition-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">updateTransition</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class [...]
<a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a> regionNode)</code>
<div class="block"><span class="deprecatedLabel">Deprecated.</span> </div>
</td>
</tr>
-<tr class="altColor">
+<tr class="rowColor">
<td class="colFirst"><code>protected void</code></td>
<td class="colLast"><span class="typeNameLabel">OpenRegionProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html#updateTransitionWithoutPersistingToMeta-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">updateTr [...]
<a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a> regionNode,
org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode transitionCode,
long openSeqNum)</code> </td>
</tr>
-<tr class="rowColor">
+<tr class="altColor">
<td class="colFirst"><code>protected abstract void</code></td>
<td class="colLast"><span class="typeNameLabel">RegionRemoteProcedureBase.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#updateTransitionWithoutPersistingToMeta-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-lon [...]
<a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a> regionNode,
org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode transitionCode,
long seqId)</code> </td>
</tr>
-<tr class="altColor">
+<tr class="rowColor">
<td class="colFirst"><code>protected void</code></td>
<td class="colLast"><span class="typeNameLabel">CloseRegionProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.html#updateTransitionWithoutPersistingToMeta-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">update [...]
<a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a> regionNode,
org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode transitionCode,
long seqId)</code> </td>
</tr>
-<tr class="rowColor">
+<tr class="altColor">
<td class="colFirst"><code>protected boolean</code></td>
<td class="colLast"><span class="typeNameLabel">RegionRemoteProcedureBase.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#waitInitialized-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">waitInitialized</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedur [...]
</tr>
-<tr class="altColor">
+<tr class="rowColor">
<td class="colFirst"><code>protected boolean</code></td>
<td class="colLast"><span class="typeNameLabel">TransitRegionStateProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#waitInitialized-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">waitInitialized</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProc [...]
</tr>
-<tr class="rowColor">
+<tr class="altColor">
<td class="colFirst"><code>private void</code></td>
<td class="colLast"><span class="typeNameLabel">MergeTableRegionsProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#writeMaxSequenceIdFile-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">writeMaxSequenceIdFile</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure [...]
</tr>
-<tr class="altColor">
+<tr class="rowColor">
<td class="colFirst"><code>private void</code></td>
<td class="colLast"><span class="typeNameLabel">SplitTableRegionProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/SplitTableRegionProcedure.html#writeMaxSequenceIdFile-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">writeMaxSequenceIdFile</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure"> [...]
</tr>
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 241601d331e..cdda1ab0094 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
@@ -235,10 +235,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><E> (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><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
<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/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/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/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/TableProcedureInterface.TableOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">TableProcedureInterface.TableOperationType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/PeerProcedureInterface.PeerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">PeerProcedureInterface.PeerOperationType</span></a></li>
</ul>
</li>
</ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/package-tree.html b/devapidocs/org/apache/hadoop/hbase/package-tree.html
index c0e1707b90b..3db4491401c 100644
--- a/devapidocs/org/apache/hadoop/hbase/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/package-tree.html
@@ -493,22 +493,22 @@
<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><E> (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><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
<ul>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Coprocessor.State.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Coprocessor.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/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/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/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/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/MetaRegionLocationCache.ZNodeOpType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MetaRegionLocationCache.ZNodeOpType</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/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/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/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/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/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/ClientMetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ClientMetaTableAccessor.QueryType</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/ServerTask.State.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ServerTask.State</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/ClientMetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ClientMetaTableAccessor.QueryType</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/CatalogReplicaMode.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CatalogReplicaMode</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/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/ServerTask.State.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ServerTask.State</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/KeepDeletedCells.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeepDeletedCells</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 b40460bdf4c..8d0f5137efc 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
@@ -218,11 +218,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><E> (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><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
<ul>
-<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.LockState.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">Procedure.LockState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/RootProcedureState.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">RootProcedureState.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/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/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/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/RootProcedureState.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">RootProcedureState.State</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 22adf2e98f9..28218cb9369 100644
--- a/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
@@ -241,12 +241,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><E> (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><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
<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/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/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/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/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/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/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/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/SpaceViolationPolicy.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">SpaceViolationPolicy</span></a></li>
</ul>
</li>
</ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html b/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
index 78069e6c965..cf8597dab32 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -752,21 +752,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><E> (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><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
<ul>
-<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/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/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/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/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/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/ReadPointCalculationLock.LockType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ReadPointCalculationLock.LockType</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/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/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/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/ReadPointCalculationLock.LockType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ReadPointCalculationLock.LockType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/SplitLogWorker.TaskExecutor.Status.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">SplitLogWorker.TaskExecutor.Status</span></a></li>
<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.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/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/CompactingMemStore.IndexType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">CompactingMemStore.IndexType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MemStoreCompactionStrategy.Action</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">HRegion.FlushResult.Result</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.NextState.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScannerContext.NextState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/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/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/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">HRegion.FlushResult.Result</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 1b57548216e..38e6dc8e7cb 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><E> (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><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
<ul>
+<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>
<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>
</ul>
</li>
</ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/storefiletracker/package-tree.html b/devapidocs/org/apache/hadoop/hbase/regionserver/storefiletracker/package-tree.html
index edf5f6d8fdd..61de594ea43 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/storefiletracker/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/storefiletracker/package-tree.html
@@ -132,8 +132,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><E> (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><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
<ul>
-<li type="circle">org.apache.hadoop.hbase.regionserver.storefiletracker.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/storefiletracker/ModifyStoreFileTrackerProcedure.StoreFileTrackerState.html" title="enum in org.apache.hadoop.hbase.regionserver.storefiletracker"><span class="typeNameLink">ModifyStoreFileTrackerProcedure.StoreFileTrackerState</span></a></li>
<li type="circle">org.apache.hadoop.hbase.regionserver.storefiletracker.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/storefiletracker/StoreFileTrackerFactory.Trackers.html" title="enum in org.apache.hadoop.hbase.regionserver.storefiletracker"><span class="typeNameLink">StoreFileTrackerFactory.Trackers</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.storefiletracker.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/storefiletracker/ModifyStoreFileTrackerProcedure.StoreFileTrackerState.html" title="enum in org.apache.hadoop.hbase.regionserver.storefiletracker"><span class="typeNameLink">ModifyStoreFileTrackerProcedure.StoreFileTrackerState</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 5cfe51b77f6..071c59880a8 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
@@ -250,10 +250,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><E> (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><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
<ul>
-<li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/RingBufferTruck.Type.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">RingBufferTruck.Type</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/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/WALEventTrackerListener.WalState.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">WALEventTrackerListener.WalState</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/WALEventTrackerListener.WalState.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">WALEventTrackerListener.WalState</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>
+<li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/RingBufferTruck.Type.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">RingBufferTruck.Type</span></a></li>
</ul>
</li>
</ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/replication/package-tree.html b/devapidocs/org/apache/hadoop/hbase/replication/package-tree.html
index 805cba12402..545c5cedc42 100644
--- a/devapidocs/org/apache/hadoop/hbase/replication/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/replication/package-tree.html
@@ -187,9 +187,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><E> (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><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
<ul>
+<li type="circle">org.apache.hadoop.hbase.replication.<a href="../../../../../org/apache/hadoop/hbase/replication/ReplicationPeer.PeerState.html" title="enum in org.apache.hadoop.hbase.replication"><span class="typeNameLink">ReplicationPeer.PeerState</span></a></li>
<li type="circle">org.apache.hadoop.hbase.replication.<a href="../../../../../org/apache/hadoop/hbase/replication/SyncReplicationState.html" title="enum in org.apache.hadoop.hbase.replication"><span class="typeNameLink">SyncReplicationState</span></a></li>
<li type="circle">org.apache.hadoop.hbase.replication.<a href="../../../../../org/apache/hadoop/hbase/replication/ReplicationPeerStorageType.html" title="enum in org.apache.hadoop.hbase.replication"><span class="typeNameLink">ReplicationPeerStorageType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.replication.<a href="../../../../../org/apache/hadoop/hbase/replication/ReplicationPeer.PeerState.html" title="enum in org.apache.hadoop.hbase.replication"><span class="typeNameLink">ReplicationPeer.PeerState</span></a></li>
</ul>
</li>
</ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html b/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html
index 93dcf0aa94b..195ec954005 100644
--- a/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html
@@ -217,9 +217,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><E> (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><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
<ul>
-<li type="circle">org.apache.hadoop.hbase.replication.regionserver.<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.WorkerState.html" title="enum in org.apache.hadoop.hbase.replication.regionserver"><span class="typeNameLink">ReplicationSourceShipper.WorkerState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.replication.regionserver.<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/WALEntryStream.HasNext.html" title="enum in org.apache.hadoop.hbase.replication.regionserver"><span class="typeNameLink">WALEntryStream.HasNext</span></a></li>
<li type="circle">org.apache.hadoop.hbase.replication.regionserver.<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceFactoryImpl.SourceHolder.html" title="enum in org.apache.hadoop.hbase.replication.regionserver"><span class="typeNameLink">MetricsReplicationSourceFactoryImpl.SourceHolder</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.replication.regionserver.<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/WALEntryStream.HasNext.html" title="enum in org.apache.hadoop.hbase.replication.regionserver"><span class="typeNameLink">WALEntryStream.HasNext</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.replication.regionserver.<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.WorkerState.html" title="enum in org.apache.hadoop.hbase.replication.regionserver"><span class="typeNameLink">ReplicationSourceShipper.WorkerState</span></a></li>
</ul>
</li>
</ul>
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 ca0bffa94a7..17459af0f41 100644
--- a/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
@@ -162,11 +162,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><E> (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><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
<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/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/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/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.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/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/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/Permission.Action.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">Permission.Action</span></a></li>
<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">AccessController.OpType</span></a></li>
</ul>
</li>
diff --git a/devapidocs/org/apache/hadoop/hbase/security/package-tree.html b/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
index 8218e4901e3..16e9bd48673 100644
--- a/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
@@ -196,9 +196,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><E> (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><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
<ul>
+<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/SaslStatus.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">SaslStatus</span></a></li>
<li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/AuthMethod.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">AuthMethod</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslUtil.QualityOfProtection.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">SaslUtil.QualityOfProtection</span></a></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 9d8592a335e..a506104c149 100644
--- a/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
@@ -211,9 +211,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><E> (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><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
<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/trace/package-tree.html b/devapidocs/org/apache/hadoop/hbase/trace/package-tree.html
index f584fb089d2..8be234df028 100644
--- a/devapidocs/org/apache/hadoop/hbase/trace/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/trace/package-tree.html
@@ -98,8 +98,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><E> (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><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
<ul>
<li type="circle">org.apache.hadoop.hbase.trace.<a href="../../../../../org/apache/hadoop/hbase/trace/HBaseSemanticAttributes.RpcSystem.html" title="enum in org.apache.hadoop.hbase.trace"><span class="typeNameLink">HBaseSemanticAttributes.RpcSystem</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.trace.<a href="../../../../../org/apache/hadoop/hbase/trace/HBaseSemanticAttributes.Operation.html" title="enum in org.apache.hadoop.hbase.trace"><span class="typeNameLink">HBaseSemanticAttributes.Operation</span></a></li>
<li type="circle">org.apache.hadoop.hbase.trace.<a href="../../../../../org/apache/hadoop/hbase/trace/HBaseSemanticAttributes.ReadType.html" title="enum in org.apache.hadoop.hbase.trace"><span class="typeNameLink">HBaseSemanticAttributes.ReadType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.trace.<a href="../../../../../org/apache/hadoop/hbase/trace/HBaseSemanticAttributes.Operation.html" title="enum in org.apache.hadoop.hbase.trace"><span class="typeNameLink">HBaseSemanticAttributes.Operation</span></a></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 a09f6476b46..05a39c2e125 100644
--- a/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
@@ -556,14 +556,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><E> (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><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
<ul>
-<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/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/IdReadWriteLockWithObjectPool.ReferenceType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">IdReadWriteLockWithObjectPool.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><T>)</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/DNS.ServerType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">DNS.ServerType</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/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/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/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/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><T>)</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><T>)</li>
</ul>
</li>
diff --git a/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html b/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html
index ac7ebb436a0..a7f420ccf25 100644
--- a/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html
@@ -200,9 +200,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><E> (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><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
<ul>
+<li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/WALTailingReader.State.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">WALTailingReader.State</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>
-<li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/WALTailingReader.State.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">WALTailingReader.State</span></a></li>
</ul>
</li>
</ul>
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.BufferedEncodedSeeker.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.BufferedEncodedSeeker.html
index 5cdb93fd392..819724d6731 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.BufferedEncodedSeeker.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.BufferedEncodedSeeker.html
@@ -842,436 +842,440 @@
<span class="sourceLineNo">834</span> public void setCurrentBuffer(ByteBuff buffer) {<a name="line.834"></a>
<span class="sourceLineNo">835</span> if (this.tagCompressionContext != null) {<a name="line.835"></a>
<span class="sourceLineNo">836</span> this.tagCompressionContext.clear();<a name="line.836"></a>
-<span class="sourceLineNo">837</span> }<a name="line.837"></a>
-<span class="sourceLineNo">838</span> currentBuffer = buffer;<a name="line.838"></a>
-<span class="sourceLineNo">839</span> current.currentBuffer = currentBuffer;<a name="line.839"></a>
-<span class="sourceLineNo">840</span> if (tagCompressionContext != null) {<a name="line.840"></a>
-<span class="sourceLineNo">841</span> current.tagCompressionContext = tagCompressionContext;<a name="line.841"></a>
-<span class="sourceLineNo">842</span> }<a name="line.842"></a>
-<span class="sourceLineNo">843</span> decodeFirst();<a name="line.843"></a>
-<span class="sourceLineNo">844</span> current.setKey(current.keyBuffer, current.memstoreTS);<a name="line.844"></a>
-<span class="sourceLineNo">845</span> previous.invalidate();<a name="line.845"></a>
-<span class="sourceLineNo">846</span> }<a name="line.846"></a>
-<span class="sourceLineNo">847</span><a name="line.847"></a>
-<span class="sourceLineNo">848</span> @Override<a name="line.848"></a>
-<span class="sourceLineNo">849</span> public Cell getKey() {<a name="line.849"></a>
-<span class="sourceLineNo">850</span> byte[] key = new byte[current.keyLength];<a name="line.850"></a>
-<span class="sourceLineNo">851</span> System.arraycopy(current.keyBuffer, 0, key, 0, current.keyLength);<a name="line.851"></a>
-<span class="sourceLineNo">852</span> return new KeyValue.KeyOnlyKeyValue(key);<a name="line.852"></a>
+<span class="sourceLineNo">837</span><a name="line.837"></a>
+<span class="sourceLineNo">838</span> // Prior seekToKeyInBlock may have reset this to false if we fell back to previous<a name="line.838"></a>
+<span class="sourceLineNo">839</span> // seeker state. This is an optimization so we don't have to uncompress tags again when<a name="line.839"></a>
+<span class="sourceLineNo">840</span> // reading last state.<a name="line.840"></a>
+<span class="sourceLineNo">841</span> // In seekBefore flow, if block change happens then rewind is not called and<a name="line.841"></a>
+<span class="sourceLineNo">842</span> // setCurrentBuffer is called, so need to uncompress any tags we see.<a name="line.842"></a>
+<span class="sourceLineNo">843</span> current.uncompressTags = true;<a name="line.843"></a>
+<span class="sourceLineNo">844</span> }<a name="line.844"></a>
+<span class="sourceLineNo">845</span> currentBuffer = buffer;<a name="line.845"></a>
+<span class="sourceLineNo">846</span> current.currentBuffer = currentBuffer;<a name="line.846"></a>
+<span class="sourceLineNo">847</span> if (tagCompressionContext != null) {<a name="line.847"></a>
+<span class="sourceLineNo">848</span> current.tagCompressionContext = tagCompressionContext;<a name="line.848"></a>
+<span class="sourceLineNo">849</span> }<a name="line.849"></a>
+<span class="sourceLineNo">850</span> decodeFirst();<a name="line.850"></a>
+<span class="sourceLineNo">851</span> current.setKey(current.keyBuffer, current.memstoreTS);<a name="line.851"></a>
+<span class="sourceLineNo">852</span> previous.invalidate();<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> @Override<a name="line.855"></a>
-<span class="sourceLineNo">856</span> public ByteBuffer getValueShallowCopy() {<a name="line.856"></a>
-<span class="sourceLineNo">857</span> currentBuffer.asSubByteBuffer(current.valueOffset, current.valueLength, tmpPair);<a name="line.857"></a>
-<span class="sourceLineNo">858</span> ByteBuffer dup = tmpPair.getFirst().duplicate();<a name="line.858"></a>
-<span class="sourceLineNo">859</span> dup.position(tmpPair.getSecond());<a name="line.859"></a>
-<span class="sourceLineNo">860</span> dup.limit(tmpPair.getSecond() + current.valueLength);<a name="line.860"></a>
-<span class="sourceLineNo">861</span> return dup.slice();<a name="line.861"></a>
-<span class="sourceLineNo">862</span> }<a name="line.862"></a>
-<span class="sourceLineNo">863</span><a name="line.863"></a>
-<span class="sourceLineNo">864</span> @Override<a name="line.864"></a>
-<span class="sourceLineNo">865</span> public Cell getCell() {<a name="line.865"></a>
-<span class="sourceLineNo">866</span> return current.toCell();<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> @Override<a name="line.869"></a>
-<span class="sourceLineNo">870</span> public void rewind() {<a name="line.870"></a>
-<span class="sourceLineNo">871</span> currentBuffer.rewind();<a name="line.871"></a>
-<span class="sourceLineNo">872</span> if (tagCompressionContext != null) {<a name="line.872"></a>
-<span class="sourceLineNo">873</span> tagCompressionContext.clear();<a name="line.873"></a>
-<span class="sourceLineNo">874</span> // Prior seekToKeyInBlock may have reset this to false if we fell back to previous<a name="line.874"></a>
-<span class="sourceLineNo">875</span> // seeker state. This is an optimization so we don't have to uncompress tags again when<a name="line.875"></a>
-<span class="sourceLineNo">876</span> // reading last state.<a name="line.876"></a>
-<span class="sourceLineNo">877</span> // In case of rewind, we are starting from the beginning of the buffer, so we need<a name="line.877"></a>
-<span class="sourceLineNo">878</span> // to uncompress any tags we see.<a name="line.878"></a>
-<span class="sourceLineNo">879</span> // It may make sense to reset this in setCurrentBuffer as well, but we seem to only call<a name="line.879"></a>
-<span class="sourceLineNo">880</span> // setCurrentBuffer after StoreFileScanner.seekAtOrAfter which calls next to consume the<a name="line.880"></a>
-<span class="sourceLineNo">881</span> // seeker state. Rewind is called by seekBefore, which doesn't and leaves us in this state.<a name="line.881"></a>
-<span class="sourceLineNo">882</span> current.uncompressTags = true;<a name="line.882"></a>
-<span class="sourceLineNo">883</span> }<a name="line.883"></a>
-<span class="sourceLineNo">884</span> decodeFirst();<a name="line.884"></a>
-<span class="sourceLineNo">885</span> current.setKey(current.keyBuffer, current.memstoreTS);<a name="line.885"></a>
-<span class="sourceLineNo">886</span> previous.invalidate();<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>
-<span class="sourceLineNo">889</span> @Override<a name="line.889"></a>
-<span class="sourceLineNo">890</span> public boolean next() {<a name="line.890"></a>
-<span class="sourceLineNo">891</span> if (!currentBuffer.hasRemaining()) {<a name="line.891"></a>
-<span class="sourceLineNo">892</span> return false;<a name="line.892"></a>
-<span class="sourceLineNo">893</span> }<a name="line.893"></a>
-<span class="sourceLineNo">894</span> decodeNext();<a name="line.894"></a>
-<span class="sourceLineNo">895</span> current.setKey(current.keyBuffer, current.memstoreTS);<a name="line.895"></a>
-<span class="sourceLineNo">896</span> previous.invalidate();<a name="line.896"></a>
-<span class="sourceLineNo">897</span> return true;<a name="line.897"></a>
-<span class="sourceLineNo">898</span> }<a name="line.898"></a>
-<span class="sourceLineNo">899</span><a name="line.899"></a>
-<span class="sourceLineNo">900</span> protected void decodeTags() {<a name="line.900"></a>
-<span class="sourceLineNo">901</span> current.tagsLength = ByteBuff.readCompressedInt(currentBuffer);<a name="line.901"></a>
-<span class="sourceLineNo">902</span> if (tagCompressionContext != null) {<a name="line.902"></a>
-<span class="sourceLineNo">903</span> if (current.uncompressTags) {<a name="line.903"></a>
-<span class="sourceLineNo">904</span> // Tag compression is been used. uncompress it into tagsBuffer<a name="line.904"></a>
-<span class="sourceLineNo">905</span> current.ensureSpaceForTags();<a name="line.905"></a>
-<span class="sourceLineNo">906</span> try {<a name="line.906"></a>
-<span class="sourceLineNo">907</span> current.tagsCompressedLength = tagCompressionContext.uncompressTags(currentBuffer,<a name="line.907"></a>
-<span class="sourceLineNo">908</span> current.tagsBuffer, 0, current.tagsLength);<a name="line.908"></a>
-<span class="sourceLineNo">909</span> } catch (Exception e) {<a name="line.909"></a>
-<span class="sourceLineNo">910</span> throw new RuntimeException("Exception while uncompressing tags", e);<a name="line.910"></a>
-<span class="sourceLineNo">911</span> }<a name="line.911"></a>
-<span class="sourceLineNo">912</span> } else {<a name="line.912"></a>
-<span class="sourceLineNo">913</span> currentBuffer.skip(current.tagsCompressedLength);<a name="line.913"></a>
-<span class="sourceLineNo">914</span> current.uncompressTags = true;// Reset this.<a name="line.914"></a>
-<span class="sourceLineNo">915</span> }<a name="line.915"></a>
-<span class="sourceLineNo">916</span> current.tagsOffset = -1;<a name="line.916"></a>
-<span class="sourceLineNo">917</span> } else {<a name="line.917"></a>
-<span class="sourceLineNo">918</span> // When tag compress is not used, let us not do copying of tags bytes into tagsBuffer.<a name="line.918"></a>
-<span class="sourceLineNo">919</span> // Just mark the tags Offset so as to create the KV buffer later in getKeyValueBuffer()<a name="line.919"></a>
-<span class="sourceLineNo">920</span> current.tagsOffset = currentBuffer.position();<a name="line.920"></a>
-<span class="sourceLineNo">921</span> currentBuffer.skip(current.tagsLength);<a name="line.921"></a>
-<span class="sourceLineNo">922</span> }<a name="line.922"></a>
-<span class="sourceLineNo">923</span> }<a name="line.923"></a>
-<span class="sourceLineNo">924</span><a name="line.924"></a>
-<span class="sourceLineNo">925</span> @Override<a name="line.925"></a>
-<span class="sourceLineNo">926</span> public int seekToKeyInBlock(Cell seekCell, boolean seekBefore) {<a name="line.926"></a>
-<span class="sourceLineNo">927</span> int rowCommonPrefix = 0;<a name="line.927"></a>
-<span class="sourceLineNo">928</span> int familyCommonPrefix = 0;<a name="line.928"></a>
-<span class="sourceLineNo">929</span> int qualCommonPrefix = 0;<a name="line.929"></a>
-<span class="sourceLineNo">930</span> previous.invalidate();<a name="line.930"></a>
-<span class="sourceLineNo">931</span> do {<a name="line.931"></a>
-<span class="sourceLineNo">932</span> int comp;<a name="line.932"></a>
-<span class="sourceLineNo">933</span> keyOnlyKV.setKey(current.keyBuffer, 0, current.keyLength);<a name="line.933"></a>
-<span class="sourceLineNo">934</span> if (current.lastCommonPrefix != 0) {<a name="line.934"></a>
-<span class="sourceLineNo">935</span> // The KV format has row key length also in the byte array. The<a name="line.935"></a>
-<span class="sourceLineNo">936</span> // common prefix<a name="line.936"></a>
-<span class="sourceLineNo">937</span> // includes it. So we need to subtract to find out the common prefix<a name="line.937"></a>
-<span class="sourceLineNo">938</span> // in the<a name="line.938"></a>
-<span class="sourceLineNo">939</span> // row part alone<a name="line.939"></a>
-<span class="sourceLineNo">940</span> rowCommonPrefix = Math.min(rowCommonPrefix, current.lastCommonPrefix - 2);<a name="line.940"></a>
-<span class="sourceLineNo">941</span> }<a name="line.941"></a>
-<span class="sourceLineNo">942</span> if (current.lastCommonPrefix <= 2) {<a name="line.942"></a>
-<span class="sourceLineNo">943</span> rowCommonPrefix = 0;<a name="line.943"></a>
-<span class="sourceLineNo">944</span> }<a name="line.944"></a>
-<span class="sourceLineNo">945</span> rowCommonPrefix += findCommonPrefixInRowPart(seekCell, keyOnlyKV, rowCommonPrefix);<a name="line.945"></a>
-<span class="sourceLineNo">946</span> comp = compareCommonRowPrefix(seekCell, keyOnlyKV, rowCommonPrefix);<a name="line.946"></a>
-<span class="sourceLineNo">947</span> if (comp == 0) {<a name="line.947"></a>
-<span class="sourceLineNo">948</span> comp = compareTypeBytes(seekCell, keyOnlyKV);<a name="line.948"></a>
-<span class="sourceLineNo">949</span> if (comp == 0) {<a name="line.949"></a>
-<span class="sourceLineNo">950</span> // Subtract the fixed row key length and the family key fixed length<a name="line.950"></a>
-<span class="sourceLineNo">951</span> familyCommonPrefix = Math.max(0, Math.min(familyCommonPrefix,<a name="line.951"></a>
-<span class="sourceLineNo">952</span> current.lastCommonPrefix - (3 + keyOnlyKV.getRowLength())));<a name="line.952"></a>
-<span class="sourceLineNo">953</span> familyCommonPrefix +=<a name="line.953"></a>
-<span class="sourceLineNo">954</span> findCommonPrefixInFamilyPart(seekCell, keyOnlyKV, familyCommonPrefix);<a name="line.954"></a>
-<span class="sourceLineNo">955</span> comp = compareCommonFamilyPrefix(seekCell, keyOnlyKV, familyCommonPrefix);<a name="line.955"></a>
-<span class="sourceLineNo">956</span> if (comp == 0) {<a name="line.956"></a>
-<span class="sourceLineNo">957</span> // subtract the rowkey fixed length and the family key fixed<a name="line.957"></a>
-<span class="sourceLineNo">958</span> // length<a name="line.958"></a>
-<span class="sourceLineNo">959</span> qualCommonPrefix = Math.max(0, Math.min(qualCommonPrefix, current.lastCommonPrefix<a name="line.959"></a>
-<span class="sourceLineNo">960</span> - (3 + keyOnlyKV.getRowLength() + keyOnlyKV.getFamilyLength())));<a name="line.960"></a>
-<span class="sourceLineNo">961</span> qualCommonPrefix +=<a name="line.961"></a>
-<span class="sourceLineNo">962</span> findCommonPrefixInQualifierPart(seekCell, keyOnlyKV, qualCommonPrefix);<a name="line.962"></a>
-<span class="sourceLineNo">963</span> comp = compareCommonQualifierPrefix(seekCell, keyOnlyKV, qualCommonPrefix);<a name="line.963"></a>
-<span class="sourceLineNo">964</span> if (comp == 0) {<a name="line.964"></a>
-<span class="sourceLineNo">965</span> comp = CellComparator.getInstance().compareTimestamps(seekCell, keyOnlyKV);<a name="line.965"></a>
-<span class="sourceLineNo">966</span> if (comp == 0) {<a name="line.966"></a>
-<span class="sourceLineNo">967</span> // Compare types. Let the delete types sort ahead of puts;<a name="line.967"></a>
-<span class="sourceLineNo">968</span> // i.e. types<a name="line.968"></a>
-<span class="sourceLineNo">969</span> // of higher numbers sort before those of lesser numbers.<a name="line.969"></a>
-<span class="sourceLineNo">970</span> // Maximum<a name="line.970"></a>
-<span class="sourceLineNo">971</span> // (255)<a name="line.971"></a>
-<span class="sourceLineNo">972</span> // appears ahead of everything, and minimum (0) appears<a name="line.972"></a>
-<span class="sourceLineNo">973</span> // after<a name="line.973"></a>
-<span class="sourceLineNo">974</span> // everything.<a name="line.974"></a>
-<span class="sourceLineNo">975</span> comp = (0xff & keyOnlyKV.getTypeByte()) - (0xff & seekCell.getTypeByte());<a name="line.975"></a>
-<span class="sourceLineNo">976</span> }<a name="line.976"></a>
-<span class="sourceLineNo">977</span> }<a name="line.977"></a>
-<span class="sourceLineNo">978</span> }<a name="line.978"></a>
-<span class="sourceLineNo">979</span> }<a name="line.979"></a>
-<span class="sourceLineNo">980</span> }<a name="line.980"></a>
-<span class="sourceLineNo">981</span> if (comp == 0) { // exact match<a name="line.981"></a>
-<span class="sourceLineNo">982</span> if (seekBefore) {<a name="line.982"></a>
-<span class="sourceLineNo">983</span> if (!previous.isValid()) {<a name="line.983"></a>
-<span class="sourceLineNo">984</span> // The caller (seekBefore) has to ensure that we are not at the<a name="line.984"></a>
-<span class="sourceLineNo">985</span> // first key in the block.<a name="line.985"></a>
-<span class="sourceLineNo">986</span> throw new IllegalStateException(<a name="line.986"></a>
-<span class="sourceLineNo">987</span> "Cannot seekBefore if " + "positioned at the first key in the block: key="<a name="line.987"></a>
-<span class="sourceLineNo">988</span> + Bytes.toStringBinary(seekCell.getRowArray()));<a name="line.988"></a>
-<span class="sourceLineNo">989</span> }<a name="line.989"></a>
-<span class="sourceLineNo">990</span> moveToPrevious();<a name="line.990"></a>
-<span class="sourceLineNo">991</span> return 1;<a name="line.991"></a>
-<span class="sourceLineNo">992</span> }<a name="line.992"></a>
-<span class="sourceLineNo">993</span> return 0;<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> if (comp < 0) { // already too large, check previous<a name="line.996"></a>
-<span class="sourceLineNo">997</span> if (previous.isValid()) {<a name="line.997"></a>
-<span class="sourceLineNo">998</span> moveToPrevious();<a name="line.998"></a>
-<span class="sourceLineNo">999</span> } else {<a name="line.999"></a>
-<span class="sourceLineNo">1000</span> return HConstants.INDEX_KEY_MAGIC; // using optimized index key<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span> }<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span> return 1;<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span> }<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span><a name="line.1004"></a>
-<span class="sourceLineNo">1005</span> // move to next, if more data is available<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span> if (currentBuffer.hasRemaining()) {<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span> previous.copyFromNext(current);<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span> decodeNext();<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span> current.setKey(current.keyBuffer, current.memstoreTS);<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span> } else {<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span> break;<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span> }<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span> } while (true);<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span><a name="line.1014"></a>
-<span class="sourceLineNo">1015</span> // we hit the end of the block, not an exact match<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span> return 1;<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span> }<a name="line.1017"></a>
+<span class="sourceLineNo">856</span> public Cell getKey() {<a name="line.856"></a>
+<span class="sourceLineNo">857</span> byte[] key = new byte[current.keyLength];<a name="line.857"></a>
+<span class="sourceLineNo">858</span> System.arraycopy(current.keyBuffer, 0, key, 0, current.keyLength);<a name="line.858"></a>
+<span class="sourceLineNo">859</span> return new KeyValue.KeyOnlyKeyValue(key);<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> @Override<a name="line.862"></a>
+<span class="sourceLineNo">863</span> public ByteBuffer getValueShallowCopy() {<a name="line.863"></a>
+<span class="sourceLineNo">864</span> currentBuffer.asSubByteBuffer(current.valueOffset, current.valueLength, tmpPair);<a name="line.864"></a>
+<span class="sourceLineNo">865</span> ByteBuffer dup = tmpPair.getFirst().duplicate();<a name="line.865"></a>
+<span class="sourceLineNo">866</span> dup.position(tmpPair.getSecond());<a name="line.866"></a>
+<span class="sourceLineNo">867</span> dup.limit(tmpPair.getSecond() + current.valueLength);<a name="line.867"></a>
+<span class="sourceLineNo">868</span> return dup.slice();<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">871</span> @Override<a name="line.871"></a>
+<span class="sourceLineNo">872</span> public Cell getCell() {<a name="line.872"></a>
+<span class="sourceLineNo">873</span> return current.toCell();<a name="line.873"></a>
+<span class="sourceLineNo">874</span> }<a name="line.874"></a>
+<span class="sourceLineNo">875</span><a name="line.875"></a>
+<span class="sourceLineNo">876</span> @Override<a name="line.876"></a>
+<span class="sourceLineNo">877</span> public void rewind() {<a name="line.877"></a>
+<span class="sourceLineNo">878</span> currentBuffer.rewind();<a name="line.878"></a>
+<span class="sourceLineNo">879</span> if (tagCompressionContext != null) {<a name="line.879"></a>
+<span class="sourceLineNo">880</span> tagCompressionContext.clear();<a name="line.880"></a>
+<span class="sourceLineNo">881</span> // Prior seekToKeyInBlock may have reset this to false if we fell back to previous<a name="line.881"></a>
+<span class="sourceLineNo">882</span> // seeker state. This is an optimization so we don't have to uncompress tags again when<a name="line.882"></a>
+<span class="sourceLineNo">883</span> // reading last state.<a name="line.883"></a>
+<span class="sourceLineNo">884</span> // In case of rewind, we are starting from the beginning of the buffer, so we need<a name="line.884"></a>
+<span class="sourceLineNo">885</span> // to uncompress any tags we see.<a name="line.885"></a>
+<span class="sourceLineNo">886</span> current.uncompressTags = true;<a name="line.886"></a>
+<span class="sourceLineNo">887</span> }<a name="line.887"></a>
+<span class="sourceLineNo">888</span> decodeFirst();<a name="line.888"></a>
+<span class="sourceLineNo">889</span> current.setKey(current.keyBuffer, current.memstoreTS);<a name="line.889"></a>
+<span class="sourceLineNo">890</span> previous.invalidate();<a name="line.890"></a>
+<span class="sourceLineNo">891</span> }<a name="line.891"></a>
+<span class="sourceLineNo">892</span><a name="line.892"></a>
+<span class="sourceLineNo">893</span> @Override<a name="line.893"></a>
+<span class="sourceLineNo">894</span> public boolean next() {<a name="line.894"></a>
+<span class="sourceLineNo">895</span> if (!currentBuffer.hasRemaining()) {<a name="line.895"></a>
+<span class="sourceLineNo">896</span> return false;<a name="line.896"></a>
+<span class="sourceLineNo">897</span> }<a name="line.897"></a>
+<span class="sourceLineNo">898</span> decodeNext();<a name="line.898"></a>
+<span class="sourceLineNo">899</span> current.setKey(current.keyBuffer, current.memstoreTS);<a name="line.899"></a>
+<span class="sourceLineNo">900</span> previous.invalidate();<a name="line.900"></a>
+<span class="sourceLineNo">901</span> return true;<a name="line.901"></a>
+<span class="sourceLineNo">902</span> }<a name="line.902"></a>
+<span class="sourceLineNo">903</span><a name="line.903"></a>
+<span class="sourceLineNo">904</span> protected void decodeTags() {<a name="line.904"></a>
+<span class="sourceLineNo">905</span> current.tagsLength = ByteBuff.readCompressedInt(currentBuffer);<a name="line.905"></a>
+<span class="sourceLineNo">906</span> if (tagCompressionContext != null) {<a name="line.906"></a>
+<span class="sourceLineNo">907</span> if (current.uncompressTags) {<a name="line.907"></a>
+<span class="sourceLineNo">908</span> // Tag compression is been used. uncompress it into tagsBuffer<a name="line.908"></a>
+<span class="sourceLineNo">909</span> current.ensureSpaceForTags();<a name="line.909"></a>
+<span class="sourceLineNo">910</span> try {<a name="line.910"></a>
+<span class="sourceLineNo">911</span> current.tagsCompressedLength = tagCompressionContext.uncompressTags(currentBuffer,<a name="line.911"></a>
+<span class="sourceLineNo">912</span> current.tagsBuffer, 0, current.tagsLength);<a name="line.912"></a>
+<span class="sourceLineNo">913</span> } catch (Exception e) {<a name="line.913"></a>
+<span class="sourceLineNo">914</span> throw new RuntimeException("Exception while uncompressing tags", e);<a name="line.914"></a>
+<span class="sourceLineNo">915</span> }<a name="line.915"></a>
+<span class="sourceLineNo">916</span> } else {<a name="line.916"></a>
+<span class="sourceLineNo">917</span> currentBuffer.skip(current.tagsCompressedLength);<a name="line.917"></a>
+<span class="sourceLineNo">918</span> current.uncompressTags = true;// Reset this.<a name="line.918"></a>
+<span class="sourceLineNo">919</span> }<a name="line.919"></a>
+<span class="sourceLineNo">920</span> current.tagsOffset = -1;<a name="line.920"></a>
+<span class="sourceLineNo">921</span> } else {<a name="line.921"></a>
+<span class="sourceLineNo">922</span> // When tag compress is not used, let us not do copying of tags bytes into tagsBuffer.<a name="line.922"></a>
+<span class="sourceLineNo">923</span> // Just mark the tags Offset so as to create the KV buffer later in getKeyValueBuffer()<a name="line.923"></a>
+<span class="sourceLineNo">924</span> current.tagsOffset = currentBuffer.position();<a name="line.924"></a>
+<span class="sourceLineNo">925</span> currentBuffer.skip(current.tagsLength);<a name="line.925"></a>
+<span class="sourceLineNo">926</span> }<a name="line.926"></a>
+<span class="sourceLineNo">927</span> }<a name="line.927"></a>
+<span class="sourceLineNo">928</span><a name="line.928"></a>
+<span class="sourceLineNo">929</span> @Override<a name="line.929"></a>
+<span class="sourceLineNo">930</span> public int seekToKeyInBlock(Cell seekCell, boolean seekBefore) {<a name="line.930"></a>
+<span class="sourceLineNo">931</span> int rowCommonPrefix = 0;<a name="line.931"></a>
+<span class="sourceLineNo">932</span> int familyCommonPrefix = 0;<a name="line.932"></a>
+<span class="sourceLineNo">933</span> int qualCommonPrefix = 0;<a name="line.933"></a>
+<span class="sourceLineNo">934</span> previous.invalidate();<a name="line.934"></a>
+<span class="sourceLineNo">935</span> do {<a name="line.935"></a>
+<span class="sourceLineNo">936</span> int comp;<a name="line.936"></a>
+<span class="sourceLineNo">937</span> keyOnlyKV.setKey(current.keyBuffer, 0, current.keyLength);<a name="line.937"></a>
+<span class="sourceLineNo">938</span> if (current.lastCommonPrefix != 0) {<a name="line.938"></a>
+<span class="sourceLineNo">939</span> // The KV format has row key length also in the byte array. The<a name="line.939"></a>
+<span class="sourceLineNo">940</span> // common prefix<a name="line.940"></a>
+<span class="sourceLineNo">941</span> // includes it. So we need to subtract to find out the common prefix<a name="line.941"></a>
+<span class="sourceLineNo">942</span> // in the<a name="line.942"></a>
+<span class="sourceLineNo">943</span> // row part alone<a name="line.943"></a>
+<span class="sourceLineNo">944</span> rowCommonPrefix = Math.min(rowCommonPrefix, current.lastCommonPrefix - 2);<a name="line.944"></a>
+<span class="sourceLineNo">945</span> }<a name="line.945"></a>
+<span class="sourceLineNo">946</span> if (current.lastCommonPrefix <= 2) {<a name="line.946"></a>
+<span class="sourceLineNo">947</span> rowCommonPrefix = 0;<a name="line.947"></a>
+<span class="sourceLineNo">948</span> }<a name="line.948"></a>
+<span class="sourceLineNo">949</span> rowCommonPrefix += findCommonPrefixInRowPart(seekCell, keyOnlyKV, rowCommonPrefix);<a name="line.949"></a>
+<span class="sourceLineNo">950</span> comp = compareCommonRowPrefix(seekCell, keyOnlyKV, rowCommonPrefix);<a name="line.950"></a>
+<span class="sourceLineNo">951</span> if (comp == 0) {<a name="line.951"></a>
+<span class="sourceLineNo">952</span> comp = compareTypeBytes(seekCell, keyOnlyKV);<a name="line.952"></a>
+<span class="sourceLineNo">953</span> if (comp == 0) {<a name="line.953"></a>
+<span class="sourceLineNo">954</span> // Subtract the fixed row key length and the family key fixed length<a name="line.954"></a>
+<span class="sourceLineNo">955</span> familyCommonPrefix = Math.max(0, Math.min(familyCommonPrefix,<a name="line.955"></a>
+<span class="sourceLineNo">956</span> current.lastCommonPrefix - (3 + keyOnlyKV.getRowLength())));<a name="line.956"></a>
+<span class="sourceLineNo">957</span> familyCommonPrefix +=<a name="line.957"></a>
+<span class="sourceLineNo">958</span> findCommonPrefixInFamilyPart(seekCell, keyOnlyKV, familyCommonPrefix);<a name="line.958"></a>
+<span class="sourceLineNo">959</span> comp = compareCommonFamilyPrefix(seekCell, keyOnlyKV, familyCommonPrefix);<a name="line.959"></a>
+<span class="sourceLineNo">960</span> if (comp == 0) {<a name="line.960"></a>
+<span class="sourceLineNo">961</span> // subtract the rowkey fixed length and the family key fixed<a name="line.961"></a>
+<span class="sourceLineNo">962</span> // length<a name="line.962"></a>
+<span class="sourceLineNo">963</span> qualCommonPrefix = Math.max(0, Math.min(qualCommonPrefix, current.lastCommonPrefix<a name="line.963"></a>
+<span class="sourceLineNo">964</span> - (3 + keyOnlyKV.getRowLength() + keyOnlyKV.getFamilyLength())));<a name="line.964"></a>
+<span class="sourceLineNo">965</span> qualCommonPrefix +=<a name="line.965"></a>
+<span class="sourceLineNo">966</span> findCommonPrefixInQualifierPart(seekCell, keyOnlyKV, qualCommonPrefix);<a name="line.966"></a>
+<span class="sourceLineNo">967</span> comp = compareCommonQualifierPrefix(seekCell, keyOnlyKV, qualCommonPrefix);<a name="line.967"></a>
+<span class="sourceLineNo">968</span> if (comp == 0) {<a name="line.968"></a>
+<span class="sourceLineNo">969</span> comp = CellComparator.getInstance().compareTimestamps(seekCell, keyOnlyKV);<a name="line.969"></a>
+<span class="sourceLineNo">970</span> if (comp == 0) {<a name="line.970"></a>
+<span class="sourceLineNo">971</span> // Compare types. Let the delete types sort ahead of puts;<a name="line.971"></a>
+<span class="sourceLineNo">972</span> // i.e. types<a name="line.972"></a>
+<span class="sourceLineNo">973</span> // of higher numbers sort before those of lesser numbers.<a name="line.973"></a>
+<span class="sourceLineNo">974</span> // Maximum<a name="line.974"></a>
+<span class="sourceLineNo">975</span> // (255)<a name="line.975"></a>
+<span class="sourceLineNo">976</span> // appears ahead of everything, and minimum (0) appears<a name="line.976"></a>
+<span class="sourceLineNo">977</span> // after<a name="line.977"></a>
+<span class="sourceLineNo">978</span> // everything.<a name="line.978"></a>
+<span class="sourceLineNo">979</span> comp = (0xff & keyOnlyKV.getTypeByte()) - (0xff & seekCell.getTypeByte());<a name="line.979"></a>
+<span class="sourceLineNo">980</span> }<a name="line.980"></a>
+<span class="sourceLineNo">981</span> }<a name="line.981"></a>
+<span class="sourceLineNo">982</span> }<a name="line.982"></a>
+<span class="sourceLineNo">983</span> }<a name="line.983"></a>
+<span class="sourceLineNo">984</span> }<a name="line.984"></a>
+<span class="sourceLineNo">985</span> if (comp == 0) { // exact match<a name="line.985"></a>
+<span class="sourceLineNo">986</span> if (seekBefore) {<a name="line.986"></a>
+<span class="sourceLineNo">987</span> if (!previous.isValid()) {<a name="line.987"></a>
+<span class="sourceLineNo">988</span> // The caller (seekBefore) has to ensure that we are not at the<a name="line.988"></a>
+<span class="sourceLineNo">989</span> // first key in the block.<a name="line.989"></a>
+<span class="sourceLineNo">990</span> throw new IllegalStateException(<a name="line.990"></a>
+<span class="sourceLineNo">991</span> "Cannot seekBefore if " + "positioned at the first key in the block: key="<a name="line.991"></a>
+<span class="sourceLineNo">992</span> + Bytes.toStringBinary(seekCell.getRowArray()));<a name="line.992"></a>
+<span class="sourceLineNo">993</span> }<a name="line.993"></a>
+<span class="sourceLineNo">994</span> moveToPrevious();<a name="line.994"></a>
+<span class="sourceLineNo">995</span> return 1;<a name="line.995"></a>
+<span class="sourceLineNo">996</span> }<a name="line.996"></a>
+<span class="sourceLineNo">997</span> return 0;<a name="line.997"></a>
+<span class="sourceLineNo">998</span> }<a name="line.998"></a>
+<span class="sourceLineNo">999</span><a name="line.999"></a>
+<span class="sourceLineNo">1000</span> if (comp < 0) { // already too large, check previous<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span> if (previous.isValid()) {<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span> moveToPrevious();<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span> } else {<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span> return HConstants.INDEX_KEY_MAGIC; // using optimized index key<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span> }<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span> return 1;<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span> }<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span><a name="line.1008"></a>
+<span class="sourceLineNo">1009</span> // move to next, if more data is available<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span> if (currentBuffer.hasRemaining()) {<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span> previous.copyFromNext(current);<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span> decodeNext();<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span> current.setKey(current.keyBuffer, current.memstoreTS);<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span> } else {<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span> break;<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span> }<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span> } while (true);<a name="line.1017"></a>
<span class="sourceLineNo">1018</span><a name="line.1018"></a>
-<span class="sourceLineNo">1019</span> private int compareTypeBytes(Cell key, Cell right) {<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span> if (<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span> key.getFamilyLength() + key.getQualifierLength() == 0<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span> && key.getTypeByte() == KeyValue.Type.Minimum.getCode()<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span> ) {<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span> // left is "bigger", i.e. it appears later in the sorted order<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span> return 1;<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span> }<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span> if (<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span> right.getFamilyLength() + right.getQualifierLength() == 0<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span> && right.getTypeByte() == KeyValue.Type.Minimum.getCode()<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span> ) {<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span> return -1;<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span> }<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span> return 0;<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span> }<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span><a name="line.1035"></a>
-<span class="sourceLineNo">1036</span> // These findCommonPrefix* methods rely on the fact that keyOnlyKv is the "right" cell argument<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span> // and always on-heap<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span><a name="line.1038"></a>
-<span class="sourceLineNo">1039</span> private static int findCommonPrefixInRowPart(Cell left, KeyValue.KeyOnlyKeyValue right,<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span> int rowCommonPrefix) {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span> if (left instanceof ByteBufferExtendedCell) {<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span> ByteBufferExtendedCell bbLeft = (ByteBufferExtendedCell) left;<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span> return ByteBufferUtils.findCommonPrefix(bbLeft.getRowByteBuffer(),<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span> bbLeft.getRowPosition() + rowCommonPrefix, left.getRowLength() - rowCommonPrefix,<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span> right.getRowArray(), right.getRowOffset() + rowCommonPrefix,<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span> right.getRowLength() - rowCommonPrefix);<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span> } else {<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span> return Bytes.findCommonPrefix(left.getRowArray(), right.getRowArray(),<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span> left.getRowLength() - rowCommonPrefix, right.getRowLength() - rowCommonPrefix,<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span> left.getRowOffset() + rowCommonPrefix, right.getRowOffset() + rowCommonPrefix);<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span> }<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span> }<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span><a name="line.1053"></a>
-<span class="sourceLineNo">1054</span> private static int findCommonPrefixInFamilyPart(Cell left, KeyValue.KeyOnlyKeyValue right,<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span> int familyCommonPrefix) {<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span> if (left instanceof ByteBufferExtendedCell) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span> ByteBufferExtendedCell bbLeft = (ByteBufferExtendedCell) left;<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span> return ByteBufferUtils.findCommonPrefix(bbLeft.getFamilyByteBuffer(),<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span> bbLeft.getFamilyPosition() + familyCommonPrefix,<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span> left.getFamilyLength() - familyCommonPrefix, right.getFamilyArray(),<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span> right.getFamilyOffset() + familyCommonPrefix,<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span> right.getFamilyLength() - familyCommonPrefix);<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span> } else {<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span> return Bytes.findCommonPrefix(left.getFamilyArray(), right.getFamilyArray(),<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span> left.getFamilyLength() - familyCommonPrefix, right.getFamilyLength() - familyCommonPrefix,<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span> left.getFamilyOffset() + familyCommonPrefix,<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span> right.getFamilyOffset() + familyCommonPrefix);<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span> }<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span> }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span><a name="line.1070"></a>
-<span class="sourceLineNo">1071</span> private static int findCommonPrefixInQualifierPart(Cell left, KeyValue.KeyOnlyKeyValue right,<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span> int qualifierCommonPrefix) {<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span> if (left instanceof ByteBufferExtendedCell) {<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span> ByteBufferExtendedCell bbLeft = (ByteBufferExtendedCell) left;<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span> return ByteBufferUtils.findCommonPrefix(bbLeft.getQualifierByteBuffer(),<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span> bbLeft.getQualifierPosition() + qualifierCommonPrefix,<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span> left.getQualifierLength() - qualifierCommonPrefix, right.getQualifierArray(),<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span> right.getQualifierOffset() + qualifierCommonPrefix,<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span> right.getQualifierLength() - qualifierCommonPrefix);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span> } else {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span> return Bytes.findCommonPrefix(left.getQualifierArray(), right.getQualifierArray(),<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span> left.getQualifierLength() - qualifierCommonPrefix,<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span> right.getQualifierLength() - qualifierCommonPrefix,<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span> left.getQualifierOffset() + qualifierCommonPrefix,<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span> right.getQualifierOffset() + qualifierCommonPrefix);<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span> }<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span> }<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span><a name="line.1088"></a>
-<span class="sourceLineNo">1089</span> private void moveToPrevious() {<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span> if (!previous.isValid()) {<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span> throw new IllegalStateException(<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span> "Can move back only once and not in first key in the block.");<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span> }<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span><a name="line.1094"></a>
-<span class="sourceLineNo">1095</span> STATE tmp = previous;<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span> previous = current;<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span> current = tmp;<a name="line.1097"></a>
+<span class="sourceLineNo">1019</span> // we hit the end of the block, not an exact match<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span> return 1;<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> private int compareTypeBytes(Cell key, Cell right) {<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span> if (<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span> key.getFamilyLength() + key.getQualifierLength() == 0<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span> && key.getTypeByte() == KeyValue.Type.Minimum.getCode()<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span> ) {<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span> // left is "bigger", i.e. it appears later in the sorted order<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span> return 1;<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span> }<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span> if (<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span> right.getFamilyLength() + right.getQualifierLength() == 0<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span> && right.getTypeByte() == KeyValue.Type.Minimum.getCode()<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span> ) {<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span> return -1;<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span> }<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span> return 0;<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span> }<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span><a name="line.1039"></a>
+<span class="sourceLineNo">1040</span> // These findCommonPrefix* methods rely on the fact that keyOnlyKv is the "right" cell argument<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span> // and always on-heap<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span><a name="line.1042"></a>
+<span class="sourceLineNo">1043</span> private static int findCommonPrefixInRowPart(Cell left, KeyValue.KeyOnlyKeyValue right,<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span> int rowCommonPrefix) {<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span> if (left instanceof ByteBufferExtendedCell) {<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span> ByteBufferExtendedCell bbLeft = (ByteBufferExtendedCell) left;<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span> return ByteBufferUtils.findCommonPrefix(bbLeft.getRowByteBuffer(),<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span> bbLeft.getRowPosition() + rowCommonPrefix, left.getRowLength() - rowCommonPrefix,<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span> right.getRowArray(), right.getRowOffset() + rowCommonPrefix,<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span> right.getRowLength() - rowCommonPrefix);<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span> } else {<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span> return Bytes.findCommonPrefix(left.getRowArray(), right.getRowArray(),<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span> left.getRowLength() - rowCommonPrefix, right.getRowLength() - rowCommonPrefix,<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span> left.getRowOffset() + rowCommonPrefix, right.getRowOffset() + rowCommonPrefix);<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span> }<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span> }<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span> private static int findCommonPrefixInFamilyPart(Cell left, KeyValue.KeyOnlyKeyValue right,<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span> int familyCommonPrefix) {<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span> if (left instanceof ByteBufferExtendedCell) {<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span> ByteBufferExtendedCell bbLeft = (ByteBufferExtendedCell) left;<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span> return ByteBufferUtils.findCommonPrefix(bbLeft.getFamilyByteBuffer(),<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span> bbLeft.getFamilyPosition() + familyCommonPrefix,<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span> left.getFamilyLength() - familyCommonPrefix, right.getFamilyArray(),<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span> right.getFamilyOffset() + familyCommonPrefix,<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span> right.getFamilyLength() - familyCommonPrefix);<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span> } else {<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span> return Bytes.findCommonPrefix(left.getFamilyArray(), right.getFamilyArray(),<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span> left.getFamilyLength() - familyCommonPrefix, right.getFamilyLength() - familyCommonPrefix,<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span> left.getFamilyOffset() + familyCommonPrefix,<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span> right.getFamilyOffset() + familyCommonPrefix);<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span> }<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span> }<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span><a name="line.1074"></a>
+<span class="sourceLineNo">1075</span> private static int findCommonPrefixInQualifierPart(Cell left, KeyValue.KeyOnlyKeyValue right,<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span> int qualifierCommonPrefix) {<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span> if (left instanceof ByteBufferExtendedCell) {<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span> ByteBufferExtendedCell bbLeft = (ByteBufferExtendedCell) left;<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span> return ByteBufferUtils.findCommonPrefix(bbLeft.getQualifierByteBuffer(),<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span> bbLeft.getQualifierPosition() + qualifierCommonPrefix,<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span> left.getQualifierLength() - qualifierCommonPrefix, right.getQualifierArray(),<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span> right.getQualifierOffset() + qualifierCommonPrefix,<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span> right.getQualifierLength() - qualifierCommonPrefix);<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span> } else {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span> return Bytes.findCommonPrefix(left.getQualifierArray(), right.getQualifierArray(),<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span> left.getQualifierLength() - qualifierCommonPrefix,<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span> right.getQualifierLength() - qualifierCommonPrefix,<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span> left.getQualifierOffset() + qualifierCommonPrefix,<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span> right.getQualifierOffset() + qualifierCommonPrefix);<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> private void moveToPrevious() {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span> if (!previous.isValid()) {<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span> throw new IllegalStateException(<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span> "Can move back only once and not in first key in the block.");<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span> }<a name="line.1097"></a>
<span class="sourceLineNo">1098</span><a name="line.1098"></a>
-<span class="sourceLineNo">1099</span> // move after last key value<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span> currentBuffer.position(current.nextKvOffset);<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span> // Already decoded the tag bytes. We cache this tags into current state and also the total<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span> // compressed length of the tags bytes. For the next time decodeNext() we don't need to decode<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span> // the tags again. This might pollute the Data Dictionary what we use for the compression.<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span> // When current.uncompressTags is false, we will just reuse the current.tagsBuffer and skip<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span> // 'tagsCompressedLength' bytes of source stream.<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span> // See in decodeTags()<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span> current.tagsBuffer = previous.tagsBuffer;<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span> current.tagsCompressedLength = previous.tagsCompressedLength;<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span> current.uncompressTags = false;<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span> // The current key has to be reset with the previous Cell<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span> current.setKey(current.keyBuffer, current.memstoreTS);<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span> previous.invalidate();<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span> }<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span><a name="line.1114"></a>
-<span class="sourceLineNo">1115</span> @SuppressWarnings("unchecked")<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span> protected STATE createSeekerState() {<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span> // This will fail for non-default seeker state if the subclass does not<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span> // override this method.<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span> return (STATE) new SeekerState(this.tmpPair, this.includesTags());<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span> }<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span><a name="line.1121"></a>
-<span class="sourceLineNo">1122</span> abstract protected void decodeFirst();<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span><a name="line.1123"></a>
-<span class="sourceLineNo">1124</span> abstract protected void decodeNext();<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span> }<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span><a name="line.1126"></a>
-<span class="sourceLineNo">1127</span> /** Returns unencoded size added */<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span> protected final int afterEncodingKeyValue(Cell cell, DataOutputStream out,<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span> HFileBlockDefaultEncodingContext encodingCtx) throws IOException {<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span> int size = 0;<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span> if (encodingCtx.getHFileContext().isIncludesTags()) {<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span> int tagsLength = cell.getTagsLength();<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span> ByteBufferUtils.putCompressedInt(out, tagsLength);<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span> // There are some tags to be written<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span> if (tagsLength > 0) {<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span> TagCompressionContext tagCompressionContext = encodingCtx.getTagCompressionContext();<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span> // When tag compression is enabled, tagCompressionContext will have a not null value. Write<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span> // the tags using Dictionary compression in such a case<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span> if (tagCompressionContext != null) {<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span> // Not passing tagsLength considering that parsing of the tagsLength is not costly<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span> PrivateCellUtil.compressTags(out, cell, tagCompressionContext);<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span> } else {<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span> PrivateCellUtil.writeTags(out, cell, tagsLength);<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> size += tagsLength + KeyValue.TAGS_LENGTH_SIZE;<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span> }<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span> if (encodingCtx.getHFileContext().isIncludesMvcc()) {<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span> // Copy memstore timestamp from the byte buffer to the output stream.<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span> long memstoreTS = cell.getSequenceId();<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span> WritableUtils.writeVLong(out, memstoreTS);<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span> // TODO use a writeVLong which returns the #bytes written so that 2 time parsing can be<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span> // avoided.<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span> size += WritableUtils.getVIntSize(memstoreTS);<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span> }<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span> return size;<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span> }<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span><a name="line.1158"></a>
-<span class="sourceLineNo">1159</span> protected final void afterDecodingKeyValue(DataInputStream source, ByteBuffer dest,<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span> HFileBlockDefaultDecodingContext decodingCtx) throws IOException {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span> if (decodingCtx.getHFileContext().isIncludesTags()) {<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span> int tagsLength = ByteBufferUtils.readCompressedInt(source);<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span> // Put as unsigned short<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span> dest.put((byte) ((tagsLength >> 8) & 0xff));<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span> dest.put((byte) (tagsLength & 0xff));<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span> if (tagsLength > 0) {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span> TagCompressionContext tagCompressionContext = decodingCtx.getTagCompressionContext();<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span> // When tag compression is been used in this file, tagCompressionContext will have a not<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span> // null value passed.<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span> if (tagCompressionContext != null) {<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span> tagCompressionContext.uncompressTags(source, dest, tagsLength);<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span> } else {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span> ByteBufferUtils.copyFromStreamToBuffer(dest, source, tagsLength);<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span> }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span> }<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span> }<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span> if (decodingCtx.getHFileContext().isIncludesMvcc()) {<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span> long memstoreTS = -1;<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span> try {<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span> // Copy memstore timestamp from the data input stream to the byte<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span> // buffer.<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span> memstoreTS = WritableUtils.readVLong(source);<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span> ByteBufferUtils.writeVLong(dest, memstoreTS);<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span> } catch (IOException ex) {<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span> throw new RuntimeException(<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span> "Unable to copy memstore timestamp " + memstoreTS + " after decoding a key/value");<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span> }<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> protected abstract ByteBuffer internalDecodeKeyValues(DataInputStream source,<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span> int allocateHeaderLength, int skipLastBytes, HFileBlockDefaultDecodingContext decodingCtx)<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span> throws IOException;<a name="line.1193"></a>
+<span class="sourceLineNo">1099</span> STATE tmp = previous;<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span> previous = current;<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span> current = tmp;<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span><a name="line.1102"></a>
+<span class="sourceLineNo">1103</span> // move after last key value<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span> currentBuffer.position(current.nextKvOffset);<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span> // Already decoded the tag bytes. We cache this tags into current state and also the total<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span> // compressed length of the tags bytes. For the next time decodeNext() we don't need to decode<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span> // the tags again. This might pollute the Data Dictionary what we use for the compression.<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span> // When current.uncompressTags is false, we will just reuse the current.tagsBuffer and skip<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span> // 'tagsCompressedLength' bytes of source stream.<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span> // See in decodeTags()<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span> current.tagsBuffer = previous.tagsBuffer;<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span> current.tagsCompressedLength = previous.tagsCompressedLength;<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span> current.uncompressTags = false;<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span> // The current key has to be reset with the previous Cell<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span> current.setKey(current.keyBuffer, current.memstoreTS);<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span> previous.invalidate();<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span> }<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span><a name="line.1118"></a>
+<span class="sourceLineNo">1119</span> @SuppressWarnings("unchecked")<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span> protected STATE createSeekerState() {<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span> // This will fail for non-default seeker state if the subclass does not<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span> // override this method.<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span> return (STATE) new SeekerState(this.tmpPair, this.includesTags());<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span> }<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span><a name="line.1125"></a>
+<span class="sourceLineNo">1126</span> abstract protected void decodeFirst();<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span><a name="line.1127"></a>
+<span class="sourceLineNo">1128</span> abstract protected void decodeNext();<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span> }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span><a name="line.1130"></a>
+<span class="sourceLineNo">1131</span> /** Returns unencoded size added */<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span> protected final int afterEncodingKeyValue(Cell cell, DataOutputStream out,<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span> HFileBlockDefaultEncodingContext encodingCtx) throws IOException {<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span> int size = 0;<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span> if (encodingCtx.getHFileContext().isIncludesTags()) {<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span> int tagsLength = cell.getTagsLength();<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span> ByteBufferUtils.putCompressedInt(out, tagsLength);<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span> // There are some tags to be written<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span> if (tagsLength > 0) {<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span> TagCompressionContext tagCompressionContext = encodingCtx.getTagCompressionContext();<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span> // When tag compression is enabled, tagCompressionContext will have a not null value. Write<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span> // the tags using Dictionary compression in such a case<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span> if (tagCompressionContext != null) {<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span> // Not passing tagsLength considering that parsing of the tagsLength is not costly<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span> PrivateCellUtil.compressTags(out, cell, tagCompressionContext);<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span> } else {<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span> PrivateCellUtil.writeTags(out, cell, tagsLength);<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span> }<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span> }<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span> size += tagsLength + KeyValue.TAGS_LENGTH_SIZE;<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span> }<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span> if (encodingCtx.getHFileContext().isIncludesMvcc()) {<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span> // Copy memstore timestamp from the byte buffer to the output stream.<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span> long memstoreTS = cell.getSequenceId();<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span> WritableUtils.writeVLong(out, memstoreTS);<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span> // TODO use a writeVLong which returns the #bytes written so that 2 time parsing can be<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span> // avoided.<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span> size += WritableUtils.getVIntSize(memstoreTS);<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span> }<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span> return size;<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span> }<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span><a name="line.1162"></a>
+<span class="sourceLineNo">1163</span> protected final void afterDecodingKeyValue(DataInputStream source, ByteBuffer dest,<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span> HFileBlockDefaultDecodingContext decodingCtx) throws IOException {<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span> if (decodingCtx.getHFileContext().isIncludesTags()) {<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span> int tagsLength = ByteBufferUtils.readCompressedInt(source);<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span> // Put as unsigned short<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span> dest.put((byte) ((tagsLength >> 8) & 0xff));<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span> dest.put((byte) (tagsLength & 0xff));<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span> if (tagsLength > 0) {<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span> TagCompressionContext tagCompressionContext = decodingCtx.getTagCompressionContext();<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span> // When tag compression is been used in this file, tagCompressionContext will have a not<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span> // null value passed.<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span> if (tagCompressionContext != null) {<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span> tagCompressionContext.uncompressTags(source, dest, tagsLength);<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span> } else {<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span> ByteBufferUtils.copyFromStreamToBuffer(dest, source, tagsLength);<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> }<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span> if (decodingCtx.getHFileContext().isIncludesMvcc()) {<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span> long memstoreTS = -1;<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span> try {<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span> // Copy memstore timestamp from the data input stream to the byte<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span> // buffer.<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span> memstoreTS = WritableUtils.readVLong(source);<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span> ByteBufferUtils.writeVLong(dest, memstoreTS);<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span> } catch (IOException ex) {<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span> throw new RuntimeException(<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span> "Unable to copy memstore timestamp " + memstoreTS + " after decoding a key/value");<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> }<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> * Asserts that there is at least the given amount of unfilled space remaining in the given<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span> * buffer.<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span> * @param out typically, the buffer we are writing to<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span> * @param length the required space in the buffer<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span> * @throws EncoderBufferTooSmallException If there are no enough bytes.<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span> */<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span> protected static void ensureSpace(ByteBuffer out, int length)<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span> throws EncoderBufferTooSmallException {<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span> if (out.position() + length > out.limit()) {<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span> throw new EncoderBufferTooSmallException("Buffer position=" + out.position()<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span> + ", buffer limit=" + out.limit() + ", length to be written=" + length);<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span> }<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span> }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span> @Override<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span> public void startBlockEncoding(HFileBlockEncodingContext blkEncodingCtx, DataOutputStream out)<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span> throws IOException {<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span> if (blkEncodingCtx.getClass() != HFileBlockDefaultEncodingContext.class) {<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span> throw new IOException(this.getClass().getName() + " only accepts "<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span> + HFileBlockDefaultEncodingContext.class.getName() + " as the " + "encoding context.");<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span> }<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span><a name="line.1217"></a>
-<span class="sourceLineNo">1218</span> HFileBlockDefaultEncodingContext encodingCtx =<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span> (HFileBlockDefaultEncodingContext) blkEncodingCtx;<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span> encodingCtx.prepareEncoding(out);<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span> if (<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span> encodingCtx.getHFileContext().isIncludesTags()<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span> && encodingCtx.getHFileContext().isCompressTags()<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span> ) {<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span> if (encodingCtx.getTagCompressionContext() != null) {<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span> // It will be overhead to create the TagCompressionContext again and again for every block<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span> // encoding.<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span> encodingCtx.getTagCompressionContext().clear();<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span> } else {<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span> try {<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span> TagCompressionContext tagCompressionContext =<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span> new TagCompressionContext(LRUDictionary.class, Byte.MAX_VALUE);<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span> encodingCtx.setTagCompressionContext(tagCompressionContext);<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span> } catch (Exception e) {<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span> throw new IOException("Failed to initialize TagCompressionContext", e);<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span> }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span> }<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span> }<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span> StreamUtils.writeInt(out, 0); // DUMMY length. This will be updated in endBlockEncoding()<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span> blkEncodingCtx.setEncodingState(new EncodingState());<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span> }<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span><a name="line.1242"></a>
-<span class="sourceLineNo">1243</span> @Override<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span> public void encode(Cell cell, HFileBlockEncodingContext encodingCtx, DataOutputStream out)<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span> throws IOException {<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span> EncodingState state = encodingCtx.getEncodingState();<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span> int posBeforeEncode = out.size();<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span> int encodedKvSize = internalEncode(cell, (HFileBlockDefaultEncodingContext) encodingCtx, out);<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span> state.postCellEncode(encodedKvSize, out.size() - posBeforeEncode);<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span> }<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span> public abstract int internalEncode(Cell cell, HFileBlockDefaultEncodingContext encodingCtx,<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span> DataOutputStream out) throws IOException;<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span><a name="line.1254"></a>
-<span class="sourceLineNo">1255</span> @Override<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span> public void endBlockEncoding(HFileBlockEncodingContext encodingCtx, DataOutputStream out,<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span> byte[] uncompressedBytesWithHeader) throws IOException {<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span> EncodingState state = encodingCtx.getEncodingState();<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span> // Write the unencodedDataSizeWritten (with header size)<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span> Bytes.putInt(uncompressedBytesWithHeader,<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span> HConstants.HFILEBLOCK_HEADER_SIZE + DataBlockEncoding.ID_SIZE,<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span> state.getUnencodedDataSizeWritten());<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span> postEncoding(encodingCtx);<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span> }<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span><a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>}<a name="line.1266"></a>
+<span class="sourceLineNo">1195</span> protected abstract ByteBuffer internalDecodeKeyValues(DataInputStream source,<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span> int allocateHeaderLength, int skipLastBytes, HFileBlockDefaultDecodingContext decodingCtx)<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span> throws IOException;<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> * Asserts that there is at least the given amount of unfilled space remaining in the given<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span> * buffer.<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span> * @param out typically, the buffer we are writing to<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span> * @param length the required space in the buffer<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span> * @throws EncoderBufferTooSmallException If there are no enough bytes.<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span> */<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span> protected static void ensureSpace(ByteBuffer out, int length)<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span> throws EncoderBufferTooSmallException {<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span> if (out.position() + length > out.limit()) {<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span> throw new EncoderBufferTooSmallException("Buffer position=" + out.position()<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span> + ", buffer limit=" + out.limit() + ", length to be written=" + length);<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span> }<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span> }<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span><a name="line.1213"></a>
+<span class="sourceLineNo">1214</span> @Override<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span> public void startBlockEncoding(HFileBlockEncodingContext blkEncodingCtx, DataOutputStream out)<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span> throws IOException {<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span> if (blkEncodingCtx.getClass() != HFileBlockDefaultEncodingContext.class) {<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span> throw new IOException(this.getClass().getName() + " only accepts "<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span> + HFileBlockDefaultEncodingContext.class.getName() + " as the " + "encoding context.");<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span> }<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span><a name="line.1221"></a>
+<span class="sourceLineNo">1222</span> HFileBlockDefaultEncodingContext encodingCtx =<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span> (HFileBlockDefaultEncodingContext) blkEncodingCtx;<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span> encodingCtx.prepareEncoding(out);<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span> if (<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span> encodingCtx.getHFileContext().isIncludesTags()<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span> && encodingCtx.getHFileContext().isCompressTags()<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span> ) {<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span> if (encodingCtx.getTagCompressionContext() != null) {<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span> // It will be overhead to create the TagCompressionContext again and again for every block<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span> // encoding.<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span> encodingCtx.getTagCompressionContext().clear();<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span> } else {<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span> try {<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span> TagCompressionContext tagCompressionContext =<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span> new TagCompressionContext(LRUDictionary.class, Byte.MAX_VALUE);<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span> encodingCtx.setTagCompressionContext(tagCompressionContext);<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span> } catch (Exception e) {<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span> throw new IOException("Failed to initialize TagCompressionContext", e);<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span> }<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span> }<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span> }<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span> StreamUtils.writeInt(out, 0); // DUMMY length. This will be updated in endBlockEncoding()<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span> blkEncodingCtx.setEncodingState(new EncodingState());<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span> }<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span><a name="line.1246"></a>
+<span class="sourceLineNo">1247</span> @Override<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span> public void encode(Cell cell, HFileBlockEncodingContext encodingCtx, DataOutputStream out)<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span> throws IOException {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span> EncodingState state = encodingCtx.getEncodingState();<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span> int posBeforeEncode = out.size();<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span> int encodedKvSize = internalEncode(cell, (HFileBlockDefaultEncodingContext) encodingCtx, out);<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span> state.postCellEncode(encodedKvSize, out.size() - posBeforeEncode);<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> public abstract int internalEncode(Cell cell, HFileBlockDefaultEncodingContext encodingCtx,<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span> DataOutputStream out) throws IOException;<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span><a name="line.1258"></a>
+<span class="sourceLineNo">1259</span> @Override<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span> public void endBlockEncoding(HFileBlockEncodingContext encodingCtx, DataOutputStream out,<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span> byte[] uncompressedBytesWithHeader) throws IOException {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span> EncodingState state = encodingCtx.getEncodingState();<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span> // Write the unencodedDataSizeWritten (with header size)<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span> Bytes.putInt(uncompressedBytesWithHeader,<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span> HConstants.HFILEBLOCK_HEADER_SIZE + DataBlockEncoding.ID_SIZE,<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span> state.getUnencodedDataSizeWritten());<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span> postEncoding(encodingCtx);<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span> }<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span><a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>}<a name="line.1270"></a>
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.OffheapDecodedExtendedCell.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.OffheapDecodedExtendedCell.html
index 5cdb93fd392..819724d6731 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.OffheapDecodedExtendedCell.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.OffheapDecodedExtendedCell.html
@@ -842,436 +842,440 @@
<span class="sourceLineNo">834</span> public void setCurrentBuffer(ByteBuff buffer) {<a name="line.834"></a>
<span class="sourceLineNo">835</span> if (this.tagCompressionContext != null) {<a name="line.835"></a>
<span class="sourceLineNo">836</span> this.tagCompressionContext.clear();<a name="line.836"></a>
-<span class="sourceLineNo">837</span> }<a name="line.837"></a>
-<span class="sourceLineNo">838</span> currentBuffer = buffer;<a name="line.838"></a>
-<span class="sourceLineNo">839</span> current.currentBuffer = currentBuffer;<a name="line.839"></a>
-<span class="sourceLineNo">840</span> if (tagCompressionContext != null) {<a name="line.840"></a>
-<span class="sourceLineNo">841</span> current.tagCompressionContext = tagCompressionContext;<a name="line.841"></a>
-<span class="sourceLineNo">842</span> }<a name="line.842"></a>
-<span class="sourceLineNo">843</span> decodeFirst();<a name="line.843"></a>
-<span class="sourceLineNo">844</span> current.setKey(current.keyBuffer, current.memstoreTS);<a name="line.844"></a>
-<span class="sourceLineNo">845</span> previous.invalidate();<a name="line.845"></a>
-<span class="sourceLineNo">846</span> }<a name="line.846"></a>
-<span class="sourceLineNo">847</span><a name="line.847"></a>
-<span class="sourceLineNo">848</span> @Override<a name="line.848"></a>
-<span class="sourceLineNo">849</span> public Cell getKey() {<a name="line.849"></a>
-<span class="sourceLineNo">850</span> byte[] key = new byte[current.keyLength];<a name="line.850"></a>
-<span class="sourceLineNo">851</span> System.arraycopy(current.keyBuffer, 0, key, 0, current.keyLength);<a name="line.851"></a>
-<span class="sourceLineNo">852</span> return new KeyValue.KeyOnlyKeyValue(key);<a name="line.852"></a>
+<span class="sourceLineNo">837</span><a name="line.837"></a>
+<span class="sourceLineNo">838</span> // Prior seekToKeyInBlock may have reset this to false if we fell back to previous<a name="line.838"></a>
+<span class="sourceLineNo">839</span> // seeker state. This is an optimization so we don't have to uncompress tags again when<a name="line.839"></a>
+<span class="sourceLineNo">840</span> // reading last state.<a name="line.840"></a>
+<span class="sourceLineNo">841</span> // In seekBefore flow, if block change happens then rewind is not called and<a name="line.841"></a>
+<span class="sourceLineNo">842</span> // setCurrentBuffer is called, so need to uncompress any tags we see.<a name="line.842"></a>
+<span class="sourceLineNo">843</span> current.uncompressTags = true;<a name="line.843"></a>
+<span class="sourceLineNo">844</span> }<a name="line.844"></a>
+<span class="sourceLineNo">845</span> currentBuffer = buffer;<a name="line.845"></a>
+<span class="sourceLineNo">846</span> current.currentBuffer = currentBuffer;<a name="line.846"></a>
+<span class="sourceLineNo">847</span> if (tagCompressionContext != null) {<a name="line.847"></a>
+<span class="sourceLineNo">848</span> current.tagCompressionContext = tagCompressionContext;<a name="line.848"></a>
+<span class="sourceLineNo">849</span> }<a name="line.849"></a>
+<span class="sourceLineNo">850</span> decodeFirst();<a name="line.850"></a>
+<span class="sourceLineNo">851</span> current.setKey(current.keyBuffer, current.memstoreTS);<a name="line.851"></a>
+<span class="sourceLineNo">852</span> previous.invalidate();<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> @Override<a name="line.855"></a>
-<span class="sourceLineNo">856</span> public ByteBuffer getValueShallowCopy() {<a name="line.856"></a>
-<span class="sourceLineNo">857</span> currentBuffer.asSubByteBuffer(current.valueOffset, current.valueLength, tmpPair);<a name="line.857"></a>
-<span class="sourceLineNo">858</span> ByteBuffer dup = tmpPair.getFirst().duplicate();<a name="line.858"></a>
-<span class="sourceLineNo">859</span> dup.position(tmpPair.getSecond());<a name="line.859"></a>
-<span class="sourceLineNo">860</span> dup.limit(tmpPair.getSecond() + current.valueLength);<a name="line.860"></a>
-<span class="sourceLineNo">861</span> return dup.slice();<a name="line.861"></a>
-<span class="sourceLineNo">862</span> }<a name="line.862"></a>
-<span class="sourceLineNo">863</span><a name="line.863"></a>
-<span class="sourceLineNo">864</span> @Override<a name="line.864"></a>
-<span class="sourceLineNo">865</span> public Cell getCell() {<a name="line.865"></a>
-<span class="sourceLineNo">866</span> return current.toCell();<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> @Override<a name="line.869"></a>
-<span class="sourceLineNo">870</span> public void rewind() {<a name="line.870"></a>
-<span class="sourceLineNo">871</span> currentBuffer.rewind();<a name="line.871"></a>
-<span class="sourceLineNo">872</span> if (tagCompressionContext != null) {<a name="line.872"></a>
-<span class="sourceLineNo">873</span> tagCompressionContext.clear();<a name="line.873"></a>
-<span class="sourceLineNo">874</span> // Prior seekToKeyInBlock may have reset this to false if we fell back to previous<a name="line.874"></a>
-<span class="sourceLineNo">875</span> // seeker state. This is an optimization so we don't have to uncompress tags again when<a name="line.875"></a>
-<span class="sourceLineNo">876</span> // reading last state.<a name="line.876"></a>
-<span class="sourceLineNo">877</span> // In case of rewind, we are starting from the beginning of the buffer, so we need<a name="line.877"></a>
-<span class="sourceLineNo">878</span> // to uncompress any tags we see.<a name="line.878"></a>
-<span class="sourceLineNo">879</span> // It may make sense to reset this in setCurrentBuffer as well, but we seem to only call<a name="line.879"></a>
-<span class="sourceLineNo">880</span> // setCurrentBuffer after StoreFileScanner.seekAtOrAfter which calls next to consume the<a name="line.880"></a>
-<span class="sourceLineNo">881</span> // seeker state. Rewind is called by seekBefore, which doesn't and leaves us in this state.<a name="line.881"></a>
-<span class="sourceLineNo">882</span> current.uncompressTags = true;<a name="line.882"></a>
-<span class="sourceLineNo">883</span> }<a name="line.883"></a>
-<span class="sourceLineNo">884</span> decodeFirst();<a name="line.884"></a>
-<span class="sourceLineNo">885</span> current.setKey(current.keyBuffer, current.memstoreTS);<a name="line.885"></a>
-<span class="sourceLineNo">886</span> previous.invalidate();<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>
-<span class="sourceLineNo">889</span> @Override<a name="line.889"></a>
-<span class="sourceLineNo">890</span> public boolean next() {<a name="line.890"></a>
-<span class="sourceLineNo">891</span> if (!currentBuffer.hasRemaining()) {<a name="line.891"></a>
-<span class="sourceLineNo">892</span> return false;<a name="line.892"></a>
-<span class="sourceLineNo">893</span> }<a name="line.893"></a>
-<span class="sourceLineNo">894</span> decodeNext();<a name="line.894"></a>
-<span class="sourceLineNo">895</span> current.setKey(current.keyBuffer, current.memstoreTS);<a name="line.895"></a>
-<span class="sourceLineNo">896</span> previous.invalidate();<a name="line.896"></a>
-<span class="sourceLineNo">897</span> return true;<a name="line.897"></a>
-<span class="sourceLineNo">898</span> }<a name="line.898"></a>
-<span class="sourceLineNo">899</span><a name="line.899"></a>
-<span class="sourceLineNo">900</span> protected void decodeTags() {<a name="line.900"></a>
-<span class="sourceLineNo">901</span> current.tagsLength = ByteBuff.readCompressedInt(currentBuffer);<a name="line.901"></a>
-<span class="sourceLineNo">902</span> if (tagCompressionContext != null) {<a name="line.902"></a>
-<span class="sourceLineNo">903</span> if (current.uncompressTags) {<a name="line.903"></a>
-<span class="sourceLineNo">904</span> // Tag compression is been used. uncompress it into tagsBuffer<a name="line.904"></a>
-<span class="sourceLineNo">905</span> current.ensureSpaceForTags();<a name="line.905"></a>
-<span class="sourceLineNo">906</span> try {<a name="line.906"></a>
-<span class="sourceLineNo">907</span> current.tagsCompressedLength = tagCompressionContext.uncompressTags(currentBuffer,<a name="line.907"></a>
-<span class="sourceLineNo">908</span> current.tagsBuffer, 0, current.tagsLength);<a name="line.908"></a>
-<span class="sourceLineNo">909</span> } catch (Exception e) {<a name="line.909"></a>
-<span class="sourceLineNo">910</span> throw new RuntimeException("Exception while uncompressing tags", e);<a name="line.910"></a>
-<span class="sourceLineNo">911</span> }<a name="line.911"></a>
-<span class="sourceLineNo">912</span> } else {<a name="line.912"></a>
-<span class="sourceLineNo">913</span> currentBuffer.skip(current.tagsCompressedLength);<a name="line.913"></a>
-<span class="sourceLineNo">914</span> current.uncompressTags = true;// Reset this.<a name="line.914"></a>
-<span class="sourceLineNo">915</span> }<a name="line.915"></a>
-<span class="sourceLineNo">916</span> current.tagsOffset = -1;<a name="line.916"></a>
-<span class="sourceLineNo">917</span> } else {<a name="line.917"></a>
-<span class="sourceLineNo">918</span> // When tag compress is not used, let us not do copying of tags bytes into tagsBuffer.<a name="line.918"></a>
-<span class="sourceLineNo">919</span> // Just mark the tags Offset so as to create the KV buffer later in getKeyValueBuffer()<a name="line.919"></a>
-<span class="sourceLineNo">920</span> current.tagsOffset = currentBuffer.position();<a name="line.920"></a>
-<span class="sourceLineNo">921</span> currentBuffer.skip(current.tagsLength);<a name="line.921"></a>
-<span class="sourceLineNo">922</span> }<a name="line.922"></a>
-<span class="sourceLineNo">923</span> }<a name="line.923"></a>
-<span class="sourceLineNo">924</span><a name="line.924"></a>
-<span class="sourceLineNo">925</span> @Override<a name="line.925"></a>
-<span class="sourceLineNo">926</span> public int seekToKeyInBlock(Cell seekCell, boolean seekBefore) {<a name="line.926"></a>
-<span class="sourceLineNo">927</span> int rowCommonPrefix = 0;<a name="line.927"></a>
-<span class="sourceLineNo">928</span> int familyCommonPrefix = 0;<a name="line.928"></a>
-<span class="sourceLineNo">929</span> int qualCommonPrefix = 0;<a name="line.929"></a>
-<span class="sourceLineNo">930</span> previous.invalidate();<a name="line.930"></a>
-<span class="sourceLineNo">931</span> do {<a name="line.931"></a>
-<span class="sourceLineNo">932</span> int comp;<a name="line.932"></a>
-<span class="sourceLineNo">933</span> keyOnlyKV.setKey(current.keyBuffer, 0, current.keyLength);<a name="line.933"></a>
-<span class="sourceLineNo">934</span> if (current.lastCommonPrefix != 0) {<a name="line.934"></a>
-<span class="sourceLineNo">935</span> // The KV format has row key length also in the byte array. The<a name="line.935"></a>
-<span class="sourceLineNo">936</span> // common prefix<a name="line.936"></a>
-<span class="sourceLineNo">937</span> // includes it. So we need to subtract to find out the common prefix<a name="line.937"></a>
-<span class="sourceLineNo">938</span> // in the<a name="line.938"></a>
-<span class="sourceLineNo">939</span> // row part alone<a name="line.939"></a>
-<span class="sourceLineNo">940</span> rowCommonPrefix = Math.min(rowCommonPrefix, current.lastCommonPrefix - 2);<a name="line.940"></a>
-<span class="sourceLineNo">941</span> }<a name="line.941"></a>
-<span class="sourceLineNo">942</span> if (current.lastCommonPrefix <= 2) {<a name="line.942"></a>
-<span class="sourceLineNo">943</span> rowCommonPrefix = 0;<a name="line.943"></a>
-<span class="sourceLineNo">944</span> }<a name="line.944"></a>
-<span class="sourceLineNo">945</span> rowCommonPrefix += findCommonPrefixInRowPart(seekCell, keyOnlyKV, rowCommonPrefix);<a name="line.945"></a>
-<span class="sourceLineNo">946</span> comp = compareCommonRowPrefix(seekCell, keyOnlyKV, rowCommonPrefix);<a name="line.946"></a>
-<span class="sourceLineNo">947</span> if (comp == 0) {<a name="line.947"></a>
-<span class="sourceLineNo">948</span> comp = compareTypeBytes(seekCell, keyOnlyKV);<a name="line.948"></a>
-<span class="sourceLineNo">949</span> if (comp == 0) {<a name="line.949"></a>
-<span class="sourceLineNo">950</span> // Subtract the fixed row key length and the family key fixed length<a name="line.950"></a>
-<span class="sourceLineNo">951</span> familyCommonPrefix = Math.max(0, Math.min(familyCommonPrefix,<a name="line.951"></a>
-<span class="sourceLineNo">952</span> current.lastCommonPrefix - (3 + keyOnlyKV.getRowLength())));<a name="line.952"></a>
-<span class="sourceLineNo">953</span> familyCommonPrefix +=<a name="line.953"></a>
-<span class="sourceLineNo">954</span> findCommonPrefixInFamilyPart(seekCell, keyOnlyKV, familyCommonPrefix);<a name="line.954"></a>
-<span class="sourceLineNo">955</span> comp = compareCommonFamilyPrefix(seekCell, keyOnlyKV, familyCommonPrefix);<a name="line.955"></a>
-<span class="sourceLineNo">956</span> if (comp == 0) {<a name="line.956"></a>
-<span class="sourceLineNo">957</span> // subtract the rowkey fixed length and the family key fixed<a name="line.957"></a>
-<span class="sourceLineNo">958</span> // length<a name="line.958"></a>
-<span class="sourceLineNo">959</span> qualCommonPrefix = Math.max(0, Math.min(qualCommonPrefix, current.lastCommonPrefix<a name="line.959"></a>
-<span class="sourceLineNo">960</span> - (3 + keyOnlyKV.getRowLength() + keyOnlyKV.getFamilyLength())));<a name="line.960"></a>
-<span class="sourceLineNo">961</span> qualCommonPrefix +=<a name="line.961"></a>
-<span class="sourceLineNo">962</span> findCommonPrefixInQualifierPart(seekCell, keyOnlyKV, qualCommonPrefix);<a name="line.962"></a>
-<span class="sourceLineNo">963</span> comp = compareCommonQualifierPrefix(seekCell, keyOnlyKV, qualCommonPrefix);<a name="line.963"></a>
-<span class="sourceLineNo">964</span> if (comp == 0) {<a name="line.964"></a>
-<span class="sourceLineNo">965</span> comp = CellComparator.getInstance().compareTimestamps(seekCell, keyOnlyKV);<a name="line.965"></a>
-<span class="sourceLineNo">966</span> if (comp == 0) {<a name="line.966"></a>
-<span class="sourceLineNo">967</span> // Compare types. Let the delete types sort ahead of puts;<a name="line.967"></a>
-<span class="sourceLineNo">968</span> // i.e. types<a name="line.968"></a>
-<span class="sourceLineNo">969</span> // of higher numbers sort before those of lesser numbers.<a name="line.969"></a>
-<span class="sourceLineNo">970</span> // Maximum<a name="line.970"></a>
-<span class="sourceLineNo">971</span> // (255)<a name="line.971"></a>
-<span class="sourceLineNo">972</span> // appears ahead of everything, and minimum (0) appears<a name="line.972"></a>
-<span class="sourceLineNo">973</span> // after<a name="line.973"></a>
-<span class="sourceLineNo">974</span> // everything.<a name="line.974"></a>
-<span class="sourceLineNo">975</span> comp = (0xff & keyOnlyKV.getTypeByte()) - (0xff & seekCell.getTypeByte());<a name="line.975"></a>
-<span class="sourceLineNo">976</span> }<a name="line.976"></a>
-<span class="sourceLineNo">977</span> }<a name="line.977"></a>
-<span class="sourceLineNo">978</span> }<a name="line.978"></a>
-<span class="sourceLineNo">979</span> }<a name="line.979"></a>
-<span class="sourceLineNo">980</span> }<a name="line.980"></a>
-<span class="sourceLineNo">981</span> if (comp == 0) { // exact match<a name="line.981"></a>
-<span class="sourceLineNo">982</span> if (seekBefore) {<a name="line.982"></a>
-<span class="sourceLineNo">983</span> if (!previous.isValid()) {<a name="line.983"></a>
-<span class="sourceLineNo">984</span> // The caller (seekBefore) has to ensure that we are not at the<a name="line.984"></a>
-<span class="sourceLineNo">985</span> // first key in the block.<a name="line.985"></a>
-<span class="sourceLineNo">986</span> throw new IllegalStateException(<a name="line.986"></a>
-<span class="sourceLineNo">987</span> "Cannot seekBefore if " + "positioned at the first key in the block: key="<a name="line.987"></a>
-<span class="sourceLineNo">988</span> + Bytes.toStringBinary(seekCell.getRowArray()));<a name="line.988"></a>
-<span class="sourceLineNo">989</span> }<a name="line.989"></a>
-<span class="sourceLineNo">990</span> moveToPrevious();<a name="line.990"></a>
-<span class="sourceLineNo">991</span> return 1;<a name="line.991"></a>
-<span class="sourceLineNo">992</span> }<a name="line.992"></a>
-<span class="sourceLineNo">993</span> return 0;<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> if (comp < 0) { // already too large, check previous<a name="line.996"></a>
-<span class="sourceLineNo">997</span> if (previous.isValid()) {<a name="line.997"></a>
-<span class="sourceLineNo">998</span> moveToPrevious();<a name="line.998"></a>
-<span class="sourceLineNo">999</span> } else {<a name="line.999"></a>
-<span class="sourceLineNo">1000</span> return HConstants.INDEX_KEY_MAGIC; // using optimized index key<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span> }<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span> return 1;<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span> }<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span><a name="line.1004"></a>
-<span class="sourceLineNo">1005</span> // move to next, if more data is available<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span> if (currentBuffer.hasRemaining()) {<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span> previous.copyFromNext(current);<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span> decodeNext();<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span> current.setKey(current.keyBuffer, current.memstoreTS);<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span> } else {<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span> break;<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span> }<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span> } while (true);<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span><a name="line.1014"></a>
-<span class="sourceLineNo">1015</span> // we hit the end of the block, not an exact match<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span> return 1;<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span> }<a name="line.1017"></a>
+<span class="sourceLineNo">856</span> public Cell getKey() {<a name="line.856"></a>
+<span class="sourceLineNo">857</span> byte[] key = new byte[current.keyLength];<a name="line.857"></a>
+<span class="sourceLineNo">858</span> System.arraycopy(current.keyBuffer, 0, key, 0, current.keyLength);<a name="line.858"></a>
+<span class="sourceLineNo">859</span> return new KeyValue.KeyOnlyKeyValue(key);<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> @Override<a name="line.862"></a>
+<span class="sourceLineNo">863</span> public ByteBuffer getValueShallowCopy() {<a name="line.863"></a>
+<span class="sourceLineNo">864</span> currentBuffer.asSubByteBuffer(current.valueOffset, current.valueLength, tmpPair);<a name="line.864"></a>
+<span class="sourceLineNo">865</span> ByteBuffer dup = tmpPair.getFirst().duplicate();<a name="line.865"></a>
+<span class="sourceLineNo">866</span> dup.position(tmpPair.getSecond());<a name="line.866"></a>
+<span class="sourceLineNo">867</span> dup.limit(tmpPair.getSecond() + current.valueLength);<a name="line.867"></a>
+<span class="sourceLineNo">868</span> return dup.slice();<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">871</span> @Override<a name="line.871"></a>
+<span class="sourceLineNo">872</span> public Cell getCell() {<a name="line.872"></a>
+<span class="sourceLineNo">873</span> return current.toCell();<a name="line.873"></a>
+<span class="sourceLineNo">874</span> }<a name="line.874"></a>
+<span class="sourceLineNo">875</span><a name="line.875"></a>
+<span class="sourceLineNo">876</span> @Override<a name="line.876"></a>
+<span class="sourceLineNo">877</span> public void rewind() {<a name="line.877"></a>
+<span class="sourceLineNo">878</span> currentBuffer.rewind();<a name="line.878"></a>
+<span class="sourceLineNo">879</span> if (tagCompressionContext != null) {<a name="line.879"></a>
+<span class="sourceLineNo">880</span> tagCompressionContext.clear();<a name="line.880"></a>
+<span class="sourceLineNo">881</span> // Prior seekToKeyInBlock may have reset this to false if we fell back to previous<a name="line.881"></a>
+<span class="sourceLineNo">882</span> // seeker state. This is an optimization so we don't have to uncompress tags again when<a name="line.882"></a>
+<span class="sourceLineNo">883</span> // reading last state.<a name="line.883"></a>
+<span class="sourceLineNo">884</span> // In case of rewind, we are starting from the beginning of the buffer, so we need<a name="line.884"></a>
+<span class="sourceLineNo">885</span> // to uncompress any tags we see.<a name="line.885"></a>
+<span class="sourceLineNo">886</span> current.uncompressTags = true;<a name="line.886"></a>
+<span class="sourceLineNo">887</span> }<a name="line.887"></a>
+<span class="sourceLineNo">888</span> decodeFirst();<a name="line.888"></a>
+<span class="sourceLineNo">889</span> current.setKey(current.keyBuffer, current.memstoreTS);<a name="line.889"></a>
+<span class="sourceLineNo">890</span> previous.invalidate();<a name="line.890"></a>
+<span class="sourceLineNo">891</span> }<a name="line.891"></a>
+<span class="sourceLineNo">892</span><a name="line.892"></a>
+<span class="sourceLineNo">893</span> @Override<a name="line.893"></a>
+<span class="sourceLineNo">894</span> public boolean next() {<a name="line.894"></a>
+<span class="sourceLineNo">895</span> if (!currentBuffer.hasRemaining()) {<a name="line.895"></a>
+<span class="sourceLineNo">896</span> return false;<a name="line.896"></a>
+<span class="sourceLineNo">897</span> }<a name="line.897"></a>
+<span class="sourceLineNo">898</span> decodeNext();<a name="line.898"></a>
+<span class="sourceLineNo">899</span> current.setKey(current.keyBuffer, current.memstoreTS);<a name="line.899"></a>
+<span class="sourceLineNo">900</span> previous.invalidate();<a name="line.900"></a>
+<span class="sourceLineNo">901</span> return true;<a name="line.901"></a>
+<span class="sourceLineNo">902</span> }<a name="line.902"></a>
+<span class="sourceLineNo">903</span><a name="line.903"></a>
+<span class="sourceLineNo">904</span> protected void decodeTags() {<a name="line.904"></a>
+<span class="sourceLineNo">905</span> current.tagsLength = ByteBuff.readCompressedInt(currentBuffer);<a name="line.905"></a>
+<span class="sourceLineNo">906</span> if (tagCompressionContext != null) {<a name="line.906"></a>
+<span class="sourceLineNo">907</span> if (current.uncompressTags) {<a name="line.907"></a>
+<span class="sourceLineNo">908</span> // Tag compression is been used. uncompress it into tagsBuffer<a name="line.908"></a>
+<span class="sourceLineNo">909</span> current.ensureSpaceForTags();<a name="line.909"></a>
+<span class="sourceLineNo">910</span> try {<a name="line.910"></a>
+<span class="sourceLineNo">911</span> current.tagsCompressedLength = tagCompressionContext.uncompressTags(currentBuffer,<a name="line.911"></a>
+<span class="sourceLineNo">912</span> current.tagsBuffer, 0, current.tagsLength);<a name="line.912"></a>
+<span class="sourceLineNo">913</span> } catch (Exception e) {<a name="line.913"></a>
+<span class="sourceLineNo">914</span> throw new RuntimeException("Exception while uncompressing tags", e);<a name="line.914"></a>
+<span class="sourceLineNo">915</span> }<a name="line.915"></a>
+<span class="sourceLineNo">916</span> } else {<a name="line.916"></a>
+<span class="sourceLineNo">917</span> currentBuffer.skip(current.tagsCompressedLength);<a name="line.917"></a>
+<span class="sourceLineNo">918</span> current.uncompressTags = true;// Reset this.<a name="line.918"></a>
+<span class="sourceLineNo">919</span> }<a name="line.919"></a>
+<span class="sourceLineNo">920</span> current.tagsOffset = -1;<a name="line.920"></a>
+<span class="sourceLineNo">921</span> } else {<a name="line.921"></a>
+<span class="sourceLineNo">922</span> // When tag compress is not used, let us not do copying of tags bytes into tagsBuffer.<a name="line.922"></a>
+<span class="sourceLineNo">923</span> // Just mark the tags Offset so as to create the KV buffer later in getKeyValueBuffer()<a name="line.923"></a>
+<span class="sourceLineNo">924</span> current.tagsOffset = currentBuffer.position();<a name="line.924"></a>
+<span class="sourceLineNo">925</span> currentBuffer.skip(current.tagsLength);<a name="line.925"></a>
+<span class="sourceLineNo">926</span> }<a name="line.926"></a>
+<span class="sourceLineNo">927</span> }<a name="line.927"></a>
+<span class="sourceLineNo">928</span><a name="line.928"></a>
+<span class="sourceLineNo">929</span> @Override<a name="line.929"></a>
+<span class="sourceLineNo">930</span> public int seekToKeyInBlock(Cell seekCell, boolean seekBefore) {<a name="line.930"></a>
+<span class="sourceLineNo">931</span> int rowCommonPrefix = 0;<a name="line.931"></a>
+<span class="sourceLineNo">932</span> int familyCommonPrefix = 0;<a name="line.932"></a>
+<span class="sourceLineNo">933</span> int qualCommonPrefix = 0;<a name="line.933"></a>
+<span class="sourceLineNo">934</span> previous.invalidate();<a name="line.934"></a>
+<span class="sourceLineNo">935</span> do {<a name="line.935"></a>
+<span class="sourceLineNo">936</span> int comp;<a name="line.936"></a>
+<span class="sourceLineNo">937</span> keyOnlyKV.setKey(current.keyBuffer, 0, current.keyLength);<a name="line.937"></a>
+<span class="sourceLineNo">938</span> if (current.lastCommonPrefix != 0) {<a name="line.938"></a>
+<span class="sourceLineNo">939</span> // The KV format has row key length also in the byte array. The<a name="line.939"></a>
+<span class="sourceLineNo">940</span> // common prefix<a name="line.940"></a>
+<span class="sourceLineNo">941</span> // includes it. So we need to subtract to find out the common prefix<a name="line.941"></a>
+<span class="sourceLineNo">942</span> // in the<a name="line.942"></a>
+<span class="sourceLineNo">943</span> // row part alone<a name="line.943"></a>
+<span class="sourceLineNo">944</span> rowCommonPrefix = Math.min(rowCommonPrefix, current.lastCommonPrefix - 2);<a name="line.944"></a>
+<span class="sourceLineNo">945</span> }<a name="line.945"></a>
+<span class="sourceLineNo">946</span> if (current.lastCommonPrefix <= 2) {<a name="line.946"></a>
+<span class="sourceLineNo">947</span> rowCommonPrefix = 0;<a name="line.947"></a>
+<span class="sourceLineNo">948</span> }<a name="line.948"></a>
+<span class="sourceLineNo">949</span> rowCommonPrefix += findCommonPrefixInRowPart(seekCell, keyOnlyKV, rowCommonPrefix);<a name="line.949"></a>
+<span class="sourceLineNo">950</span> comp = compareCommonRowPrefix(seekCell, keyOnlyKV, rowCommonPrefix);<a name="line.950"></a>
+<span class="sourceLineNo">951</span> if (comp == 0) {<a name="line.951"></a>
+<span class="sourceLineNo">952</span> comp = compareTypeBytes(seekCell, keyOnlyKV);<a name="line.952"></a>
+<span class="sourceLineNo">953</span> if (comp == 0) {<a name="line.953"></a>
+<span class="sourceLineNo">954</span> // Subtract the fixed row key length and the family key fixed length<a name="line.954"></a>
+<span class="sourceLineNo">955</span> familyCommonPrefix = Math.max(0, Math.min(familyCommonPrefix,<a name="line.955"></a>
+<span class="sourceLineNo">956</span> current.lastCommonPrefix - (3 + keyOnlyKV.getRowLength())));<a name="line.956"></a>
+<span class="sourceLineNo">957</span> familyCommonPrefix +=<a name="line.957"></a>
+<span class="sourceLineNo">958</span> findCommonPrefixInFamilyPart(seekCell, keyOnlyKV, familyCommonPrefix);<a name="line.958"></a>
+<span class="sourceLineNo">959</span> comp = compareCommonFamilyPrefix(seekCell, keyOnlyKV, familyCommonPrefix);<a name="line.959"></a>
+<span class="sourceLineNo">960</span> if (comp == 0) {<a name="line.960"></a>
+<span class="sourceLineNo">961</span> // subtract the rowkey fixed length and the family key fixed<a name="line.961"></a>
+<span class="sourceLineNo">962</span> // length<a name="line.962"></a>
+<span class="sourceLineNo">963</span> qualCommonPrefix = Math.max(0, Math.min(qualCommonPrefix, current.lastCommonPrefix<a name="line.963"></a>
+<span class="sourceLineNo">964</span> - (3 + keyOnlyKV.getRowLength() + keyOnlyKV.getFamilyLength())));<a name="line.964"></a>
+<span class="sourceLineNo">965</span> qualCommonPrefix +=<a name="line.965"></a>
+<span class="sourceLineNo">966</span> findCommonPrefixInQualifierPart(seekCell, keyOnlyKV, qualCommonPrefix);<a name="line.966"></a>
+<span class="sourceLineNo">967</span> comp = compareCommonQualifierPrefix(seekCell, keyOnlyKV, qualCommonPrefix);<a name="line.967"></a>
+<span class="sourceLineNo">968</span> if (comp == 0) {<a name="line.968"></a>
+<span class="sourceLineNo">969</span> comp = CellComparator.getInstance().compareTimestamps(seekCell, keyOnlyKV);<a name="line.969"></a>
+<span class="sourceLineNo">970</span> if (comp == 0) {<a name="line.970"></a>
+<span class="sourceLineNo">971</span> // Compare types. Let the delete types sort ahead of puts;<a name="line.971"></a>
+<span class="sourceLineNo">972</span> // i.e. types<a name="line.972"></a>
+<span class="sourceLineNo">973</span> // of higher numbers sort before those of lesser numbers.<a name="line.973"></a>
+<span class="sourceLineNo">974</span> // Maximum<a name="line.974"></a>
+<span class="sourceLineNo">975</span> // (255)<a name="line.975"></a>
+<span class="sourceLineNo">976</span> // appears ahead of everything, and minimum (0) appears<a name="line.976"></a>
+<span class="sourceLineNo">977</span> // after<a name="line.977"></a>
+<span class="sourceLineNo">978</span> // everything.<a name="line.978"></a>
+<span class="sourceLineNo">979</span> comp = (0xff & keyOnlyKV.getTypeByte()) - (0xff & seekCell.getTypeByte());<a name="line.979"></a>
+<span class="sourceLineNo">980</span> }<a name="line.980"></a>
+<span class="sourceLineNo">981</span> }<a name="line.981"></a>
+<span class="sourceLineNo">982</span> }<a name="line.982"></a>
+<span class="sourceLineNo">983</span> }<a name="line.983"></a>
+<span class="sourceLineNo">984</span> }<a name="line.984"></a>
+<span class="sourceLineNo">985</span> if (comp == 0) { // exact match<a name="line.985"></a>
+<span class="sourceLineNo">986</span> if (seekBefore) {<a name="line.986"></a>
+<span class="sourceLineNo">987</span> if (!previous.isValid()) {<a name="line.987"></a>
+<span class="sourceLineNo">988</span> // The caller (seekBefore) has to ensure that we are not at the<a name="line.988"></a>
+<span class="sourceLineNo">989</span> // first key in the block.<a name="line.989"></a>
+<span class="sourceLineNo">990</span> throw new IllegalStateException(<a name="line.990"></a>
+<span class="sourceLineNo">991</span> "Cannot seekBefore if " + "positioned at the first key in the block: key="<a name="line.991"></a>
+<span class="sourceLineNo">992</span> + Bytes.toStringBinary(seekCell.getRowArray()));<a name="line.992"></a>
+<span class="sourceLineNo">993</span> }<a name="line.993"></a>
+<span class="sourceLineNo">994</span> moveToPrevious();<a name="line.994"></a>
+<span class="sourceLineNo">995</span> return 1;<a name="line.995"></a>
+<span class="sourceLineNo">996</span> }<a name="line.996"></a>
+<span class="sourceLineNo">997</span> return 0;<a name="line.997"></a>
+<span class="sourceLineNo">998</span> }<a name="line.998"></a>
+<span class="sourceLineNo">999</span><a name="line.999"></a>
+<span class="sourceLineNo">1000</span> if (comp < 0) { // already too large, check previous<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span> if (previous.isValid()) {<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span> moveToPrevious();<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span> } else {<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span> return HConstants.INDEX_KEY_MAGIC; // using optimized index key<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span> }<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span> return 1;<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span> }<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span><a name="line.1008"></a>
+<span class="sourceLineNo">1009</span> // move to next, if more data is available<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span> if (currentBuffer.hasRemaining()) {<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span> previous.copyFromNext(current);<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span> decodeNext();<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span> current.setKey(current.keyBuffer, current.memstoreTS);<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span> } else {<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span> break;<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span> }<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span> } while (true);<a name="line.1017"></a>
<span class="sourceLineNo">1018</span><a name="line.1018"></a>
-<span class="sourceLineNo">1019</span> private int compareTypeBytes(Cell key, Cell right) {<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span> if (<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span> key.getFamilyLength() + key.getQualifierLength() == 0<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span> && key.getTypeByte() == KeyValue.Type.Minimum.getCode()<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span> ) {<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span> // left is "bigger", i.e. it appears later in the sorted order<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span> return 1;<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span> }<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span> if (<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span> right.getFamilyLength() + right.getQualifierLength() == 0<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span> && right.getTypeByte() == KeyValue.Type.Minimum.getCode()<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span> ) {<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span> return -1;<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span> }<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span> return 0;<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span> }<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span><a name="line.1035"></a>
-<span class="sourceLineNo">1036</span> // These findCommonPrefix* methods rely on the fact that keyOnlyKv is the "right" cell argument<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span> // and always on-heap<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span><a name="line.1038"></a>
-<span class="sourceLineNo">1039</span> private static int findCommonPrefixInRowPart(Cell left, KeyValue.KeyOnlyKeyValue right,<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span> int rowCommonPrefix) {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span> if (left instanceof ByteBufferExtendedCell) {<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span> ByteBufferExtendedCell bbLeft = (ByteBufferExtendedCell) left;<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span> return ByteBufferUtils.findCommonPrefix(bbLeft.getRowByteBuffer(),<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span> bbLeft.getRowPosition() + rowCommonPrefix, left.getRowLength() - rowCommonPrefix,<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span> right.getRowArray(), right.getRowOffset() + rowCommonPrefix,<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span> right.getRowLength() - rowCommonPrefix);<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span> } else {<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span> return Bytes.findCommonPrefix(left.getRowArray(), right.getRowArray(),<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span> left.getRowLength() - rowCommonPrefix, right.getRowLength() - rowCommonPrefix,<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span> left.getRowOffset() + rowCommonPrefix, right.getRowOffset() + rowCommonPrefix);<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span> }<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span> }<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span><a name="line.1053"></a>
-<span class="sourceLineNo">1054</span> private static int findCommonPrefixInFamilyPart(Cell left, KeyValue.KeyOnlyKeyValue right,<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span> int familyCommonPrefix) {<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span> if (left instanceof ByteBufferExtendedCell) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span> ByteBufferExtendedCell bbLeft = (ByteBufferExtendedCell) left;<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span> return ByteBufferUtils.findCommonPrefix(bbLeft.getFamilyByteBuffer(),<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span> bbLeft.getFamilyPosition() + familyCommonPrefix,<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span> left.getFamilyLength() - familyCommonPrefix, right.getFamilyArray(),<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span> right.getFamilyOffset() + familyCommonPrefix,<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span> right.getFamilyLength() - familyCommonPrefix);<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span> } else {<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span> return Bytes.findCommonPrefix(left.getFamilyArray(), right.getFamilyArray(),<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span> left.getFamilyLength() - familyCommonPrefix, right.getFamilyLength() - familyCommonPrefix,<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span> left.getFamilyOffset() + familyCommonPrefix,<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span> right.getFamilyOffset() + familyCommonPrefix);<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span> }<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span> }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span><a name="line.1070"></a>
-<span class="sourceLineNo">1071</span> private static int findCommonPrefixInQualifierPart(Cell left, KeyValue.KeyOnlyKeyValue right,<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span> int qualifierCommonPrefix) {<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span> if (left instanceof ByteBufferExtendedCell) {<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span> ByteBufferExtendedCell bbLeft = (ByteBufferExtendedCell) left;<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span> return ByteBufferUtils.findCommonPrefix(bbLeft.getQualifierByteBuffer(),<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span> bbLeft.getQualifierPosition() + qualifierCommonPrefix,<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span> left.getQualifierLength() - qualifierCommonPrefix, right.getQualifierArray(),<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span> right.getQualifierOffset() + qualifierCommonPrefix,<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span> right.getQualifierLength() - qualifierCommonPrefix);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span> } else {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span> return Bytes.findCommonPrefix(left.getQualifierArray(), right.getQualifierArray(),<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span> left.getQualifierLength() - qualifierCommonPrefix,<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span> right.getQualifierLength() - qualifierCommonPrefix,<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span> left.getQualifierOffset() + qualifierCommonPrefix,<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span> right.getQualifierOffset() + qualifierCommonPrefix);<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span> }<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span> }<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span><a name="line.1088"></a>
-<span class="sourceLineNo">1089</span> private void moveToPrevious() {<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span> if (!previous.isValid()) {<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span> throw new IllegalStateException(<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span> "Can move back only once and not in first key in the block.");<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span> }<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span><a name="line.1094"></a>
-<span class="sourceLineNo">1095</span> STATE tmp = previous;<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span> previous = current;<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span> current = tmp;<a name="line.1097"></a>
+<span class="sourceLineNo">1019</span> // we hit the end of the block, not an exact match<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span> return 1;<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> private int compareTypeBytes(Cell key, Cell right) {<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span> if (<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span> key.getFamilyLength() + key.getQualifierLength() == 0<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span> && key.getTypeByte() == KeyValue.Type.Minimum.getCode()<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span> ) {<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span> // left is "bigger", i.e. it appears later in the sorted order<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span> return 1;<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span> }<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span> if (<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span> right.getFamilyLength() + right.getQualifierLength() == 0<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span> && right.getTypeByte() == KeyValue.Type.Minimum.getCode()<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span> ) {<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span> return -1;<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span> }<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span> return 0;<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span> }<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span><a name="line.1039"></a>
+<span class="sourceLineNo">1040</span> // These findCommonPrefix* methods rely on the fact that keyOnlyKv is the "right" cell argument<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span> // and always on-heap<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span><a name="line.1042"></a>
+<span class="sourceLineNo">1043</span> private static int findCommonPrefixInRowPart(Cell left, KeyValue.KeyOnlyKeyValue right,<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span> int rowCommonPrefix) {<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span> if (left instanceof ByteBufferExtendedCell) {<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span> ByteBufferExtendedCell bbLeft = (ByteBufferExtendedCell) left;<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span> return ByteBufferUtils.findCommonPrefix(bbLeft.getRowByteBuffer(),<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span> bbLeft.getRowPosition() + rowCommonPrefix, left.getRowLength() - rowCommonPrefix,<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span> right.getRowArray(), right.getRowOffset() + rowCommonPrefix,<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span> right.getRowLength() - rowCommonPrefix);<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span> } else {<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span> return Bytes.findCommonPrefix(left.getRowArray(), right.getRowArray(),<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span> left.getRowLength() - rowCommonPrefix, right.getRowLength() - rowCommonPrefix,<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span> left.getRowOffset() + rowCommonPrefix, right.getRowOffset() + rowCommonPrefix);<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span> }<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span> }<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span> private static int findCommonPrefixInFamilyPart(Cell left, KeyValue.KeyOnlyKeyValue right,<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span> int familyCommonPrefix) {<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span> if (left instanceof ByteBufferExtendedCell) {<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span> ByteBufferExtendedCell bbLeft = (ByteBufferExtendedCell) left;<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span> return ByteBufferUtils.findCommonPrefix(bbLeft.getFamilyByteBuffer(),<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span> bbLeft.getFamilyPosition() + familyCommonPrefix,<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span> left.getFamilyLength() - familyCommonPrefix, right.getFamilyArray(),<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span> right.getFamilyOffset() + familyCommonPrefix,<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span> right.getFamilyLength() - familyCommonPrefix);<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span> } else {<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span> return Bytes.findCommonPrefix(left.getFamilyArray(), right.getFamilyArray(),<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span> left.getFamilyLength() - familyCommonPrefix, right.getFamilyLength() - familyCommonPrefix,<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span> left.getFamilyOffset() + familyCommonPrefix,<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span> right.getFamilyOffset() + familyCommonPrefix);<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span> }<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span> }<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span><a name="line.1074"></a>
+<span class="sourceLineNo">1075</span> private static int findCommonPrefixInQualifierPart(Cell left, KeyValue.KeyOnlyKeyValue right,<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span> int qualifierCommonPrefix) {<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span> if (left instanceof ByteBufferExtendedCell) {<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span> ByteBufferExtendedCell bbLeft = (ByteBufferExtendedCell) left;<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span> return ByteBufferUtils.findCommonPrefix(bbLeft.getQualifierByteBuffer(),<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span> bbLeft.getQualifierPosition() + qualifierCommonPrefix,<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span> left.getQualifierLength() - qualifierCommonPrefix, right.getQualifierArray(),<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span> right.getQualifierOffset() + qualifierCommonPrefix,<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span> right.getQualifierLength() - qualifierCommonPrefix);<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span> } else {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span> return Bytes.findCommonPrefix(left.getQualifierArray(), right.getQualifierArray(),<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span> left.getQualifierLength() - qualifierCommonPrefix,<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span> right.getQualifierLength() - qualifierCommonPrefix,<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span> left.getQualifierOffset() + qualifierCommonPrefix,<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span> right.getQualifierOffset() + qualifierCommonPrefix);<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> private void moveToPrevious() {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span> if (!previous.isValid()) {<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span> throw new IllegalStateException(<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span> "Can move back only once and not in first key in the block.");<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span> }<a name="line.1097"></a>
<span class="sourceLineNo">1098</span><a name="line.1098"></a>
-<span class="sourceLineNo">1099</span> // move after last key value<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span> currentBuffer.position(current.nextKvOffset);<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span> // Already decoded the tag bytes. We cache this tags into current state and also the total<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span> // compressed length of the tags bytes. For the next time decodeNext() we don't need to decode<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span> // the tags again. This might pollute the Data Dictionary what we use for the compression.<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span> // When current.uncompressTags is false, we will just reuse the current.tagsBuffer and skip<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span> // 'tagsCompressedLength' bytes of source stream.<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span> // See in decodeTags()<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span> current.tagsBuffer = previous.tagsBuffer;<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span> current.tagsCompressedLength = previous.tagsCompressedLength;<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span> current.uncompressTags = false;<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span> // The current key has to be reset with the previous Cell<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span> current.setKey(current.keyBuffer, current.memstoreTS);<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span> previous.invalidate();<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span> }<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span><a name="line.1114"></a>
-<span class="sourceLineNo">1115</span> @SuppressWarnings("unchecked")<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span> protected STATE createSeekerState() {<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span> // This will fail for non-default seeker state if the subclass does not<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span> // override this method.<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span> return (STATE) new SeekerState(this.tmpPair, this.includesTags());<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span> }<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span><a name="line.1121"></a>
-<span class="sourceLineNo">1122</span> abstract protected void decodeFirst();<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span><a name="line.1123"></a>
-<span class="sourceLineNo">1124</span> abstract protected void decodeNext();<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span> }<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span><a name="line.1126"></a>
-<span class="sourceLineNo">1127</span> /** Returns unencoded size added */<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span> protected final int afterEncodingKeyValue(Cell cell, DataOutputStream out,<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span> HFileBlockDefaultEncodingContext encodingCtx) throws IOException {<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span> int size = 0;<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span> if (encodingCtx.getHFileContext().isIncludesTags()) {<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span> int tagsLength = cell.getTagsLength();<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span> ByteBufferUtils.putCompressedInt(out, tagsLength);<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span> // There are some tags to be written<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span> if (tagsLength > 0) {<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span> TagCompressionContext tagCompressionContext = encodingCtx.getTagCompressionContext();<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span> // When tag compression is enabled, tagCompressionContext will have a not null value. Write<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span> // the tags using Dictionary compression in such a case<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span> if (tagCompressionContext != null) {<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span> // Not passing tagsLength considering that parsing of the tagsLength is not costly<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span> PrivateCellUtil.compressTags(out, cell, tagCompressionContext);<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span> } else {<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span> PrivateCellUtil.writeTags(out, cell, tagsLength);<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> size += tagsLength + KeyValue.TAGS_LENGTH_SIZE;<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span> }<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span> if (encodingCtx.getHFileContext().isIncludesMvcc()) {<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span> // Copy memstore timestamp from the byte buffer to the output stream.<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span> long memstoreTS = cell.getSequenceId();<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span> WritableUtils.writeVLong(out, memstoreTS);<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span> // TODO use a writeVLong which returns the #bytes written so that 2 time parsing can be<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span> // avoided.<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span> size += WritableUtils.getVIntSize(memstoreTS);<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span> }<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span> return size;<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span> }<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span><a name="line.1158"></a>
-<span class="sourceLineNo">1159</span> protected final void afterDecodingKeyValue(DataInputStream source, ByteBuffer dest,<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span> HFileBlockDefaultDecodingContext decodingCtx) throws IOException {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span> if (decodingCtx.getHFileContext().isIncludesTags()) {<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span> int tagsLength = ByteBufferUtils.readCompressedInt(source);<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span> // Put as unsigned short<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span> dest.put((byte) ((tagsLength >> 8) & 0xff));<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span> dest.put((byte) (tagsLength & 0xff));<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span> if (tagsLength > 0) {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span> TagCompressionContext tagCompressionContext = decodingCtx.getTagCompressionContext();<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span> // When tag compression is been used in this file, tagCompressionContext will have a not<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span> // null value passed.<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span> if (tagCompressionContext != null) {<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span> tagCompressionContext.uncompressTags(source, dest, tagsLength);<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span> } else {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span> ByteBufferUtils.copyFromStreamToBuffer(dest, source, tagsLength);<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span> }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span> }<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span> }<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span> if (decodingCtx.getHFileContext().isIncludesMvcc()) {<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span> long memstoreTS = -1;<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span> try {<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span> // Copy memstore timestamp from the data input stream to the byte<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span> // buffer.<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span> memstoreTS = WritableUtils.readVLong(source);<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span> ByteBufferUtils.writeVLong(dest, memstoreTS);<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span> } catch (IOException ex) {<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span> throw new RuntimeException(<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span> "Unable to copy memstore timestamp " + memstoreTS + " after decoding a key/value");<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span> }<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> protected abstract ByteBuffer internalDecodeKeyValues(DataInputStream source,<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span> int allocateHeaderLength, int skipLastBytes, HFileBlockDefaultDecodingContext decodingCtx)<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span> throws IOException;<a name="line.1193"></a>
+<span class="sourceLineNo">1099</span> STATE tmp = previous;<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span> previous = current;<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span> current = tmp;<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span><a name="line.1102"></a>
+<span class="sourceLineNo">1103</span> // move after last key value<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span> currentBuffer.position(current.nextKvOffset);<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span> // Already decoded the tag bytes. We cache this tags into current state and also the total<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span> // compressed length of the tags bytes. For the next time decodeNext() we don't need to decode<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span> // the tags again. This might pollute the Data Dictionary what we use for the compression.<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span> // When current.uncompressTags is false, we will just reuse the current.tagsBuffer and skip<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span> // 'tagsCompressedLength' bytes of source stream.<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span> // See in decodeTags()<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span> current.tagsBuffer = previous.tagsBuffer;<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span> current.tagsCompressedLength = previous.tagsCompressedLength;<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span> current.uncompressTags = false;<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span> // The current key has to be reset with the previous Cell<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span> current.setKey(current.keyBuffer, current.memstoreTS);<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span> previous.invalidate();<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span> }<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span><a name="line.1118"></a>
+<span class="sourceLineNo">1119</span> @SuppressWarnings("unchecked")<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span> protected STATE createSeekerState() {<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span> // This will fail for non-default seeker state if the subclass does not<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span> // override this method.<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span> return (STATE) new SeekerState(this.tmpPair, this.includesTags());<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span> }<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span><a name="line.1125"></a>
+<span class="sourceLineNo">1126</span> abstract protected void decodeFirst();<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span><a name="line.1127"></a>
+<span class="sourceLineNo">1128</span> abstract protected void decodeNext();<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span> }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span><a name="line.1130"></a>
+<span class="sourceLineNo">1131</span> /** Returns unencoded size added */<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span> protected final int afterEncodingKeyValue(Cell cell, DataOutputStream out,<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span> HFileBlockDefaultEncodingContext encodingCtx) throws IOException {<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span> int size = 0;<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span> if (encodingCtx.getHFileContext().isIncludesTags()) {<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span> int tagsLength = cell.getTagsLength();<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span> ByteBufferUtils.putCompressedInt(out, tagsLength);<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span> // There are some tags to be written<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span> if (tagsLength > 0) {<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span> TagCompressionContext tagCompressionContext = encodingCtx.getTagCompressionContext();<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span> // When tag compression is enabled, tagCompressionContext will have a not null value. Write<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span> // the tags using Dictionary compression in such a case<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span> if (tagCompressionContext != null) {<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span> // Not passing tagsLength considering that parsing of the tagsLength is not costly<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span> PrivateCellUtil.compressTags(out, cell, tagCompressionContext);<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span> } else {<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span> PrivateCellUtil.writeTags(out, cell, tagsLength);<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span> }<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span> }<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span> size += tagsLength + KeyValue.TAGS_LENGTH_SIZE;<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span> }<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span> if (encodingCtx.getHFileContext().isIncludesMvcc()) {<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span> // Copy memstore timestamp from the byte buffer to the output stream.<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span> long memstoreTS = cell.getSequenceId();<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span> WritableUtils.writeVLong(out, memstoreTS);<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span> // TODO use a writeVLong which returns the #bytes written so that 2 time parsing can be<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span> // avoided.<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span> size += WritableUtils.getVIntSize(memstoreTS);<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span> }<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span> return size;<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span> }<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span><a name="line.1162"></a>
+<span class="sourceLineNo">1163</span> protected final void afterDecodingKeyValue(DataInputStream source, ByteBuffer dest,<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span> HFileBlockDefaultDecodingContext decodingCtx) throws IOException {<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span> if (decodingCtx.getHFileContext().isIncludesTags()) {<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span> int tagsLength = ByteBufferUtils.readCompressedInt(source);<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span> // Put as unsigned short<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span> dest.put((byte) ((tagsLength >> 8) & 0xff));<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span> dest.put((byte) (tagsLength & 0xff));<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span> if (tagsLength > 0) {<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span> TagCompressionContext tagCompressionContext = decodingCtx.getTagCompressionContext();<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span> // When tag compression is been used in this file, tagCompressionContext will have a not<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span> // null value passed.<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span> if (tagCompressionContext != null) {<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span> tagCompressionContext.uncompressTags(source, dest, tagsLength);<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span> } else {<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span> ByteBufferUtils.copyFromStreamToBuffer(dest, source, tagsLength);<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> }<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span> if (decodingCtx.getHFileContext().isIncludesMvcc()) {<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span> long memstoreTS = -1;<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span> try {<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span> // Copy memstore timestamp from the data input stream to the byte<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span> // buffer.<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span> memstoreTS = WritableUtils.readVLong(source);<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span> ByteBufferUtils.writeVLong(dest, memstoreTS);<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span> } catch (IOException ex) {<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span> throw new RuntimeException(<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span> "Unable to copy memstore timestamp " + memstoreTS + " after decoding a key/value");<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> }<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> * Asserts that there is at least the given amount of unfilled space remaining in the given<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span> * buffer.<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span> * @param out typically, the buffer we are writing to<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span> * @param length the required space in the buffer<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span> * @throws EncoderBufferTooSmallException If there are no enough bytes.<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span> */<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span> protected static void ensureSpace(ByteBuffer out, int length)<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span> throws EncoderBufferTooSmallException {<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span> if (out.position() + length > out.limit()) {<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span> throw new EncoderBufferTooSmallException("Buffer position=" + out.position()<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span> + ", buffer limit=" + out.limit() + ", length to be written=" + length);<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span> }<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span> }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span> @Override<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span> public void startBlockEncoding(HFileBlockEncodingContext blkEncodingCtx, DataOutputStream out)<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span> throws IOException {<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span> if (blkEncodingCtx.getClass() != HFileBlockDefaultEncodingContext.class) {<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span> throw new IOException(this.getClass().getName() + " only accepts "<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span> + HFileBlockDefaultEncodingContext.class.getName() + " as the " + "encoding context.");<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span> }<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span><a name="line.1217"></a>
-<span class="sourceLineNo">1218</span> HFileBlockDefaultEncodingContext encodingCtx =<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span> (HFileBlockDefaultEncodingContext) blkEncodingCtx;<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span> encodingCtx.prepareEncoding(out);<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span> if (<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span> encodingCtx.getHFileContext().isIncludesTags()<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span> && encodingCtx.getHFileContext().isCompressTags()<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span> ) {<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span> if (encodingCtx.getTagCompressionContext() != null) {<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span> // It will be overhead to create the TagCompressionContext again and again for every block<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span> // encoding.<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span> encodingCtx.getTagCompressionContext().clear();<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span> } else {<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span> try {<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span> TagCompressionContext tagCompressionContext =<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span> new TagCompressionContext(LRUDictionary.class, Byte.MAX_VALUE);<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span> encodingCtx.setTagCompressionContext(tagCompressionContext);<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span> } catch (Exception e) {<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span> throw new IOException("Failed to initialize TagCompressionContext", e);<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span> }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span> }<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span> }<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span> StreamUtils.writeInt(out, 0); // DUMMY length. This will be updated in endBlockEncoding()<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span> blkEncodingCtx.setEncodingState(new EncodingState());<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span> }<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span><a name="line.1242"></a>
-<span class="sourceLineNo">1243</span> @Override<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span> public void encode(Cell cell, HFileBlockEncodingContext encodingCtx, DataOutputStream out)<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span> throws IOException {<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span> EncodingState state = encodingCtx.getEncodingState();<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span> int posBeforeEncode = out.size();<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span> int encodedKvSize = internalEncode(cell, (HFileBlockDefaultEncodingContext) encodingCtx, out);<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span> state.postCellEncode(encodedKvSize, out.size() - posBeforeEncode);<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span> }<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span> public abstract int internalEncode(Cell cell, HFileBlockDefaultEncodingContext encodingCtx,<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span> DataOutputStream out) throws IOException;<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span><a name="line.1254"></a>
-<span class="sourceLineNo">1255</span> @Override<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span> public void endBlockEncoding(HFileBlockEncodingContext encodingCtx, DataOutputStream out,<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span> byte[] uncompressedBytesWithHeader) throws IOException {<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span> EncodingState state = encodingCtx.getEncodingState();<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span> // Write the unencodedDataSizeWritten (with header size)<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span> Bytes.putInt(uncompressedBytesWithHeader,<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span> HConstants.HFILEBLOCK_HEADER_SIZE + DataBlockEncoding.ID_SIZE,<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span> state.getUnencodedDataSizeWritten());<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span> postEncoding(encodingCtx);<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span> }<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span><a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>}<a name="line.1266"></a>
+<span class="sourceLineNo">1195</span> protected abstract ByteBuffer internalDecodeKeyValues(DataInputStream source,<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span> int allocateHeaderLength, int skipLastBytes, HFileBlockDefaultDecodingContext decodingCtx)<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span> throws IOException;<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> * Asserts that there is at least the given amount of unfilled space remaining in the given<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span> * buffer.<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span> * @param out typically, the buffer we are writing to<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span> * @param length the required space in the buffer<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span> * @throws EncoderBufferTooSmallException If there are no enough bytes.<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span> */<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span> protected static void ensureSpace(ByteBuffer out, int length)<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span> throws EncoderBufferTooSmallException {<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span> if (out.position() + length > out.limit()) {<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span> throw new EncoderBufferTooSmallException("Buffer position=" + out.position()<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span> + ", buffer limit=" + out.limit() + ", length to be written=" + length);<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span> }<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span> }<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span><a name="line.1213"></a>
+<span class="sourceLineNo">1214</span> @Override<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span> public void startBlockEncoding(HFileBlockEncodingContext blkEncodingCtx, DataOutputStream out)<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span> throws IOException {<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span> if (blkEncodingCtx.getClass() != HFileBlockDefaultEncodingContext.class) {<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span> throw new IOException(this.getClass().getName() + " only accepts "<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span> + HFileBlockDefaultEncodingContext.class.getName() + " as the " + "encoding context.");<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span> }<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span><a name="line.1221"></a>
+<span class="sourceLineNo">1222</span> HFileBlockDefaultEncodingContext encodingCtx =<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span> (HFileBlockDefaultEncodingContext) blkEncodingCtx;<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span> encodingCtx.prepareEncoding(out);<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span> if (<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span> encodingCtx.getHFileContext().isIncludesTags()<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span> && encodingCtx.getHFileContext().isCompressTags()<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span> ) {<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span> if (encodingCtx.getTagCompressionContext() != null) {<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span> // It will be overhead to create the TagCompressionContext again and again for every block<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span> // encoding.<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span> encodingCtx.getTagCompressionContext().clear();<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span> } else {<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span> try {<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span> TagCompressionContext tagCompressionContext =<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span> new TagCompressionContext(LRUDictionary.class, Byte.MAX_VALUE);<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span> encodingCtx.setTagCompressionContext(tagCompressionContext);<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span> } catch (Exception e) {<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span> throw new IOException("Failed to initialize TagCompressionContext", e);<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span> }<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span> }<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span> }<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span> StreamUtils.writeInt(out, 0); // DUMMY length. This will be updated in endBlockEncoding()<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span> blkEncodingCtx.setEncodingState(new EncodingState());<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span> }<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span><a name="line.1246"></a>
+<span class="sourceLineNo">1247</span> @Override<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span> public void encode(Cell cell, HFileBlockEncodingContext encodingCtx, DataOutputStream out)<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span> throws IOException {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span> EncodingState state = encodingCtx.getEncodingState();<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span> int posBeforeEncode = out.size();<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span> int encodedKvSize = internalEncode(cell, (HFileBlockDefaultEncodingContext) encodingCtx, out);<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span> state.postCellEncode(encodedKvSize, out.size() - posBeforeEncode);<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> public abstract int internalEncode(Cell cell, HFileBlockDefaultEncodingContext encodingCtx,<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span> DataOutputStream out) throws IOException;<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span><a name="line.1258"></a>
+<span class="sourceLineNo">1259</span> @Override<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span> public void endBlockEncoding(HFileBlockEncodingContext encodingCtx, DataOutputStream out,<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span> byte[] uncompressedBytesWithHeader) throws IOException {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span> EncodingState state = encodingCtx.getEncodingState();<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span> // Write the unencodedDataSizeWritten (with header size)<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span> Bytes.putInt(uncompressedBytesWithHeader,<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span> HConstants.HFILEBLOCK_HEADER_SIZE + DataBlockEncoding.ID_SIZE,<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span> state.getUnencodedDataSizeWritten());<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span> postEncoding(encodingCtx);<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span> }<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span><a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>}<a name="line.1270"></a>
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.OnheapDecodedCell.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.OnheapDecodedCell.html
index 5cdb93fd392..819724d6731 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.OnheapDecodedCell.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.OnheapDecodedCell.html
@@ -842,436 +842,440 @@
<span class="sourceLineNo">834</span> public void setCurrentBuffer(ByteBuff buffer) {<a name="line.834"></a>
<span class="sourceLineNo">835</span> if (this.tagCompressionContext != null) {<a name="line.835"></a>
<span class="sourceLineNo">836</span> this.tagCompressionContext.clear();<a name="line.836"></a>
-<span class="sourceLineNo">837</span> }<a name="line.837"></a>
-<span class="sourceLineNo">838</span> currentBuffer = buffer;<a name="line.838"></a>
-<span class="sourceLineNo">839</span> current.currentBuffer = currentBuffer;<a name="line.839"></a>
-<span class="sourceLineNo">840</span> if (tagCompressionContext != null) {<a name="line.840"></a>
-<span class="sourceLineNo">841</span> current.tagCompressionContext = tagCompressionContext;<a name="line.841"></a>
-<span class="sourceLineNo">842</span> }<a name="line.842"></a>
-<span class="sourceLineNo">843</span> decodeFirst();<a name="line.843"></a>
-<span class="sourceLineNo">844</span> current.setKey(current.keyBuffer, current.memstoreTS);<a name="line.844"></a>
-<span class="sourceLineNo">845</span> previous.invalidate();<a name="line.845"></a>
-<span class="sourceLineNo">846</span> }<a name="line.846"></a>
-<span class="sourceLineNo">847</span><a name="line.847"></a>
-<span class="sourceLineNo">848</span> @Override<a name="line.848"></a>
-<span class="sourceLineNo">849</span> public Cell getKey() {<a name="line.849"></a>
-<span class="sourceLineNo">850</span> byte[] key = new byte[current.keyLength];<a name="line.850"></a>
-<span class="sourceLineNo">851</span> System.arraycopy(current.keyBuffer, 0, key, 0, current.keyLength);<a name="line.851"></a>
-<span class="sourceLineNo">852</span> return new KeyValue.KeyOnlyKeyValue(key);<a name="line.852"></a>
+<span class="sourceLineNo">837</span><a name="line.837"></a>
+<span class="sourceLineNo">838</span> // Prior seekToKeyInBlock may have reset this to false if we fell back to previous<a name="line.838"></a>
+<span class="sourceLineNo">839</span> // seeker state. This is an optimization so we don't have to uncompress tags again when<a name="line.839"></a>
+<span class="sourceLineNo">840</span> // reading last state.<a name="line.840"></a>
+<span class="sourceLineNo">841</span> // In seekBefore flow, if block change happens then rewind is not called and<a name="line.841"></a>
+<span class="sourceLineNo">842</span> // setCurrentBuffer is called, so need to uncompress any tags we see.<a name="line.842"></a>
+<span class="sourceLineNo">843</span> current.uncompressTags = true;<a name="line.843"></a>
+<span class="sourceLineNo">844</span> }<a name="line.844"></a>
+<span class="sourceLineNo">845</span> currentBuffer = buffer;<a name="line.845"></a>
+<span class="sourceLineNo">846</span> current.currentBuffer = currentBuffer;<a name="line.846"></a>
+<span class="sourceLineNo">847</span> if (tagCompressionContext != null) {<a name="line.847"></a>
+<span class="sourceLineNo">848</span> current.tagCompressionContext = tagCompressionContext;<a name="line.848"></a>
+<span class="sourceLineNo">849</span> }<a name="line.849"></a>
+<span class="sourceLineNo">850</span> decodeFirst();<a name="line.850"></a>
+<span class="sourceLineNo">851</span> current.setKey(current.keyBuffer, current.memstoreTS);<a name="line.851"></a>
+<span class="sourceLineNo">852</span> previous.invalidate();<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> @Override<a name="line.855"></a>
-<span class="sourceLineNo">856</span> public ByteBuffer getValueShallowCopy() {<a name="line.856"></a>
-<span class="sourceLineNo">857</span> currentBuffer.asSubByteBuffer(current.valueOffset, current.valueLength, tmpPair);<a name="line.857"></a>
-<span class="sourceLineNo">858</span> ByteBuffer dup = tmpPair.getFirst().duplicate();<a name="line.858"></a>
-<span class="sourceLineNo">859</span> dup.position(tmpPair.getSecond());<a name="line.859"></a>
-<span class="sourceLineNo">860</span> dup.limit(tmpPair.getSecond() + current.valueLength);<a name="line.860"></a>
-<span class="sourceLineNo">861</span> return dup.slice();<a name="line.861"></a>
-<span class="sourceLineNo">862</span> }<a name="line.862"></a>
-<span class="sourceLineNo">863</span><a name="line.863"></a>
-<span class="sourceLineNo">864</span> @Override<a name="line.864"></a>
-<span class="sourceLineNo">865</span> public Cell getCell() {<a name="line.865"></a>
-<span class="sourceLineNo">866</span> return current.toCell();<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> @Override<a name="line.869"></a>
-<span class="sourceLineNo">870</span> public void rewind() {<a name="line.870"></a>
-<span class="sourceLineNo">871</span> currentBuffer.rewind();<a name="line.871"></a>
-<span class="sourceLineNo">872</span> if (tagCompressionContext != null) {<a name="line.872"></a>
-<span class="sourceLineNo">873</span> tagCompressionContext.clear();<a name="line.873"></a>
-<span class="sourceLineNo">874</span> // Prior seekToKeyInBlock may have reset this to false if we fell back to previous<a name="line.874"></a>
-<span class="sourceLineNo">875</span> // seeker state. This is an optimization so we don't have to uncompress tags again when<a name="line.875"></a>
-<span class="sourceLineNo">876</span> // reading last state.<a name="line.876"></a>
-<span class="sourceLineNo">877</span> // In case of rewind, we are starting from the beginning of the buffer, so we need<a name="line.877"></a>
-<span class="sourceLineNo">878</span> // to uncompress any tags we see.<a name="line.878"></a>
-<span class="sourceLineNo">879</span> // It may make sense to reset this in setCurrentBuffer as well, but we seem to only call<a name="line.879"></a>
-<span class="sourceLineNo">880</span> // setCurrentBuffer after StoreFileScanner.seekAtOrAfter which calls next to consume the<a name="line.880"></a>
-<span class="sourceLineNo">881</span> // seeker state. Rewind is called by seekBefore, which doesn't and leaves us in this state.<a name="line.881"></a>
-<span class="sourceLineNo">882</span> current.uncompressTags = true;<a name="line.882"></a>
-<span class="sourceLineNo">883</span> }<a name="line.883"></a>
-<span class="sourceLineNo">884</span> decodeFirst();<a name="line.884"></a>
-<span class="sourceLineNo">885</span> current.setKey(current.keyBuffer, current.memstoreTS);<a name="line.885"></a>
-<span class="sourceLineNo">886</span> previous.invalidate();<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>
-<span class="sourceLineNo">889</span> @Override<a name="line.889"></a>
-<span class="sourceLineNo">890</span> public boolean next() {<a name="line.890"></a>
-<span class="sourceLineNo">891</span> if (!currentBuffer.hasRemaining()) {<a name="line.891"></a>
-<span class="sourceLineNo">892</span> return false;<a name="line.892"></a>
-<span class="sourceLineNo">893</span> }<a name="line.893"></a>
-<span class="sourceLineNo">894</span> decodeNext();<a name="line.894"></a>
-<span class="sourceLineNo">895</span> current.setKey(current.keyBuffer, current.memstoreTS);<a name="line.895"></a>
-<span class="sourceLineNo">896</span> previous.invalidate();<a name="line.896"></a>
-<span class="sourceLineNo">897</span> return true;<a name="line.897"></a>
-<span class="sourceLineNo">898</span> }<a name="line.898"></a>
-<span class="sourceLineNo">899</span><a name="line.899"></a>
-<span class="sourceLineNo">900</span> protected void decodeTags() {<a name="line.900"></a>
-<span class="sourceLineNo">901</span> current.tagsLength = ByteBuff.readCompressedInt(currentBuffer);<a name="line.901"></a>
-<span class="sourceLineNo">902</span> if (tagCompressionContext != null) {<a name="line.902"></a>
-<span class="sourceLineNo">903</span> if (current.uncompressTags) {<a name="line.903"></a>
-<span class="sourceLineNo">904</span> // Tag compression is been used. uncompress it into tagsBuffer<a name="line.904"></a>
-<span class="sourceLineNo">905</span> current.ensureSpaceForTags();<a name="line.905"></a>
-<span class="sourceLineNo">906</span> try {<a name="line.906"></a>
-<span class="sourceLineNo">907</span> current.tagsCompressedLength = tagCompressionContext.uncompressTags(currentBuffer,<a name="line.907"></a>
-<span class="sourceLineNo">908</span> current.tagsBuffer, 0, current.tagsLength);<a name="line.908"></a>
-<span class="sourceLineNo">909</span> } catch (Exception e) {<a name="line.909"></a>
-<span class="sourceLineNo">910</span> throw new RuntimeException("Exception while uncompressing tags", e);<a name="line.910"></a>
-<span class="sourceLineNo">911</span> }<a name="line.911"></a>
-<span class="sourceLineNo">912</span> } else {<a name="line.912"></a>
-<span class="sourceLineNo">913</span> currentBuffer.skip(current.tagsCompressedLength);<a name="line.913"></a>
-<span class="sourceLineNo">914</span> current.uncompressTags = true;// Reset this.<a name="line.914"></a>
-<span class="sourceLineNo">915</span> }<a name="line.915"></a>
-<span class="sourceLineNo">916</span> current.tagsOffset = -1;<a name="line.916"></a>
-<span class="sourceLineNo">917</span> } else {<a name="line.917"></a>
-<span class="sourceLineNo">918</span> // When tag compress is not used, let us not do copying of tags bytes into tagsBuffer.<a name="line.918"></a>
-<span class="sourceLineNo">919</span> // Just mark the tags Offset so as to create the KV buffer later in getKeyValueBuffer()<a name="line.919"></a>
-<span class="sourceLineNo">920</span> current.tagsOffset = currentBuffer.position();<a name="line.920"></a>
-<span class="sourceLineNo">921</span> currentBuffer.skip(current.tagsLength);<a name="line.921"></a>
-<span class="sourceLineNo">922</span> }<a name="line.922"></a>
-<span class="sourceLineNo">923</span> }<a name="line.923"></a>
-<span class="sourceLineNo">924</span><a name="line.924"></a>
-<span class="sourceLineNo">925</span> @Override<a name="line.925"></a>
-<span class="sourceLineNo">926</span> public int seekToKeyInBlock(Cell seekCell, boolean seekBefore) {<a name="line.926"></a>
-<span class="sourceLineNo">927</span> int rowCommonPrefix = 0;<a name="line.927"></a>
-<span class="sourceLineNo">928</span> int familyCommonPrefix = 0;<a name="line.928"></a>
-<span class="sourceLineNo">929</span> int qualCommonPrefix = 0;<a name="line.929"></a>
-<span class="sourceLineNo">930</span> previous.invalidate();<a name="line.930"></a>
-<span class="sourceLineNo">931</span> do {<a name="line.931"></a>
-<span class="sourceLineNo">932</span> int comp;<a name="line.932"></a>
-<span class="sourceLineNo">933</span> keyOnlyKV.setKey(current.keyBuffer, 0, current.keyLength);<a name="line.933"></a>
-<span class="sourceLineNo">934</span> if (current.lastCommonPrefix != 0) {<a name="line.934"></a>
-<span class="sourceLineNo">935</span> // The KV format has row key length also in the byte array. The<a name="line.935"></a>
-<span class="sourceLineNo">936</span> // common prefix<a name="line.936"></a>
-<span class="sourceLineNo">937</span> // includes it. So we need to subtract to find out the common prefix<a name="line.937"></a>
-<span class="sourceLineNo">938</span> // in the<a name="line.938"></a>
-<span class="sourceLineNo">939</span> // row part alone<a name="line.939"></a>
-<span class="sourceLineNo">940</span> rowCommonPrefix = Math.min(rowCommonPrefix, current.lastCommonPrefix - 2);<a name="line.940"></a>
-<span class="sourceLineNo">941</span> }<a name="line.941"></a>
-<span class="sourceLineNo">942</span> if (current.lastCommonPrefix <= 2) {<a name="line.942"></a>
-<span class="sourceLineNo">943</span> rowCommonPrefix = 0;<a name="line.943"></a>
-<span class="sourceLineNo">944</span> }<a name="line.944"></a>
-<span class="sourceLineNo">945</span> rowCommonPrefix += findCommonPrefixInRowPart(seekCell, keyOnlyKV, rowCommonPrefix);<a name="line.945"></a>
-<span class="sourceLineNo">946</span> comp = compareCommonRowPrefix(seekCell, keyOnlyKV, rowCommonPrefix);<a name="line.946"></a>
-<span class="sourceLineNo">947</span> if (comp == 0) {<a name="line.947"></a>
-<span class="sourceLineNo">948</span> comp = compareTypeBytes(seekCell, keyOnlyKV);<a name="line.948"></a>
-<span class="sourceLineNo">949</span> if (comp == 0) {<a name="line.949"></a>
-<span class="sourceLineNo">950</span> // Subtract the fixed row key length and the family key fixed length<a name="line.950"></a>
-<span class="sourceLineNo">951</span> familyCommonPrefix = Math.max(0, Math.min(familyCommonPrefix,<a name="line.951"></a>
-<span class="sourceLineNo">952</span> current.lastCommonPrefix - (3 + keyOnlyKV.getRowLength())));<a name="line.952"></a>
-<span class="sourceLineNo">953</span> familyCommonPrefix +=<a name="line.953"></a>
-<span class="sourceLineNo">954</span> findCommonPrefixInFamilyPart(seekCell, keyOnlyKV, familyCommonPrefix);<a name="line.954"></a>
-<span class="sourceLineNo">955</span> comp = compareCommonFamilyPrefix(seekCell, keyOnlyKV, familyCommonPrefix);<a name="line.955"></a>
-<span class="sourceLineNo">956</span> if (comp == 0) {<a name="line.956"></a>
-<span class="sourceLineNo">957</span> // subtract the rowkey fixed length and the family key fixed<a name="line.957"></a>
-<span class="sourceLineNo">958</span> // length<a name="line.958"></a>
-<span class="sourceLineNo">959</span> qualCommonPrefix = Math.max(0, Math.min(qualCommonPrefix, current.lastCommonPrefix<a name="line.959"></a>
-<span class="sourceLineNo">960</span> - (3 + keyOnlyKV.getRowLength() + keyOnlyKV.getFamilyLength())));<a name="line.960"></a>
-<span class="sourceLineNo">961</span> qualCommonPrefix +=<a name="line.961"></a>
-<span class="sourceLineNo">962</span> findCommonPrefixInQualifierPart(seekCell, keyOnlyKV, qualCommonPrefix);<a name="line.962"></a>
-<span class="sourceLineNo">963</span> comp = compareCommonQualifierPrefix(seekCell, keyOnlyKV, qualCommonPrefix);<a name="line.963"></a>
-<span class="sourceLineNo">964</span> if (comp == 0) {<a name="line.964"></a>
-<span class="sourceLineNo">965</span> comp = CellComparator.getInstance().compareTimestamps(seekCell, keyOnlyKV);<a name="line.965"></a>
-<span class="sourceLineNo">966</span> if (comp == 0) {<a name="line.966"></a>
-<span class="sourceLineNo">967</span> // Compare types. Let the delete types sort ahead of puts;<a name="line.967"></a>
-<span class="sourceLineNo">968</span> // i.e. types<a name="line.968"></a>
-<span class="sourceLineNo">969</span> // of higher numbers sort before those of lesser numbers.<a name="line.969"></a>
-<span class="sourceLineNo">970</span> // Maximum<a name="line.970"></a>
-<span class="sourceLineNo">971</span> // (255)<a name="line.971"></a>
-<span class="sourceLineNo">972</span> // appears ahead of everything, and minimum (0) appears<a name="line.972"></a>
-<span class="sourceLineNo">973</span> // after<a name="line.973"></a>
-<span class="sourceLineNo">974</span> // everything.<a name="line.974"></a>
-<span class="sourceLineNo">975</span> comp = (0xff & keyOnlyKV.getTypeByte()) - (0xff & seekCell.getTypeByte());<a name="line.975"></a>
-<span class="sourceLineNo">976</span> }<a name="line.976"></a>
-<span class="sourceLineNo">977</span> }<a name="line.977"></a>
-<span class="sourceLineNo">978</span> }<a name="line.978"></a>
-<span class="sourceLineNo">979</span> }<a name="line.979"></a>
-<span class="sourceLineNo">980</span> }<a name="line.980"></a>
-<span class="sourceLineNo">981</span> if (comp == 0) { // exact match<a name="line.981"></a>
-<span class="sourceLineNo">982</span> if (seekBefore) {<a name="line.982"></a>
-<span class="sourceLineNo">983</span> if (!previous.isValid()) {<a name="line.983"></a>
-<span class="sourceLineNo">984</span> // The caller (seekBefore) has to ensure that we are not at the<a name="line.984"></a>
-<span class="sourceLineNo">985</span> // first key in the block.<a name="line.985"></a>
-<span class="sourceLineNo">986</span> throw new IllegalStateException(<a name="line.986"></a>
-<span class="sourceLineNo">987</span> "Cannot seekBefore if " + "positioned at the first key in the block: key="<a name="line.987"></a>
-<span class="sourceLineNo">988</span> + Bytes.toStringBinary(seekCell.getRowArray()));<a name="line.988"></a>
-<span class="sourceLineNo">989</span> }<a name="line.989"></a>
-<span class="sourceLineNo">990</span> moveToPrevious();<a name="line.990"></a>
-<span class="sourceLineNo">991</span> return 1;<a name="line.991"></a>
-<span class="sourceLineNo">992</span> }<a name="line.992"></a>
-<span class="sourceLineNo">993</span> return 0;<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> if (comp < 0) { // already too large, check previous<a name="line.996"></a>
-<span class="sourceLineNo">997</span> if (previous.isValid()) {<a name="line.997"></a>
-<span class="sourceLineNo">998</span> moveToPrevious();<a name="line.998"></a>
-<span class="sourceLineNo">999</span> } else {<a name="line.999"></a>
-<span class="sourceLineNo">1000</span> return HConstants.INDEX_KEY_MAGIC; // using optimized index key<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span> }<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span> return 1;<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span> }<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span><a name="line.1004"></a>
-<span class="sourceLineNo">1005</span> // move to next, if more data is available<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span> if (currentBuffer.hasRemaining()) {<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span> previous.copyFromNext(current);<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span> decodeNext();<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span> current.setKey(current.keyBuffer, current.memstoreTS);<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span> } else {<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span> break;<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span> }<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span> } while (true);<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span><a name="line.1014"></a>
-<span class="sourceLineNo">1015</span> // we hit the end of the block, not an exact match<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span> return 1;<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span> }<a name="line.1017"></a>
+<span class="sourceLineNo">856</span> public Cell getKey() {<a name="line.856"></a>
+<span class="sourceLineNo">857</span> byte[] key = new byte[current.keyLength];<a name="line.857"></a>
+<span class="sourceLineNo">858</span> System.arraycopy(current.keyBuffer, 0, key, 0, current.keyLength);<a name="line.858"></a>
+<span class="sourceLineNo">859</span> return new KeyValue.KeyOnlyKeyValue(key);<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> @Override<a name="line.862"></a>
+<span class="sourceLineNo">863</span> public ByteBuffer getValueShallowCopy() {<a name="line.863"></a>
+<span class="sourceLineNo">864</span> currentBuffer.asSubByteBuffer(current.valueOffset, current.valueLength, tmpPair);<a name="line.864"></a>
+<span class="sourceLineNo">865</span> ByteBuffer dup = tmpPair.getFirst().duplicate();<a name="line.865"></a>
+<span class="sourceLineNo">866</span> dup.position(tmpPair.getSecond());<a name="line.866"></a>
+<span class="sourceLineNo">867</span> dup.limit(tmpPair.getSecond() + current.valueLength);<a name="line.867"></a>
+<span class="sourceLineNo">868</span> return dup.slice();<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">871</span> @Override<a name="line.871"></a>
+<span class="sourceLineNo">872</span> public Cell getCell() {<a name="line.872"></a>
+<span class="sourceLineNo">873</span> return current.toCell();<a name="line.873"></a>
+<span class="sourceLineNo">874</span> }<a name="line.874"></a>
+<span class="sourceLineNo">875</span><a name="line.875"></a>
+<span class="sourceLineNo">876</span> @Override<a name="line.876"></a>
+<span class="sourceLineNo">877</span> public void rewind() {<a name="line.877"></a>
+<span class="sourceLineNo">878</span> currentBuffer.rewind();<a name="line.878"></a>
+<span class="sourceLineNo">879</span> if (tagCompressionContext != null) {<a name="line.879"></a>
+<span class="sourceLineNo">880</span> tagCompressionContext.clear();<a name="line.880"></a>
+<span class="sourceLineNo">881</span> // Prior seekToKeyInBlock may have reset this to false if we fell back to previous<a name="line.881"></a>
+<span class="sourceLineNo">882</span> // seeker state. This is an optimization so we don't have to uncompress tags again when<a name="line.882"></a>
+<span class="sourceLineNo">883</span> // reading last state.<a name="line.883"></a>
+<span class="sourceLineNo">884</span> // In case of rewind, we are starting from the beginning of the buffer, so we need<a name="line.884"></a>
+<span class="sourceLineNo">885</span> // to uncompress any tags we see.<a name="line.885"></a>
+<span class="sourceLineNo">886</span> current.uncompressTags = true;<a name="line.886"></a>
+<span class="sourceLineNo">887</span> }<a name="line.887"></a>
+<span class="sourceLineNo">888</span> decodeFirst();<a name="line.888"></a>
+<span class="sourceLineNo">889</span> current.setKey(current.keyBuffer, current.memstoreTS);<a name="line.889"></a>
+<span class="sourceLineNo">890</span> previous.invalidate();<a name="line.890"></a>
+<span class="sourceLineNo">891</span> }<a name="line.891"></a>
+<span class="sourceLineNo">892</span><a name="line.892"></a>
+<span class="sourceLineNo">893</span> @Override<a name="line.893"></a>
+<span class="sourceLineNo">894</span> public boolean next() {<a name="line.894"></a>
+<span class="sourceLineNo">895</span> if (!currentBuffer.hasRemaining()) {<a name="line.895"></a>
+<span class="sourceLineNo">896</span> return false;<a name="line.896"></a>
+<span class="sourceLineNo">897</span> }<a name="line.897"></a>
+<span class="sourceLineNo">898</span> decodeNext();<a name="line.898"></a>
+<span class="sourceLineNo">899</span> current.setKey(current.keyBuffer, current.memstoreTS);<a name="line.899"></a>
+<span class="sourceLineNo">900</span> previous.invalidate();<a name="line.900"></a>
+<span class="sourceLineNo">901</span> return true;<a name="line.901"></a>
+<span class="sourceLineNo">902</span> }<a name="line.902"></a>
+<span class="sourceLineNo">903</span><a name="line.903"></a>
+<span class="sourceLineNo">904</span> protected void decodeTags() {<a name="line.904"></a>
+<span class="sourceLineNo">905</span> current.tagsLength = ByteBuff.readCompressedInt(currentBuffer);<a name="line.905"></a>
+<span class="sourceLineNo">906</span> if (tagCompressionContext != null) {<a name="line.906"></a>
+<span class="sourceLineNo">907</span> if (current.uncompressTags) {<a name="line.907"></a>
+<span class="sourceLineNo">908</span> // Tag compression is been used. uncompress it into tagsBuffer<a name="line.908"></a>
+<span class="sourceLineNo">909</span> current.ensureSpaceForTags();<a name="line.909"></a>
+<span class="sourceLineNo">910</span> try {<a name="line.910"></a>
+<span class="sourceLineNo">911</span> current.tagsCompressedLength = tagCompressionContext.uncompressTags(currentBuffer,<a name="line.911"></a>
+<span class="sourceLineNo">912</span> current.tagsBuffer, 0, current.tagsLength);<a name="line.912"></a>
+<span class="sourceLineNo">913</span> } catch (Exception e) {<a name="line.913"></a>
+<span class="sourceLineNo">914</span> throw new RuntimeException("Exception while uncompressing tags", e);<a name="line.914"></a>
+<span class="sourceLineNo">915</span> }<a name="line.915"></a>
+<span class="sourceLineNo">916</span> } else {<a name="line.916"></a>
+<span class="sourceLineNo">917</span> currentBuffer.skip(current.tagsCompressedLength);<a name="line.917"></a>
+<span class="sourceLineNo">918</span> current.uncompressTags = true;// Reset this.<a name="line.918"></a>
+<span class="sourceLineNo">919</span> }<a name="line.919"></a>
+<span class="sourceLineNo">920</span> current.tagsOffset = -1;<a name="line.920"></a>
+<span class="sourceLineNo">921</span> } else {<a name="line.921"></a>
+<span class="sourceLineNo">922</span> // When tag compress is not used, let us not do copying of tags bytes into tagsBuffer.<a name="line.922"></a>
+<span class="sourceLineNo">923</span> // Just mark the tags Offset so as to create the KV buffer later in getKeyValueBuffer()<a name="line.923"></a>
+<span class="sourceLineNo">924</span> current.tagsOffset = currentBuffer.position();<a name="line.924"></a>
+<span class="sourceLineNo">925</span> currentBuffer.skip(current.tagsLength);<a name="line.925"></a>
+<span class="sourceLineNo">926</span> }<a name="line.926"></a>
+<span class="sourceLineNo">927</span> }<a name="line.927"></a>
+<span class="sourceLineNo">928</span><a name="line.928"></a>
+<span class="sourceLineNo">929</span> @Override<a name="line.929"></a>
+<span class="sourceLineNo">930</span> public int seekToKeyInBlock(Cell seekCell, boolean seekBefore) {<a name="line.930"></a>
+<span class="sourceLineNo">931</span> int rowCommonPrefix = 0;<a name="line.931"></a>
+<span class="sourceLineNo">932</span> int familyCommonPrefix = 0;<a name="line.932"></a>
+<span class="sourceLineNo">933</span> int qualCommonPrefix = 0;<a name="line.933"></a>
+<span class="sourceLineNo">934</span> previous.invalidate();<a name="line.934"></a>
+<span class="sourceLineNo">935</span> do {<a name="line.935"></a>
+<span class="sourceLineNo">936</span> int comp;<a name="line.936"></a>
+<span class="sourceLineNo">937</span> keyOnlyKV.setKey(current.keyBuffer, 0, current.keyLength);<a name="line.937"></a>
+<span class="sourceLineNo">938</span> if (current.lastCommonPrefix != 0) {<a name="line.938"></a>
+<span class="sourceLineNo">939</span> // The KV format has row key length also in the byte array. The<a name="line.939"></a>
+<span class="sourceLineNo">940</span> // common prefix<a name="line.940"></a>
+<span class="sourceLineNo">941</span> // includes it. So we need to subtract to find out the common prefix<a name="line.941"></a>
+<span class="sourceLineNo">942</span> // in the<a name="line.942"></a>
+<span class="sourceLineNo">943</span> // row part alone<a name="line.943"></a>
+<span class="sourceLineNo">944</span> rowCommonPrefix = Math.min(rowCommonPrefix, current.lastCommonPrefix - 2);<a name="line.944"></a>
+<span class="sourceLineNo">945</span> }<a name="line.945"></a>
+<span class="sourceLineNo">946</span> if (current.lastCommonPrefix <= 2) {<a name="line.946"></a>
+<span class="sourceLineNo">947</span> rowCommonPrefix = 0;<a name="line.947"></a>
+<span class="sourceLineNo">948</span> }<a name="line.948"></a>
+<span class="sourceLineNo">949</span> rowCommonPrefix += findCommonPrefixInRowPart(seekCell, keyOnlyKV, rowCommonPrefix);<a name="line.949"></a>
+<span class="sourceLineNo">950</span> comp = compareCommonRowPrefix(seekCell, keyOnlyKV, rowCommonPrefix);<a name="line.950"></a>
+<span class="sourceLineNo">951</span> if (comp == 0) {<a name="line.951"></a>
+<span class="sourceLineNo">952</span> comp = compareTypeBytes(seekCell, keyOnlyKV);<a name="line.952"></a>
+<span class="sourceLineNo">953</span> if (comp == 0) {<a name="line.953"></a>
+<span class="sourceLineNo">954</span> // Subtract the fixed row key length and the family key fixed length<a name="line.954"></a>
+<span class="sourceLineNo">955</span> familyCommonPrefix = Math.max(0, Math.min(familyCommonPrefix,<a name="line.955"></a>
+<span class="sourceLineNo">956</span> current.lastCommonPrefix - (3 + keyOnlyKV.getRowLength())));<a name="line.956"></a>
+<span class="sourceLineNo">957</span> familyCommonPrefix +=<a name="line.957"></a>
+<span class="sourceLineNo">958</span> findCommonPrefixInFamilyPart(seekCell, keyOnlyKV, familyCommonPrefix);<a name="line.958"></a>
+<span class="sourceLineNo">959</span> comp = compareCommonFamilyPrefix(seekCell, keyOnlyKV, familyCommonPrefix);<a name="line.959"></a>
+<span class="sourceLineNo">960</span> if (comp == 0) {<a name="line.960"></a>
+<span class="sourceLineNo">961</span> // subtract the rowkey fixed length and the family key fixed<a name="line.961"></a>
+<span class="sourceLineNo">962</span> // length<a name="line.962"></a>
+<span class="sourceLineNo">963</span> qualCommonPrefix = Math.max(0, Math.min(qualCommonPrefix, current.lastCommonPrefix<a name="line.963"></a>
+<span class="sourceLineNo">964</span> - (3 + keyOnlyKV.getRowLength() + keyOnlyKV.getFamilyLength())));<a name="line.964"></a>
+<span class="sourceLineNo">965</span> qualCommonPrefix +=<a name="line.965"></a>
+<span class="sourceLineNo">966</span> findCommonPrefixInQualifierPart(seekCell, keyOnlyKV, qualCommonPrefix);<a name="line.966"></a>
+<span class="sourceLineNo">967</span> comp = compareCommonQualifierPrefix(seekCell, keyOnlyKV, qualCommonPrefix);<a name="line.967"></a>
+<span class="sourceLineNo">968</span> if (comp == 0) {<a name="line.968"></a>
+<span class="sourceLineNo">969</span> comp = CellComparator.getInstance().compareTimestamps(seekCell, keyOnlyKV);<a name="line.969"></a>
+<span class="sourceLineNo">970</span> if (comp == 0) {<a name="line.970"></a>
+<span class="sourceLineNo">971</span> // Compare types. Let the delete types sort ahead of puts;<a name="line.971"></a>
+<span class="sourceLineNo">972</span> // i.e. types<a name="line.972"></a>
+<span class="sourceLineNo">973</span> // of higher numbers sort before those of lesser numbers.<a name="line.973"></a>
+<span class="sourceLineNo">974</span> // Maximum<a name="line.974"></a>
+<span class="sourceLineNo">975</span> // (255)<a name="line.975"></a>
+<span class="sourceLineNo">976</span> // appears ahead of everything, and minimum (0) appears<a name="line.976"></a>
+<span class="sourceLineNo">977</span> // after<a name="line.977"></a>
+<span class="sourceLineNo">978</span> // everything.<a name="line.978"></a>
+<span class="sourceLineNo">979</span> comp = (0xff & keyOnlyKV.getTypeByte()) - (0xff & seekCell.getTypeByte());<a name="line.979"></a>
+<span class="sourceLineNo">980</span> }<a name="line.980"></a>
+<span class="sourceLineNo">981</span> }<a name="line.981"></a>
+<span class="sourceLineNo">982</span> }<a name="line.982"></a>
+<span class="sourceLineNo">983</span> }<a name="line.983"></a>
+<span class="sourceLineNo">984</span> }<a name="line.984"></a>
+<span class="sourceLineNo">985</span> if (comp == 0) { // exact match<a name="line.985"></a>
+<span class="sourceLineNo">986</span> if (seekBefore) {<a name="line.986"></a>
+<span class="sourceLineNo">987</span> if (!previous.isValid()) {<a name="line.987"></a>
+<span class="sourceLineNo">988</span> // The caller (seekBefore) has to ensure that we are not at the<a name="line.988"></a>
+<span class="sourceLineNo">989</span> // first key in the block.<a name="line.989"></a>
+<span class="sourceLineNo">990</span> throw new IllegalStateException(<a name="line.990"></a>
+<span class="sourceLineNo">991</span> "Cannot seekBefore if " + "positioned at the first key in the block: key="<a name="line.991"></a>
+<span class="sourceLineNo">992</span> + Bytes.toStringBinary(seekCell.getRowArray()));<a name="line.992"></a>
+<span class="sourceLineNo">993</span> }<a name="line.993"></a>
+<span class="sourceLineNo">994</span> moveToPrevious();<a name="line.994"></a>
+<span class="sourceLineNo">995</span> return 1;<a name="line.995"></a>
+<span class="sourceLineNo">996</span> }<a name="line.996"></a>
+<span class="sourceLineNo">997</span> return 0;<a name="line.997"></a>
+<span class="sourceLineNo">998</span> }<a name="line.998"></a>
+<span class="sourceLineNo">999</span><a name="line.999"></a>
+<span class="sourceLineNo">1000</span> if (comp < 0) { // already too large, check previous<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span> if (previous.isValid()) {<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span> moveToPrevious();<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span> } else {<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span> return HConstants.INDEX_KEY_MAGIC; // using optimized index key<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span> }<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span> return 1;<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span> }<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span><a name="line.1008"></a>
+<span class="sourceLineNo">1009</span> // move to next, if more data is available<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span> if (currentBuffer.hasRemaining()) {<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span> previous.copyFromNext(current);<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span> decodeNext();<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span> current.setKey(current.keyBuffer, current.memstoreTS);<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span> } else {<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span> break;<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span> }<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span> } while (true);<a name="line.1017"></a>
<span class="sourceLineNo">1018</span><a name="line.1018"></a>
-<span class="sourceLineNo">1019</span> private int compareTypeBytes(Cell key, Cell right) {<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span> if (<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span> key.getFamilyLength() + key.getQualifierLength() == 0<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span> && key.getTypeByte() == KeyValue.Type.Minimum.getCode()<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span> ) {<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span> // left is "bigger", i.e. it appears later in the sorted order<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span> return 1;<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span> }<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span> if (<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span> right.getFamilyLength() + right.getQualifierLength() == 0<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span> && right.getTypeByte() == KeyValue.Type.Minimum.getCode()<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span> ) {<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span> return -1;<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span> }<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span> return 0;<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span> }<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span><a name="line.1035"></a>
-<span class="sourceLineNo">1036</span> // These findCommonPrefix* methods rely on the fact that keyOnlyKv is the "right" cell argument<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span> // and always on-heap<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span><a name="line.1038"></a>
-<span class="sourceLineNo">1039</span> private static int findCommonPrefixInRowPart(Cell left, KeyValue.KeyOnlyKeyValue right,<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span> int rowCommonPrefix) {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span> if (left instanceof ByteBufferExtendedCell) {<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span> ByteBufferExtendedCell bbLeft = (ByteBufferExtendedCell) left;<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span> return ByteBufferUtils.findCommonPrefix(bbLeft.getRowByteBuffer(),<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span> bbLeft.getRowPosition() + rowCommonPrefix, left.getRowLength() - rowCommonPrefix,<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span> right.getRowArray(), right.getRowOffset() + rowCommonPrefix,<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span> right.getRowLength() - rowCommonPrefix);<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span> } else {<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span> return Bytes.findCommonPrefix(left.getRowArray(), right.getRowArray(),<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span> left.getRowLength() - rowCommonPrefix, right.getRowLength() - rowCommonPrefix,<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span> left.getRowOffset() + rowCommonPrefix, right.getRowOffset() + rowCommonPrefix);<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span> }<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span> }<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span><a name="line.1053"></a>
-<span class="sourceLineNo">1054</span> private static int findCommonPrefixInFamilyPart(Cell left, KeyValue.KeyOnlyKeyValue right,<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span> int familyCommonPrefix) {<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span> if (left instanceof ByteBufferExtendedCell) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span> ByteBufferExtendedCell bbLeft = (ByteBufferExtendedCell) left;<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span> return ByteBufferUtils.findCommonPrefix(bbLeft.getFamilyByteBuffer(),<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span> bbLeft.getFamilyPosition() + familyCommonPrefix,<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span> left.getFamilyLength() - familyCommonPrefix, right.getFamilyArray(),<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span> right.getFamilyOffset() + familyCommonPrefix,<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span> right.getFamilyLength() - familyCommonPrefix);<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span> } else {<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span> return Bytes.findCommonPrefix(left.getFamilyArray(), right.getFamilyArray(),<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span> left.getFamilyLength() - familyCommonPrefix, right.getFamilyLength() - familyCommonPrefix,<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span> left.getFamilyOffset() + familyCommonPrefix,<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span> right.getFamilyOffset() + familyCommonPrefix);<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span> }<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span> }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span><a name="line.1070"></a>
-<span class="sourceLineNo">1071</span> private static int findCommonPrefixInQualifierPart(Cell left, KeyValue.KeyOnlyKeyValue right,<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span> int qualifierCommonPrefix) {<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span> if (left instanceof ByteBufferExtendedCell) {<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span> ByteBufferExtendedCell bbLeft = (ByteBufferExtendedCell) left;<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span> return ByteBufferUtils.findCommonPrefix(bbLeft.getQualifierByteBuffer(),<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span> bbLeft.getQualifierPosition() + qualifierCommonPrefix,<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span> left.getQualifierLength() - qualifierCommonPrefix, right.getQualifierArray(),<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span> right.getQualifierOffset() + qualifierCommonPrefix,<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span> right.getQualifierLength() - qualifierCommonPrefix);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span> } else {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span> return Bytes.findCommonPrefix(left.getQualifierArray(), right.getQualifierArray(),<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span> left.getQualifierLength() - qualifierCommonPrefix,<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span> right.getQualifierLength() - qualifierCommonPrefix,<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span> left.getQualifierOffset() + qualifierCommonPrefix,<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span> right.getQualifierOffset() + qualifierCommonPrefix);<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span> }<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span> }<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span><a name="line.1088"></a>
-<span class="sourceLineNo">1089</span> private void moveToPrevious() {<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span> if (!previous.isValid()) {<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span> throw new IllegalStateException(<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span> "Can move back only once and not in first key in the block.");<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span> }<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span><a name="line.1094"></a>
-<span class="sourceLineNo">1095</span> STATE tmp = previous;<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span> previous = current;<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span> current = tmp;<a name="line.1097"></a>
+<span class="sourceLineNo">1019</span> // we hit the end of the block, not an exact match<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span> return 1;<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> private int compareTypeBytes(Cell key, Cell right) {<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span> if (<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span> key.getFamilyLength() + key.getQualifierLength() == 0<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span> && key.getTypeByte() == KeyValue.Type.Minimum.getCode()<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span> ) {<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span> // left is "bigger", i.e. it appears later in the sorted order<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span> return 1;<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span> }<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span> if (<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span> right.getFamilyLength() + right.getQualifierLength() == 0<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span> && right.getTypeByte() == KeyValue.Type.Minimum.getCode()<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span> ) {<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span> return -1;<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span> }<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span> return 0;<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span> }<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span><a name="line.1039"></a>
+<span class="sourceLineNo">1040</span> // These findCommonPrefix* methods rely on the fact that keyOnlyKv is the "right" cell argument<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span> // and always on-heap<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span><a name="line.1042"></a>
+<span class="sourceLineNo">1043</span> private static int findCommonPrefixInRowPart(Cell left, KeyValue.KeyOnlyKeyValue right,<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span> int rowCommonPrefix) {<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span> if (left instanceof ByteBufferExtendedCell) {<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span> ByteBufferExtendedCell bbLeft = (ByteBufferExtendedCell) left;<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span> return ByteBufferUtils.findCommonPrefix(bbLeft.getRowByteBuffer(),<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span> bbLeft.getRowPosition() + rowCommonPrefix, left.getRowLength() - rowCommonPrefix,<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span> right.getRowArray(), right.getRowOffset() + rowCommonPrefix,<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span> right.getRowLength() - rowCommonPrefix);<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span> } else {<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span> return Bytes.findCommonPrefix(left.getRowArray(), right.getRowArray(),<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span> left.getRowLength() - rowCommonPrefix, right.getRowLength() - rowCommonPrefix,<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span> left.getRowOffset() + rowCommonPrefix, right.getRowOffset() + rowCommonPrefix);<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span> }<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span> }<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span> private static int findCommonPrefixInFamilyPart(Cell left, KeyValue.KeyOnlyKeyValue right,<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span> int familyCommonPrefix) {<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span> if (left instanceof ByteBufferExtendedCell) {<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span> ByteBufferExtendedCell bbLeft = (ByteBufferExtendedCell) left;<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span> return ByteBufferUtils.findCommonPrefix(bbLeft.getFamilyByteBuffer(),<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span> bbLeft.getFamilyPosition() + familyCommonPrefix,<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span> left.getFamilyLength() - familyCommonPrefix, right.getFamilyArray(),<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span> right.getFamilyOffset() + familyCommonPrefix,<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span> right.getFamilyLength() - familyCommonPrefix);<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span> } else {<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span> return Bytes.findCommonPrefix(left.getFamilyArray(), right.getFamilyArray(),<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span> left.getFamilyLength() - familyCommonPrefix, right.getFamilyLength() - familyCommonPrefix,<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span> left.getFamilyOffset() + familyCommonPrefix,<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span> right.getFamilyOffset() + familyCommonPrefix);<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span> }<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span> }<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span><a name="line.1074"></a>
+<span class="sourceLineNo">1075</span> private static int findCommonPrefixInQualifierPart(Cell left, KeyValue.KeyOnlyKeyValue right,<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span> int qualifierCommonPrefix) {<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span> if (left instanceof ByteBufferExtendedCell) {<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span> ByteBufferExtendedCell bbLeft = (ByteBufferExtendedCell) left;<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span> return ByteBufferUtils.findCommonPrefix(bbLeft.getQualifierByteBuffer(),<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span> bbLeft.getQualifierPosition() + qualifierCommonPrefix,<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span> left.getQualifierLength() - qualifierCommonPrefix, right.getQualifierArray(),<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span> right.getQualifierOffset() + qualifierCommonPrefix,<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span> right.getQualifierLength() - qualifierCommonPrefix);<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span> } else {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span> return Bytes.findCommonPrefix(left.getQualifierArray(), right.getQualifierArray(),<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span> left.getQualifierLength() - qualifierCommonPrefix,<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span> right.getQualifierLength() - qualifierCommonPrefix,<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span> left.getQualifierOffset() + qualifierCommonPrefix,<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span> right.getQualifierOffset() + qualifierCommonPrefix);<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> private void moveToPrevious() {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span> if (!previous.isValid()) {<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span> throw new IllegalStateException(<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span> "Can move back only once and not in first key in the block.");<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span> }<a name="line.1097"></a>
<span class="sourceLineNo">1098</span><a name="line.1098"></a>
-<span class="sourceLineNo">1099</span> // move after last key value<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span> currentBuffer.position(current.nextKvOffset);<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span> // Already decoded the tag bytes. We cache this tags into current state and also the total<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span> // compressed length of the tags bytes. For the next time decodeNext() we don't need to decode<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span> // the tags again. This might pollute the Data Dictionary what we use for the compression.<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span> // When current.uncompressTags is false, we will just reuse the current.tagsBuffer and skip<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span> // 'tagsCompressedLength' bytes of source stream.<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span> // See in decodeTags()<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span> current.tagsBuffer = previous.tagsBuffer;<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span> current.tagsCompressedLength = previous.tagsCompressedLength;<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span> current.uncompressTags = false;<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span> // The current key has to be reset with the previous Cell<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span> current.setKey(current.keyBuffer, current.memstoreTS);<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span> previous.invalidate();<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span> }<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span><a name="line.1114"></a>
-<span class="sourceLineNo">1115</span> @SuppressWarnings("unchecked")<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span> protected STATE createSeekerState() {<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span> // This will fail for non-default seeker state if the subclass does not<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span> // override this method.<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span> return (STATE) new SeekerState(this.tmpPair, this.includesTags());<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span> }<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span><a name="line.1121"></a>
-<span class="sourceLineNo">1122</span> abstract protected void decodeFirst();<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span><a name="line.1123"></a>
-<span class="sourceLineNo">1124</span> abstract protected void decodeNext();<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span> }<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span><a name="line.1126"></a>
-<span class="sourceLineNo">1127</span> /** Returns unencoded size added */<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span> protected final int afterEncodingKeyValue(Cell cell, DataOutputStream out,<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span> HFileBlockDefaultEncodingContext encodingCtx) throws IOException {<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span> int size = 0;<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span> if (encodingCtx.getHFileContext().isIncludesTags()) {<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span> int tagsLength = cell.getTagsLength();<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span> ByteBufferUtils.putCompressedInt(out, tagsLength);<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span> // There are some tags to be written<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span> if (tagsLength > 0) {<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span> TagCompressionContext tagCompressionContext = encodingCtx.getTagCompressionContext();<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span> // When tag compression is enabled, tagCompressionContext will have a not null value. Write<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span> // the tags using Dictionary compression in such a case<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span> if (tagCompressionContext != null) {<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span> // Not passing tagsLength considering that parsing of the tagsLength is not costly<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span> PrivateCellUtil.compressTags(out, cell, tagCompressionContext);<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span> } else {<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span> PrivateCellUtil.writeTags(out, cell, tagsLength);<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> size += tagsLength + KeyValue.TAGS_LENGTH_SIZE;<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span> }<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span> if (encodingCtx.getHFileContext().isIncludesMvcc()) {<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span> // Copy memstore timestamp from the byte buffer to the output stream.<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span> long memstoreTS = cell.getSequenceId();<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span> WritableUtils.writeVLong(out, memstoreTS);<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span> // TODO use a writeVLong which returns the #bytes written so that 2 time parsing can be<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span> // avoided.<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span> size += WritableUtils.getVIntSize(memstoreTS);<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span> }<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span> return size;<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span> }<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span><a name="line.1158"></a>
-<span class="sourceLineNo">1159</span> protected final void afterDecodingKeyValue(DataInputStream source, ByteBuffer dest,<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span> HFileBlockDefaultDecodingContext decodingCtx) throws IOException {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span> if (decodingCtx.getHFileContext().isIncludesTags()) {<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span> int tagsLength = ByteBufferUtils.readCompressedInt(source);<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span> // Put as unsigned short<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span> dest.put((byte) ((tagsLength >> 8) & 0xff));<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span> dest.put((byte) (tagsLength & 0xff));<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span> if (tagsLength > 0) {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span> TagCompressionContext tagCompressionContext = decodingCtx.getTagCompressionContext();<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span> // When tag compression is been used in this file, tagCompressionContext will have a not<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span> // null value passed.<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span> if (tagCompressionContext != null) {<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span> tagCompressionContext.uncompressTags(source, dest, tagsLength);<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span> } else {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span> ByteBufferUtils.copyFromStreamToBuffer(dest, source, tagsLength);<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span> }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span> }<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span> }<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span> if (decodingCtx.getHFileContext().isIncludesMvcc()) {<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span> long memstoreTS = -1;<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span> try {<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span> // Copy memstore timestamp from the data input stream to the byte<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span> // buffer.<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span> memstoreTS = WritableUtils.readVLong(source);<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span> ByteBufferUtils.writeVLong(dest, memstoreTS);<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span> } catch (IOException ex) {<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span> throw new RuntimeException(<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span> "Unable to copy memstore timestamp " + memstoreTS + " after decoding a key/value");<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span> }<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> protected abstract ByteBuffer internalDecodeKeyValues(DataInputStream source,<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span> int allocateHeaderLength, int skipLastBytes, HFileBlockDefaultDecodingContext decodingCtx)<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span> throws IOException;<a name="line.1193"></a>
+<span class="sourceLineNo">1099</span> STATE tmp = previous;<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span> previous = current;<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span> current = tmp;<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span><a name="line.1102"></a>
+<span class="sourceLineNo">1103</span> // move after last key value<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span> currentBuffer.position(current.nextKvOffset);<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span> // Already decoded the tag bytes. We cache this tags into current state and also the total<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span> // compressed length of the tags bytes. For the next time decodeNext() we don't need to decode<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span> // the tags again. This might pollute the Data Dictionary what we use for the compression.<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span> // When current.uncompressTags is false, we will just reuse the current.tagsBuffer and skip<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span> // 'tagsCompressedLength' bytes of source stream.<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span> // See in decodeTags()<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span> current.tagsBuffer = previous.tagsBuffer;<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span> current.tagsCompressedLength = previous.tagsCompressedLength;<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span> current.uncompressTags = false;<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span> // The current key has to be reset with the previous Cell<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span> current.setKey(current.keyBuffer, current.memstoreTS);<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span> previous.invalidate();<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span> }<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span><a name="line.1118"></a>
+<span class="sourceLineNo">1119</span> @SuppressWarnings("unchecked")<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span> protected STATE createSeekerState() {<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span> // This will fail for non-default seeker state if the subclass does not<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span> // override this method.<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span> return (STATE) new SeekerState(this.tmpPair, this.includesTags());<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span> }<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span><a name="line.1125"></a>
+<span class="sourceLineNo">1126</span> abstract protected void decodeFirst();<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span><a name="line.1127"></a>
+<span class="sourceLineNo">1128</span> abstract protected void decodeNext();<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span> }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span><a name="line.1130"></a>
+<span class="sourceLineNo">1131</span> /** Returns unencoded size added */<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span> protected final int afterEncodingKeyValue(Cell cell, DataOutputStream out,<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span> HFileBlockDefaultEncodingContext encodingCtx) throws IOException {<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span> int size = 0;<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span> if (encodingCtx.getHFileContext().isIncludesTags()) {<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span> int tagsLength = cell.getTagsLength();<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span> ByteBufferUtils.putCompressedInt(out, tagsLength);<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span> // There are some tags to be written<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span> if (tagsLength > 0) {<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span> TagCompressionContext tagCompressionContext = encodingCtx.getTagCompressionContext();<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span> // When tag compression is enabled, tagCompressionContext will have a not null value. Write<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span> // the tags using Dictionary compression in such a case<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span> if (tagCompressionContext != null) {<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span> // Not passing tagsLength considering that parsing of the tagsLength is not costly<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span> PrivateCellUtil.compressTags(out, cell, tagCompressionContext);<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span> } else {<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span> PrivateCellUtil.writeTags(out, cell, tagsLength);<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span> }<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span> }<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span> size += tagsLength + KeyValue.TAGS_LENGTH_SIZE;<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span> }<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span> if (encodingCtx.getHFileContext().isIncludesMvcc()) {<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span> // Copy memstore timestamp from the byte buffer to the output stream.<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span> long memstoreTS = cell.getSequenceId();<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span> WritableUtils.writeVLong(out, memstoreTS);<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span> // TODO use a writeVLong which returns the #bytes written so that 2 time parsing can be<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span> // avoided.<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span> size += WritableUtils.getVIntSize(memstoreTS);<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span> }<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span> return size;<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span> }<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span><a name="line.1162"></a>
+<span class="sourceLineNo">1163</span> protected final void afterDecodingKeyValue(DataInputStream source, ByteBuffer dest,<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span> HFileBlockDefaultDecodingContext decodingCtx) throws IOException {<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span> if (decodingCtx.getHFileContext().isIncludesTags()) {<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span> int tagsLength = ByteBufferUtils.readCompressedInt(source);<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span> // Put as unsigned short<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span> dest.put((byte) ((tagsLength >> 8) & 0xff));<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span> dest.put((byte) (tagsLength & 0xff));<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span> if (tagsLength > 0) {<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span> TagCompressionContext tagCompressionContext = decodingCtx.getTagCompressionContext();<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span> // When tag compression is been used in this file, tagCompressionContext will have a not<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span> // null value passed.<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span> if (tagCompressionContext != null) {<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span> tagCompressionContext.uncompressTags(source, dest, tagsLength);<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span> } else {<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span> ByteBufferUtils.copyFromStreamToBuffer(dest, source, tagsLength);<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> }<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span> if (decodingCtx.getHFileContext().isIncludesMvcc()) {<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span> long memstoreTS = -1;<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span> try {<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span> // Copy memstore timestamp from the data input stream to the byte<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span> // buffer.<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span> memstoreTS = WritableUtils.readVLong(source);<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span> ByteBufferUtils.writeVLong(dest, memstoreTS);<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span> } catch (IOException ex) {<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span> throw new RuntimeException(<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span> "Unable to copy memstore timestamp " + memstoreTS + " after decoding a key/value");<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> }<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> * Asserts that there is at least the given amount of unfilled space remaining in the given<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span> * buffer.<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span> * @param out typically, the buffer we are writing to<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span> * @param length the required space in the buffer<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span> * @throws EncoderBufferTooSmallException If there are no enough bytes.<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span> */<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span> protected static void ensureSpace(ByteBuffer out, int length)<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span> throws EncoderBufferTooSmallException {<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span> if (out.position() + length > out.limit()) {<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span> throw new EncoderBufferTooSmallException("Buffer position=" + out.position()<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span> + ", buffer limit=" + out.limit() + ", length to be written=" + length);<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span> }<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span> }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span> @Override<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span> public void startBlockEncoding(HFileBlockEncodingContext blkEncodingCtx, DataOutputStream out)<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span> throws IOException {<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span> if (blkEncodingCtx.getClass() != HFileBlockDefaultEncodingContext.class) {<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span> throw new IOException(this.getClass().getName() + " only accepts "<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span> + HFileBlockDefaultEncodingContext.class.getName() + " as the " + "encoding context.");<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span> }<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span><a name="line.1217"></a>
-<span class="sourceLineNo">1218</span> HFileBlockDefaultEncodingContext encodingCtx =<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span> (HFileBlockDefaultEncodingContext) blkEncodingCtx;<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span> encodingCtx.prepareEncoding(out);<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span> if (<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span> encodingCtx.getHFileContext().isIncludesTags()<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span> && encodingCtx.getHFileContext().isCompressTags()<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span> ) {<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span> if (encodingCtx.getTagCompressionContext() != null) {<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span> // It will be overhead to create the TagCompressionContext again and again for every block<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span> // encoding.<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span> encodingCtx.getTagCompressionContext().clear();<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span> } else {<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span> try {<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span> TagCompressionContext tagCompressionContext =<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span> new TagCompressionContext(LRUDictionary.class, Byte.MAX_VALUE);<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span> encodingCtx.setTagCompressionContext(tagCompressionContext);<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span> } catch (Exception e) {<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span> throw new IOException("Failed to initialize TagCompressionContext", e);<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span> }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span> }<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span> }<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span> StreamUtils.writeInt(out, 0); // DUMMY length. This will be updated in endBlockEncoding()<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span> blkEncodingCtx.setEncodingState(new EncodingState());<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span> }<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span><a name="line.1242"></a>
-<span class="sourceLineNo">1243</span> @Override<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span> public void encode(Cell cell, HFileBlockEncodingContext encodingCtx, DataOutputStream out)<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span> throws IOException {<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span> EncodingState state = encodingCtx.getEncodingState();<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span> int posBeforeEncode = out.size();<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span> int encodedKvSize = internalEncode(cell, (HFileBlockDefaultEncodingContext) encodingCtx, out);<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span> state.postCellEncode(encodedKvSize, out.size() - posBeforeEncode);<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span> }<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span> public abstract int internalEncode(Cell cell, HFileBlockDefaultEncodingContext encodingCtx,<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span> DataOutputStream out) throws IOException;<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span><a name="line.1254"></a>
-<span class="sourceLineNo">1255</span> @Override<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span> public void endBlockEncoding(HFileBlockEncodingContext encodingCtx, DataOutputStream out,<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span> byte[] uncompressedBytesWithHeader) throws IOException {<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span> EncodingState state = encodingCtx.getEncodingState();<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span> // Write the unencodedDataSizeWritten (with header size)<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span> Bytes.putInt(uncompressedBytesWithHeader,<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span> HConstants.HFILEBLOCK_HEADER_SIZE + DataBlockEncoding.ID_SIZE,<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span> state.getUnencodedDataSizeWritten());<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span> postEncoding(encodingCtx);<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span> }<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span><a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>}<a name="line.1266"></a>
+<span class="sourceLineNo">1195</span> protected abstract ByteBuffer internalDecodeKeyValues(DataInputStream source,<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span> int allocateHeaderLength, int skipLastBytes, HFileBlockDefaultDecodingContext decodingCtx)<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span> throws IOException;<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> * Asserts that there is at least the given amount of unfilled space remaining in the given<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span> * buffer.<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span> * @param out typically, the buffer we are writing to<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span> * @param length the required space in the buffer<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span> * @throws EncoderBufferTooSmallException If there are no enough bytes.<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span> */<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span> protected static void ensureSpace(ByteBuffer out, int length)<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span> throws EncoderBufferTooSmallException {<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span> if (out.position() + length > out.limit()) {<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span> throw new EncoderBufferTooSmallException("Buffer position=" + out.position()<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span> + ", buffer limit=" + out.limit() + ", length to be written=" + length);<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span> }<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span> }<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span><a name="line.1213"></a>
+<span class="sourceLineNo">1214</span> @Override<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span> public void startBlockEncoding(HFileBlockEncodingContext blkEncodingCtx, DataOutputStream out)<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span> throws IOException {<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span> if (blkEncodingCtx.getClass() != HFileBlockDefaultEncodingContext.class) {<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span> throw new IOException(this.getClass().getName() + " only accepts "<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span> + HFileBlockDefaultEncodingContext.class.getName() + " as the " + "encoding context.");<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span> }<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span><a name="line.1221"></a>
+<span class="sourceLineNo">1222</span> HFileBlockDefaultEncodingContext encodingCtx =<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span> (HFileBlockDefaultEncodingContext) blkEncodingCtx;<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span> encodingCtx.prepareEncoding(out);<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span> if (<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span> encodingCtx.getHFileContext().isIncludesTags()<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span> && encodingCtx.getHFileContext().isCompressTags()<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span> ) {<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span> if (encodingCtx.getTagCompressionContext() != null) {<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span> // It will be overhead to create the TagCompressionContext again and again for every block<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span> // encoding.<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span> encodingCtx.getTagCompressionContext().clear();<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span> } else {<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span> try {<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span> TagCompressionContext tagCompressionContext =<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span> new TagCompressionContext(LRUDictionary.class, Byte.MAX_VALUE);<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span> encodingCtx.setTagCompressionContext(tagCompressionContext);<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span> } catch (Exception e) {<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span> throw new IOException("Failed to initialize TagCompressionContext", e);<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span> }<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span> }<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span> }<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span> StreamUtils.writeInt(out, 0); // DUMMY length. This will be updated in endBlockEncoding()<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span> blkEncodingCtx.setEncodingState(new EncodingState());<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span> }<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span><a name="line.1246"></a>
+<span class="sourceLineNo">1247</span> @Override<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span> public void encode(Cell cell, HFileBlockEncodingContext encodingCtx, DataOutputStream out)<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span> throws IOException {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span> EncodingState state = encodingCtx.getEncodingState();<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span> int posBeforeEncode = out.size();<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span> int encodedKvSize = internalEncode(cell, (HFileBlockDefaultEncodingContext) encodingCtx, out);<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span> state.postCellEncode(encodedKvSize, out.size() - posBeforeEncode);<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> public abstract int internalEncode(Cell cell, HFileBlockDefaultEncodingContext encodingCtx,<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span> DataOutputStream out) throws IOException;<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span><a name="line.1258"></a>
+<span class="sourceLineNo">1259</span> @Override<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span> public void endBlockEncoding(HFileBlockEncodingContext encodingCtx, DataOutputStream out,<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span> byte[] uncompressedBytesWithHeader) throws IOException {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span> EncodingState state = encodingCtx.getEncodingState();<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span> // Write the unencodedDataSizeWritten (with header size)<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span> Bytes.putInt(uncompressedBytesWithHeader,<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span> HConstants.HFILEBLOCK_HEADER_SIZE + DataBlockEncoding.ID_SIZE,<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span> state.getUnencodedDataSizeWritten());<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span> postEncoding(encodingCtx);<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span> }<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span><a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>}<a name="line.1270"></a>
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.SeekerState.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.SeekerState.html
index 5cdb93fd392..819724d6731 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.SeekerState.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.SeekerState.html
@@ -842,436 +842,440 @@
<span class="sourceLineNo">834</span> public void setCurrentBuffer(ByteBuff buffer) {<a name="line.834"></a>
<span class="sourceLineNo">835</span> if (this.tagCompressionContext != null) {<a name="line.835"></a>
<span class="sourceLineNo">836</span> this.tagCompressionContext.clear();<a name="line.836"></a>
-<span class="sourceLineNo">837</span> }<a name="line.837"></a>
-<span class="sourceLineNo">838</span> currentBuffer = buffer;<a name="line.838"></a>
-<span class="sourceLineNo">839</span> current.currentBuffer = currentBuffer;<a name="line.839"></a>
-<span class="sourceLineNo">840</span> if (tagCompressionContext != null) {<a name="line.840"></a>
-<span class="sourceLineNo">841</span> current.tagCompressionContext = tagCompressionContext;<a name="line.841"></a>
-<span class="sourceLineNo">842</span> }<a name="line.842"></a>
-<span class="sourceLineNo">843</span> decodeFirst();<a name="line.843"></a>
-<span class="sourceLineNo">844</span> current.setKey(current.keyBuffer, current.memstoreTS);<a name="line.844"></a>
-<span class="sourceLineNo">845</span> previous.invalidate();<a name="line.845"></a>
-<span class="sourceLineNo">846</span> }<a name="line.846"></a>
-<span class="sourceLineNo">847</span><a name="line.847"></a>
-<span class="sourceLineNo">848</span> @Override<a name="line.848"></a>
-<span class="sourceLineNo">849</span> public Cell getKey() {<a name="line.849"></a>
-<span class="sourceLineNo">850</span> byte[] key = new byte[current.keyLength];<a name="line.850"></a>
-<span class="sourceLineNo">851</span> System.arraycopy(current.keyBuffer, 0, key, 0, current.keyLength);<a name="line.851"></a>
-<span class="sourceLineNo">852</span> return new KeyValue.KeyOnlyKeyValue(key);<a name="line.852"></a>
+<span class="sourceLineNo">837</span><a name="line.837"></a>
+<span class="sourceLineNo">838</span> // Prior seekToKeyInBlock may have reset this to false if we fell back to previous<a name="line.838"></a>
+<span class="sourceLineNo">839</span> // seeker state. This is an optimization so we don't have to uncompress tags again when<a name="line.839"></a>
+<span class="sourceLineNo">840</span> // reading last state.<a name="line.840"></a>
+<span class="sourceLineNo">841</span> // In seekBefore flow, if block change happens then rewind is not called and<a name="line.841"></a>
+<span class="sourceLineNo">842</span> // setCurrentBuffer is called, so need to uncompress any tags we see.<a name="line.842"></a>
+<span class="sourceLineNo">843</span> current.uncompressTags = true;<a name="line.843"></a>
+<span class="sourceLineNo">844</span> }<a name="line.844"></a>
+<span class="sourceLineNo">845</span> currentBuffer = buffer;<a name="line.845"></a>
+<span class="sourceLineNo">846</span> current.currentBuffer = currentBuffer;<a name="line.846"></a>
+<span class="sourceLineNo">847</span> if (tagCompressionContext != null) {<a name="line.847"></a>
+<span class="sourceLineNo">848</span> current.tagCompressionContext = tagCompressionContext;<a name="line.848"></a>
+<span class="sourceLineNo">849</span> }<a name="line.849"></a>
+<span class="sourceLineNo">850</span> decodeFirst();<a name="line.850"></a>
+<span class="sourceLineNo">851</span> current.setKey(current.keyBuffer, current.memstoreTS);<a name="line.851"></a>
+<span class="sourceLineNo">852</span> previous.invalidate();<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> @Override<a name="line.855"></a>
-<span class="sourceLineNo">856</span> public ByteBuffer getValueShallowCopy() {<a name="line.856"></a>
-<span class="sourceLineNo">857</span> currentBuffer.asSubByteBuffer(current.valueOffset, current.valueLength, tmpPair);<a name="line.857"></a>
-<span class="sourceLineNo">858</span> ByteBuffer dup = tmpPair.getFirst().duplicate();<a name="line.858"></a>
-<span class="sourceLineNo">859</span> dup.position(tmpPair.getSecond());<a name="line.859"></a>
-<span class="sourceLineNo">860</span> dup.limit(tmpPair.getSecond() + current.valueLength);<a name="line.860"></a>
-<span class="sourceLineNo">861</span> return dup.slice();<a name="line.861"></a>
-<span class="sourceLineNo">862</span> }<a name="line.862"></a>
-<span class="sourceLineNo">863</span><a name="line.863"></a>
-<span class="sourceLineNo">864</span> @Override<a name="line.864"></a>
-<span class="sourceLineNo">865</span> public Cell getCell() {<a name="line.865"></a>
-<span class="sourceLineNo">866</span> return current.toCell();<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> @Override<a name="line.869"></a>
-<span class="sourceLineNo">870</span> public void rewind() {<a name="line.870"></a>
-<span class="sourceLineNo">871</span> currentBuffer.rewind();<a name="line.871"></a>
-<span class="sourceLineNo">872</span> if (tagCompressionContext != null) {<a name="line.872"></a>
-<span class="sourceLineNo">873</span> tagCompressionContext.clear();<a name="line.873"></a>
-<span class="sourceLineNo">874</span> // Prior seekToKeyInBlock may have reset this to false if we fell back to previous<a name="line.874"></a>
-<span class="sourceLineNo">875</span> // seeker state. This is an optimization so we don't have to uncompress tags again when<a name="line.875"></a>
-<span class="sourceLineNo">876</span> // reading last state.<a name="line.876"></a>
-<span class="sourceLineNo">877</span> // In case of rewind, we are starting from the beginning of the buffer, so we need<a name="line.877"></a>
-<span class="sourceLineNo">878</span> // to uncompress any tags we see.<a name="line.878"></a>
-<span class="sourceLineNo">879</span> // It may make sense to reset this in setCurrentBuffer as well, but we seem to only call<a name="line.879"></a>
-<span class="sourceLineNo">880</span> // setCurrentBuffer after StoreFileScanner.seekAtOrAfter which calls next to consume the<a name="line.880"></a>
-<span class="sourceLineNo">881</span> // seeker state. Rewind is called by seekBefore, which doesn't and leaves us in this state.<a name="line.881"></a>
-<span class="sourceLineNo">882</span> current.uncompressTags = true;<a name="line.882"></a>
-<span class="sourceLineNo">883</span> }<a name="line.883"></a>
-<span class="sourceLineNo">884</span> decodeFirst();<a name="line.884"></a>
-<span class="sourceLineNo">885</span> current.setKey(current.keyBuffer, current.memstoreTS);<a name="line.885"></a>
-<span class="sourceLineNo">886</span> previous.invalidate();<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>
-<span class="sourceLineNo">889</span> @Override<a name="line.889"></a>
-<span class="sourceLineNo">890</span> public boolean next() {<a name="line.890"></a>
-<span class="sourceLineNo">891</span> if (!currentBuffer.hasRemaining()) {<a name="line.891"></a>
-<span class="sourceLineNo">892</span> return false;<a name="line.892"></a>
-<span class="sourceLineNo">893</span> }<a name="line.893"></a>
-<span class="sourceLineNo">894</span> decodeNext();<a name="line.894"></a>
-<span class="sourceLineNo">895</span> current.setKey(current.keyBuffer, current.memstoreTS);<a name="line.895"></a>
-<span class="sourceLineNo">896</span> previous.invalidate();<a name="line.896"></a>
-<span class="sourceLineNo">897</span> return true;<a name="line.897"></a>
-<span class="sourceLineNo">898</span> }<a name="line.898"></a>
-<span class="sourceLineNo">899</span><a name="line.899"></a>
-<span class="sourceLineNo">900</span> protected void decodeTags() {<a name="line.900"></a>
-<span class="sourceLineNo">901</span> current.tagsLength = ByteBuff.readCompressedInt(currentBuffer);<a name="line.901"></a>
-<span class="sourceLineNo">902</span> if (tagCompressionContext != null) {<a name="line.902"></a>
-<span class="sourceLineNo">903</span> if (current.uncompressTags) {<a name="line.903"></a>
-<span class="sourceLineNo">904</span> // Tag compression is been used. uncompress it into tagsBuffer<a name="line.904"></a>
-<span class="sourceLineNo">905</span> current.ensureSpaceForTags();<a name="line.905"></a>
-<span class="sourceLineNo">906</span> try {<a name="line.906"></a>
-<span class="sourceLineNo">907</span> current.tagsCompressedLength = tagCompressionContext.uncompressTags(currentBuffer,<a name="line.907"></a>
-<span class="sourceLineNo">908</span> current.tagsBuffer, 0, current.tagsLength);<a name="line.908"></a>
-<span class="sourceLineNo">909</span> } catch (Exception e) {<a name="line.909"></a>
-<span class="sourceLineNo">910</span> throw new RuntimeException("Exception while uncompressing tags", e);<a name="line.910"></a>
-<span class="sourceLineNo">911</span> }<a name="line.911"></a>
-<span class="sourceLineNo">912</span> } else {<a name="line.912"></a>
-<span class="sourceLineNo">913</span> currentBuffer.skip(current.tagsCompressedLength);<a name="line.913"></a>
-<span class="sourceLineNo">914</span> current.uncompressTags = true;// Reset this.<a name="line.914"></a>
-<span class="sourceLineNo">915</span> }<a name="line.915"></a>
-<span class="sourceLineNo">916</span> current.tagsOffset = -1;<a name="line.916"></a>
-<span class="sourceLineNo">917</span> } else {<a name="line.917"></a>
-<span class="sourceLineNo">918</span> // When tag compress is not used, let us not do copying of tags bytes into tagsBuffer.<a name="line.918"></a>
-<span class="sourceLineNo">919</span> // Just mark the tags Offset so as to create the KV buffer later in getKeyValueBuffer()<a name="line.919"></a>
-<span class="sourceLineNo">920</span> current.tagsOffset = currentBuffer.position();<a name="line.920"></a>
-<span class="sourceLineNo">921</span> currentBuffer.skip(current.tagsLength);<a name="line.921"></a>
-<span class="sourceLineNo">922</span> }<a name="line.922"></a>
-<span class="sourceLineNo">923</span> }<a name="line.923"></a>
-<span class="sourceLineNo">924</span><a name="line.924"></a>
-<span class="sourceLineNo">925</span> @Override<a name="line.925"></a>
-<span class="sourceLineNo">926</span> public int seekToKeyInBlock(Cell seekCell, boolean seekBefore) {<a name="line.926"></a>
-<span class="sourceLineNo">927</span> int rowCommonPrefix = 0;<a name="line.927"></a>
-<span class="sourceLineNo">928</span> int familyCommonPrefix = 0;<a name="line.928"></a>
-<span class="sourceLineNo">929</span> int qualCommonPrefix = 0;<a name="line.929"></a>
-<span class="sourceLineNo">930</span> previous.invalidate();<a name="line.930"></a>
-<span class="sourceLineNo">931</span> do {<a name="line.931"></a>
-<span class="sourceLineNo">932</span> int comp;<a name="line.932"></a>
-<span class="sourceLineNo">933</span> keyOnlyKV.setKey(current.keyBuffer, 0, current.keyLength);<a name="line.933"></a>
-<span class="sourceLineNo">934</span> if (current.lastCommonPrefix != 0) {<a name="line.934"></a>
-<span class="sourceLineNo">935</span> // The KV format has row key length also in the byte array. The<a name="line.935"></a>
-<span class="sourceLineNo">936</span> // common prefix<a name="line.936"></a>
-<span class="sourceLineNo">937</span> // includes it. So we need to subtract to find out the common prefix<a name="line.937"></a>
-<span class="sourceLineNo">938</span> // in the<a name="line.938"></a>
-<span class="sourceLineNo">939</span> // row part alone<a name="line.939"></a>
-<span class="sourceLineNo">940</span> rowCommonPrefix = Math.min(rowCommonPrefix, current.lastCommonPrefix - 2);<a name="line.940"></a>
-<span class="sourceLineNo">941</span> }<a name="line.941"></a>
-<span class="sourceLineNo">942</span> if (current.lastCommonPrefix <= 2) {<a name="line.942"></a>
-<span class="sourceLineNo">943</span> rowCommonPrefix = 0;<a name="line.943"></a>
-<span class="sourceLineNo">944</span> }<a name="line.944"></a>
-<span class="sourceLineNo">945</span> rowCommonPrefix += findCommonPrefixInRowPart(seekCell, keyOnlyKV, rowCommonPrefix);<a name="line.945"></a>
-<span class="sourceLineNo">946</span> comp = compareCommonRowPrefix(seekCell, keyOnlyKV, rowCommonPrefix);<a name="line.946"></a>
-<span class="sourceLineNo">947</span> if (comp == 0) {<a name="line.947"></a>
-<span class="sourceLineNo">948</span> comp = compareTypeBytes(seekCell, keyOnlyKV);<a name="line.948"></a>
-<span class="sourceLineNo">949</span> if (comp == 0) {<a name="line.949"></a>
-<span class="sourceLineNo">950</span> // Subtract the fixed row key length and the family key fixed length<a name="line.950"></a>
-<span class="sourceLineNo">951</span> familyCommonPrefix = Math.max(0, Math.min(familyCommonPrefix,<a name="line.951"></a>
-<span class="sourceLineNo">952</span> current.lastCommonPrefix - (3 + keyOnlyKV.getRowLength())));<a name="line.952"></a>
-<span class="sourceLineNo">953</span> familyCommonPrefix +=<a name="line.953"></a>
-<span class="sourceLineNo">954</span> findCommonPrefixInFamilyPart(seekCell, keyOnlyKV, familyCommonPrefix);<a name="line.954"></a>
-<span class="sourceLineNo">955</span> comp = compareCommonFamilyPrefix(seekCell, keyOnlyKV, familyCommonPrefix);<a name="line.955"></a>
-<span class="sourceLineNo">956</span> if (comp == 0) {<a name="line.956"></a>
-<span class="sourceLineNo">957</span> // subtract the rowkey fixed length and the family key fixed<a name="line.957"></a>
-<span class="sourceLineNo">958</span> // length<a name="line.958"></a>
-<span class="sourceLineNo">959</span> qualCommonPrefix = Math.max(0, Math.min(qualCommonPrefix, current.lastCommonPrefix<a name="line.959"></a>
-<span class="sourceLineNo">960</span> - (3 + keyOnlyKV.getRowLength() + keyOnlyKV.getFamilyLength())));<a name="line.960"></a>
-<span class="sourceLineNo">961</span> qualCommonPrefix +=<a name="line.961"></a>
-<span class="sourceLineNo">962</span> findCommonPrefixInQualifierPart(seekCell, keyOnlyKV, qualCommonPrefix);<a name="line.962"></a>
-<span class="sourceLineNo">963</span> comp = compareCommonQualifierPrefix(seekCell, keyOnlyKV, qualCommonPrefix);<a name="line.963"></a>
-<span class="sourceLineNo">964</span> if (comp == 0) {<a name="line.964"></a>
-<span class="sourceLineNo">965</span> comp = CellComparator.getInstance().compareTimestamps(seekCell, keyOnlyKV);<a name="line.965"></a>
-<span class="sourceLineNo">966</span> if (comp == 0) {<a name="line.966"></a>
-<span class="sourceLineNo">967</span> // Compare types. Let the delete types sort ahead of puts;<a name="line.967"></a>
-<span class="sourceLineNo">968</span> // i.e. types<a name="line.968"></a>
-<span class="sourceLineNo">969</span> // of higher numbers sort before those of lesser numbers.<a name="line.969"></a>
-<span class="sourceLineNo">970</span> // Maximum<a name="line.970"></a>
-<span class="sourceLineNo">971</span> // (255)<a name="line.971"></a>
-<span class="sourceLineNo">972</span> // appears ahead of everything, and minimum (0) appears<a name="line.972"></a>
-<span class="sourceLineNo">973</span> // after<a name="line.973"></a>
-<span class="sourceLineNo">974</span> // everything.<a name="line.974"></a>
-<span class="sourceLineNo">975</span> comp = (0xff & keyOnlyKV.getTypeByte()) - (0xff & seekCell.getTypeByte());<a name="line.975"></a>
-<span class="sourceLineNo">976</span> }<a name="line.976"></a>
-<span class="sourceLineNo">977</span> }<a name="line.977"></a>
-<span class="sourceLineNo">978</span> }<a name="line.978"></a>
-<span class="sourceLineNo">979</span> }<a name="line.979"></a>
-<span class="sourceLineNo">980</span> }<a name="line.980"></a>
-<span class="sourceLineNo">981</span> if (comp == 0) { // exact match<a name="line.981"></a>
-<span class="sourceLineNo">982</span> if (seekBefore) {<a name="line.982"></a>
-<span class="sourceLineNo">983</span> if (!previous.isValid()) {<a name="line.983"></a>
-<span class="sourceLineNo">984</span> // The caller (seekBefore) has to ensure that we are not at the<a name="line.984"></a>
-<span class="sourceLineNo">985</span> // first key in the block.<a name="line.985"></a>
-<span class="sourceLineNo">986</span> throw new IllegalStateException(<a name="line.986"></a>
-<span class="sourceLineNo">987</span> "Cannot seekBefore if " + "positioned at the first key in the block: key="<a name="line.987"></a>
-<span class="sourceLineNo">988</span> + Bytes.toStringBinary(seekCell.getRowArray()));<a name="line.988"></a>
-<span class="sourceLineNo">989</span> }<a name="line.989"></a>
-<span class="sourceLineNo">990</span> moveToPrevious();<a name="line.990"></a>
-<span class="sourceLineNo">991</span> return 1;<a name="line.991"></a>
-<span class="sourceLineNo">992</span> }<a name="line.992"></a>
-<span class="sourceLineNo">993</span> return 0;<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> if (comp < 0) { // already too large, check previous<a name="line.996"></a>
-<span class="sourceLineNo">997</span> if (previous.isValid()) {<a name="line.997"></a>
-<span class="sourceLineNo">998</span> moveToPrevious();<a name="line.998"></a>
-<span class="sourceLineNo">999</span> } else {<a name="line.999"></a>
-<span class="sourceLineNo">1000</span> return HConstants.INDEX_KEY_MAGIC; // using optimized index key<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span> }<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span> return 1;<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span> }<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span><a name="line.1004"></a>
-<span class="sourceLineNo">1005</span> // move to next, if more data is available<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span> if (currentBuffer.hasRemaining()) {<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span> previous.copyFromNext(current);<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span> decodeNext();<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span> current.setKey(current.keyBuffer, current.memstoreTS);<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span> } else {<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span> break;<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span> }<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span> } while (true);<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span><a name="line.1014"></a>
-<span class="sourceLineNo">1015</span> // we hit the end of the block, not an exact match<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span> return 1;<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span> }<a name="line.1017"></a>
+<span class="sourceLineNo">856</span> public Cell getKey() {<a name="line.856"></a>
+<span class="sourceLineNo">857</span> byte[] key = new byte[current.keyLength];<a name="line.857"></a>
+<span class="sourceLineNo">858</span> System.arraycopy(current.keyBuffer, 0, key, 0, current.keyLength);<a name="line.858"></a>
+<span class="sourceLineNo">859</span> return new KeyValue.KeyOnlyKeyValue(key);<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> @Override<a name="line.862"></a>
+<span class="sourceLineNo">863</span> public ByteBuffer getValueShallowCopy() {<a name="line.863"></a>
+<span class="sourceLineNo">864</span> currentBuffer.asSubByteBuffer(current.valueOffset, current.valueLength, tmpPair);<a name="line.864"></a>
+<span class="sourceLineNo">865</span> ByteBuffer dup = tmpPair.getFirst().duplicate();<a name="line.865"></a>
+<span class="sourceLineNo">866</span> dup.position(tmpPair.getSecond());<a name="line.866"></a>
+<span class="sourceLineNo">867</span> dup.limit(tmpPair.getSecond() + current.valueLength);<a name="line.867"></a>
+<span class="sourceLineNo">868</span> return dup.slice();<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">871</span> @Override<a name="line.871"></a>
+<span class="sourceLineNo">872</span> public Cell getCell() {<a name="line.872"></a>
+<span class="sourceLineNo">873</span> return current.toCell();<a name="line.873"></a>
+<span class="sourceLineNo">874</span> }<a name="line.874"></a>
+<span class="sourceLineNo">875</span><a name="line.875"></a>
+<span class="sourceLineNo">876</span> @Override<a name="line.876"></a>
+<span class="sourceLineNo">877</span> public void rewind() {<a name="line.877"></a>
+<span class="sourceLineNo">878</span> currentBuffer.rewind();<a name="line.878"></a>
+<span class="sourceLineNo">879</span> if (tagCompressionContext != null) {<a name="line.879"></a>
+<span class="sourceLineNo">880</span> tagCompressionContext.clear();<a name="line.880"></a>
+<span class="sourceLineNo">881</span> // Prior seekToKeyInBlock may have reset this to false if we fell back to previous<a name="line.881"></a>
+<span class="sourceLineNo">882</span> // seeker state. This is an optimization so we don't have to uncompress tags again when<a name="line.882"></a>
+<span class="sourceLineNo">883</span> // reading last state.<a name="line.883"></a>
+<span class="sourceLineNo">884</span> // In case of rewind, we are starting from the beginning of the buffer, so we need<a name="line.884"></a>
+<span class="sourceLineNo">885</span> // to uncompress any tags we see.<a name="line.885"></a>
+<span class="sourceLineNo">886</span> current.uncompressTags = true;<a name="line.886"></a>
+<span class="sourceLineNo">887</span> }<a name="line.887"></a>
+<span class="sourceLineNo">888</span> decodeFirst();<a name="line.888"></a>
+<span class="sourceLineNo">889</span> current.setKey(current.keyBuffer, current.memstoreTS);<a name="line.889"></a>
+<span class="sourceLineNo">890</span> previous.invalidate();<a name="line.890"></a>
+<span class="sourceLineNo">891</span> }<a name="line.891"></a>
+<span class="sourceLineNo">892</span><a name="line.892"></a>
+<span class="sourceLineNo">893</span> @Override<a name="line.893"></a>
+<span class="sourceLineNo">894</span> public boolean next() {<a name="line.894"></a>
+<span class="sourceLineNo">895</span> if (!currentBuffer.hasRemaining()) {<a name="line.895"></a>
+<span class="sourceLineNo">896</span> return false;<a name="line.896"></a>
+<span class="sourceLineNo">897</span> }<a name="line.897"></a>
+<span class="sourceLineNo">898</span> decodeNext();<a name="line.898"></a>
+<span class="sourceLineNo">899</span> current.setKey(current.keyBuffer, current.memstoreTS);<a name="line.899"></a>
+<span class="sourceLineNo">900</span> previous.invalidate();<a name="line.900"></a>
+<span class="sourceLineNo">901</span> return true;<a name="line.901"></a>
+<span class="sourceLineNo">902</span> }<a name="line.902"></a>
+<span class="sourceLineNo">903</span><a name="line.903"></a>
+<span class="sourceLineNo">904</span> protected void decodeTags() {<a name="line.904"></a>
+<span class="sourceLineNo">905</span> current.tagsLength = ByteBuff.readCompressedInt(currentBuffer);<a name="line.905"></a>
+<span class="sourceLineNo">906</span> if (tagCompressionContext != null) {<a name="line.906"></a>
+<span class="sourceLineNo">907</span> if (current.uncompressTags) {<a name="line.907"></a>
+<span class="sourceLineNo">908</span> // Tag compression is been used. uncompress it into tagsBuffer<a name="line.908"></a>
+<span class="sourceLineNo">909</span> current.ensureSpaceForTags();<a name="line.909"></a>
+<span class="sourceLineNo">910</span> try {<a name="line.910"></a>
+<span class="sourceLineNo">911</span> current.tagsCompressedLength = tagCompressionContext.uncompressTags(currentBuffer,<a name="line.911"></a>
+<span class="sourceLineNo">912</span> current.tagsBuffer, 0, current.tagsLength);<a name="line.912"></a>
+<span class="sourceLineNo">913</span> } catch (Exception e) {<a name="line.913"></a>
+<span class="sourceLineNo">914</span> throw new RuntimeException("Exception while uncompressing tags", e);<a name="line.914"></a>
+<span class="sourceLineNo">915</span> }<a name="line.915"></a>
+<span class="sourceLineNo">916</span> } else {<a name="line.916"></a>
+<span class="sourceLineNo">917</span> currentBuffer.skip(current.tagsCompressedLength);<a name="line.917"></a>
+<span class="sourceLineNo">918</span> current.uncompressTags = true;// Reset this.<a name="line.918"></a>
+<span class="sourceLineNo">919</span> }<a name="line.919"></a>
+<span class="sourceLineNo">920</span> current.tagsOffset = -1;<a name="line.920"></a>
+<span class="sourceLineNo">921</span> } else {<a name="line.921"></a>
+<span class="sourceLineNo">922</span> // When tag compress is not used, let us not do copying of tags bytes into tagsBuffer.<a name="line.922"></a>
+<span class="sourceLineNo">923</span> // Just mark the tags Offset so as to create the KV buffer later in getKeyValueBuffer()<a name="line.923"></a>
+<span class="sourceLineNo">924</span> current.tagsOffset = currentBuffer.position();<a name="line.924"></a>
+<span class="sourceLineNo">925</span> currentBuffer.skip(current.tagsLength);<a name="line.925"></a>
+<span class="sourceLineNo">926</span> }<a name="line.926"></a>
+<span class="sourceLineNo">927</span> }<a name="line.927"></a>
+<span class="sourceLineNo">928</span><a name="line.928"></a>
+<span class="sourceLineNo">929</span> @Override<a name="line.929"></a>
+<span class="sourceLineNo">930</span> public int seekToKeyInBlock(Cell seekCell, boolean seekBefore) {<a name="line.930"></a>
+<span class="sourceLineNo">931</span> int rowCommonPrefix = 0;<a name="line.931"></a>
+<span class="sourceLineNo">932</span> int familyCommonPrefix = 0;<a name="line.932"></a>
+<span class="sourceLineNo">933</span> int qualCommonPrefix = 0;<a name="line.933"></a>
+<span class="sourceLineNo">934</span> previous.invalidate();<a name="line.934"></a>
+<span class="sourceLineNo">935</span> do {<a name="line.935"></a>
+<span class="sourceLineNo">936</span> int comp;<a name="line.936"></a>
+<span class="sourceLineNo">937</span> keyOnlyKV.setKey(current.keyBuffer, 0, current.keyLength);<a name="line.937"></a>
+<span class="sourceLineNo">938</span> if (current.lastCommonPrefix != 0) {<a name="line.938"></a>
+<span class="sourceLineNo">939</span> // The KV format has row key length also in the byte array. The<a name="line.939"></a>
+<span class="sourceLineNo">940</span> // common prefix<a name="line.940"></a>
+<span class="sourceLineNo">941</span> // includes it. So we need to subtract to find out the common prefix<a name="line.941"></a>
+<span class="sourceLineNo">942</span> // in the<a name="line.942"></a>
+<span class="sourceLineNo">943</span> // row part alone<a name="line.943"></a>
+<span class="sourceLineNo">944</span> rowCommonPrefix = Math.min(rowCommonPrefix, current.lastCommonPrefix - 2);<a name="line.944"></a>
+<span class="sourceLineNo">945</span> }<a name="line.945"></a>
+<span class="sourceLineNo">946</span> if (current.lastCommonPrefix <= 2) {<a name="line.946"></a>
+<span class="sourceLineNo">947</span> rowCommonPrefix = 0;<a name="line.947"></a>
+<span class="sourceLineNo">948</span> }<a name="line.948"></a>
+<span class="sourceLineNo">949</span> rowCommonPrefix += findCommonPrefixInRowPart(seekCell, keyOnlyKV, rowCommonPrefix);<a name="line.949"></a>
+<span class="sourceLineNo">950</span> comp = compareCommonRowPrefix(seekCell, keyOnlyKV, rowCommonPrefix);<a name="line.950"></a>
+<span class="sourceLineNo">951</span> if (comp == 0) {<a name="line.951"></a>
+<span class="sourceLineNo">952</span> comp = compareTypeBytes(seekCell, keyOnlyKV);<a name="line.952"></a>
+<span class="sourceLineNo">953</span> if (comp == 0) {<a name="line.953"></a>
+<span class="sourceLineNo">954</span> // Subtract the fixed row key length and the family key fixed length<a name="line.954"></a>
+<span class="sourceLineNo">955</span> familyCommonPrefix = Math.max(0, Math.min(familyCommonPrefix,<a name="line.955"></a>
+<span class="sourceLineNo">956</span> current.lastCommonPrefix - (3 + keyOnlyKV.getRowLength())));<a name="line.956"></a>
+<span class="sourceLineNo">957</span> familyCommonPrefix +=<a name="line.957"></a>
+<span class="sourceLineNo">958</span> findCommonPrefixInFamilyPart(seekCell, keyOnlyKV, familyCommonPrefix);<a name="line.958"></a>
+<span class="sourceLineNo">959</span> comp = compareCommonFamilyPrefix(seekCell, keyOnlyKV, familyCommonPrefix);<a name="line.959"></a>
+<span class="sourceLineNo">960</span> if (comp == 0) {<a name="line.960"></a>
+<span class="sourceLineNo">961</span> // subtract the rowkey fixed length and the family key fixed<a name="line.961"></a>
+<span class="sourceLineNo">962</span> // length<a name="line.962"></a>
+<span class="sourceLineNo">963</span> qualCommonPrefix = Math.max(0, Math.min(qualCommonPrefix, current.lastCommonPrefix<a name="line.963"></a>
+<span class="sourceLineNo">964</span> - (3 + keyOnlyKV.getRowLength() + keyOnlyKV.getFamilyLength())));<a name="line.964"></a>
+<span class="sourceLineNo">965</span> qualCommonPrefix +=<a name="line.965"></a>
+<span class="sourceLineNo">966</span> findCommonPrefixInQualifierPart(seekCell, keyOnlyKV, qualCommonPrefix);<a name="line.966"></a>
+<span class="sourceLineNo">967</span> comp = compareCommonQualifierPrefix(seekCell, keyOnlyKV, qualCommonPrefix);<a name="line.967"></a>
+<span class="sourceLineNo">968</span> if (comp == 0) {<a name="line.968"></a>
+<span class="sourceLineNo">969</span> comp = CellComparator.getInstance().compareTimestamps(seekCell, keyOnlyKV);<a name="line.969"></a>
+<span class="sourceLineNo">970</span> if (comp == 0) {<a name="line.970"></a>
+<span class="sourceLineNo">971</span> // Compare types. Let the delete types sort ahead of puts;<a name="line.971"></a>
+<span class="sourceLineNo">972</span> // i.e. types<a name="line.972"></a>
+<span class="sourceLineNo">973</span> // of higher numbers sort before those of lesser numbers.<a name="line.973"></a>
+<span class="sourceLineNo">974</span> // Maximum<a name="line.974"></a>
+<span class="sourceLineNo">975</span> // (255)<a name="line.975"></a>
+<span class="sourceLineNo">976</span> // appears ahead of everything, and minimum (0) appears<a name="line.976"></a>
+<span class="sourceLineNo">977</span> // after<a name="line.977"></a>
+<span class="sourceLineNo">978</span> // everything.<a name="line.978"></a>
+<span class="sourceLineNo">979</span> comp = (0xff & keyOnlyKV.getTypeByte()) - (0xff & seekCell.getTypeByte());<a name="line.979"></a>
+<span class="sourceLineNo">980</span> }<a name="line.980"></a>
+<span class="sourceLineNo">981</span> }<a name="line.981"></a>
+<span class="sourceLineNo">982</span> }<a name="line.982"></a>
+<span class="sourceLineNo">983</span> }<a name="line.983"></a>
+<span class="sourceLineNo">984</span> }<a name="line.984"></a>
+<span class="sourceLineNo">985</span> if (comp == 0) { // exact match<a name="line.985"></a>
+<span class="sourceLineNo">986</span> if (seekBefore) {<a name="line.986"></a>
+<span class="sourceLineNo">987</span> if (!previous.isValid()) {<a name="line.987"></a>
+<span class="sourceLineNo">988</span> // The caller (seekBefore) has to ensure that we are not at the<a name="line.988"></a>
+<span class="sourceLineNo">989</span> // first key in the block.<a name="line.989"></a>
+<span class="sourceLineNo">990</span> throw new IllegalStateException(<a name="line.990"></a>
+<span class="sourceLineNo">991</span> "Cannot seekBefore if " + "positioned at the first key in the block: key="<a name="line.991"></a>
+<span class="sourceLineNo">992</span> + Bytes.toStringBinary(seekCell.getRowArray()));<a name="line.992"></a>
+<span class="sourceLineNo">993</span> }<a name="line.993"></a>
+<span class="sourceLineNo">994</span> moveToPrevious();<a name="line.994"></a>
+<span class="sourceLineNo">995</span> return 1;<a name="line.995"></a>
+<span class="sourceLineNo">996</span> }<a name="line.996"></a>
+<span class="sourceLineNo">997</span> return 0;<a name="line.997"></a>
+<span class="sourceLineNo">998</span> }<a name="line.998"></a>
+<span class="sourceLineNo">999</span><a name="line.999"></a>
+<span class="sourceLineNo">1000</span> if (comp < 0) { // already too large, check previous<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span> if (previous.isValid()) {<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span> moveToPrevious();<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span> } else {<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span> return HConstants.INDEX_KEY_MAGIC; // using optimized index key<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span> }<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span> return 1;<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span> }<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span><a name="line.1008"></a>
+<span class="sourceLineNo">1009</span> // move to next, if more data is available<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span> if (currentBuffer.hasRemaining()) {<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span> previous.copyFromNext(current);<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span> decodeNext();<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span> current.setKey(current.keyBuffer, current.memstoreTS);<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span> } else {<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span> break;<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span> }<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span> } while (true);<a name="line.1017"></a>
<span class="sourceLineNo">1018</span><a name="line.1018"></a>
-<span class="sourceLineNo">1019</span> private int compareTypeBytes(Cell key, Cell right) {<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span> if (<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span> key.getFamilyLength() + key.getQualifierLength() == 0<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span> && key.getTypeByte() == KeyValue.Type.Minimum.getCode()<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span> ) {<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span> // left is "bigger", i.e. it appears later in the sorted order<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span> return 1;<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span> }<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span> if (<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span> right.getFamilyLength() + right.getQualifierLength() == 0<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span> && right.getTypeByte() == KeyValue.Type.Minimum.getCode()<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span> ) {<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span> return -1;<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span> }<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span> return 0;<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span> }<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span><a name="line.1035"></a>
-<span class="sourceLineNo">1036</span> // These findCommonPrefix* methods rely on the fact that keyOnlyKv is the "right" cell argument<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span> // and always on-heap<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span><a name="line.1038"></a>
-<span class="sourceLineNo">1039</span> private static int findCommonPrefixInRowPart(Cell left, KeyValue.KeyOnlyKeyValue right,<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span> int rowCommonPrefix) {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span> if (left instanceof ByteBufferExtendedCell) {<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span> ByteBufferExtendedCell bbLeft = (ByteBufferExtendedCell) left;<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span> return ByteBufferUtils.findCommonPrefix(bbLeft.getRowByteBuffer(),<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span> bbLeft.getRowPosition() + rowCommonPrefix, left.getRowLength() - rowCommonPrefix,<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span> right.getRowArray(), right.getRowOffset() + rowCommonPrefix,<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span> right.getRowLength() - rowCommonPrefix);<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span> } else {<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span> return Bytes.findCommonPrefix(left.getRowArray(), right.getRowArray(),<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span> left.getRowLength() - rowCommonPrefix, right.getRowLength() - rowCommonPrefix,<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span> left.getRowOffset() + rowCommonPrefix, right.getRowOffset() + rowCommonPrefix);<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span> }<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span> }<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span><a name="line.1053"></a>
-<span class="sourceLineNo">1054</span> private static int findCommonPrefixInFamilyPart(Cell left, KeyValue.KeyOnlyKeyValue right,<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span> int familyCommonPrefix) {<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span> if (left instanceof ByteBufferExtendedCell) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span> ByteBufferExtendedCell bbLeft = (ByteBufferExtendedCell) left;<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span> return ByteBufferUtils.findCommonPrefix(bbLeft.getFamilyByteBuffer(),<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span> bbLeft.getFamilyPosition() + familyCommonPrefix,<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span> left.getFamilyLength() - familyCommonPrefix, right.getFamilyArray(),<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span> right.getFamilyOffset() + familyCommonPrefix,<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span> right.getFamilyLength() - familyCommonPrefix);<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span> } else {<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span> return Bytes.findCommonPrefix(left.getFamilyArray(), right.getFamilyArray(),<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span> left.getFamilyLength() - familyCommonPrefix, right.getFamilyLength() - familyCommonPrefix,<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span> left.getFamilyOffset() + familyCommonPrefix,<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span> right.getFamilyOffset() + familyCommonPrefix);<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span> }<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span> }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span><a name="line.1070"></a>
-<span class="sourceLineNo">1071</span> private static int findCommonPrefixInQualifierPart(Cell left, KeyValue.KeyOnlyKeyValue right,<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span> int qualifierCommonPrefix) {<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span> if (left instanceof ByteBufferExtendedCell) {<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span> ByteBufferExtendedCell bbLeft = (ByteBufferExtendedCell) left;<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span> return ByteBufferUtils.findCommonPrefix(bbLeft.getQualifierByteBuffer(),<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span> bbLeft.getQualifierPosition() + qualifierCommonPrefix,<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span> left.getQualifierLength() - qualifierCommonPrefix, right.getQualifierArray(),<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span> right.getQualifierOffset() + qualifierCommonPrefix,<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span> right.getQualifierLength() - qualifierCommonPrefix);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span> } else {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span> return Bytes.findCommonPrefix(left.getQualifierArray(), right.getQualifierArray(),<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span> left.getQualifierLength() - qualifierCommonPrefix,<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span> right.getQualifierLength() - qualifierCommonPrefix,<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span> left.getQualifierOffset() + qualifierCommonPrefix,<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span> right.getQualifierOffset() + qualifierCommonPrefix);<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span> }<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span> }<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span><a name="line.1088"></a>
-<span class="sourceLineNo">1089</span> private void moveToPrevious() {<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span> if (!previous.isValid()) {<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span> throw new IllegalStateException(<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span> "Can move back only once and not in first key in the block.");<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span> }<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span><a name="line.1094"></a>
-<span class="sourceLineNo">1095</span> STATE tmp = previous;<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span> previous = current;<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span> current = tmp;<a name="line.1097"></a>
+<span class="sourceLineNo">1019</span> // we hit the end of the block, not an exact match<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span> return 1;<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> private int compareTypeBytes(Cell key, Cell right) {<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span> if (<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span> key.getFamilyLength() + key.getQualifierLength() == 0<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span> && key.getTypeByte() == KeyValue.Type.Minimum.getCode()<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span> ) {<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span> // left is "bigger", i.e. it appears later in the sorted order<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span> return 1;<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span> }<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span> if (<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span> right.getFamilyLength() + right.getQualifierLength() == 0<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span> && right.getTypeByte() == KeyValue.Type.Minimum.getCode()<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span> ) {<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span> return -1;<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span> }<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span> return 0;<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span> }<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span><a name="line.1039"></a>
+<span class="sourceLineNo">1040</span> // These findCommonPrefix* methods rely on the fact that keyOnlyKv is the "right" cell argument<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span> // and always on-heap<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span><a name="line.1042"></a>
+<span class="sourceLineNo">1043</span> private static int findCommonPrefixInRowPart(Cell left, KeyValue.KeyOnlyKeyValue right,<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span> int rowCommonPrefix) {<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span> if (left instanceof ByteBufferExtendedCell) {<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span> ByteBufferExtendedCell bbLeft = (ByteBufferExtendedCell) left;<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span> return ByteBufferUtils.findCommonPrefix(bbLeft.getRowByteBuffer(),<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span> bbLeft.getRowPosition() + rowCommonPrefix, left.getRowLength() - rowCommonPrefix,<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span> right.getRowArray(), right.getRowOffset() + rowCommonPrefix,<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span> right.getRowLength() - rowCommonPrefix);<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span> } else {<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span> return Bytes.findCommonPrefix(left.getRowArray(), right.getRowArray(),<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span> left.getRowLength() - rowCommonPrefix, right.getRowLength() - rowCommonPrefix,<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span> left.getRowOffset() + rowCommonPrefix, right.getRowOffset() + rowCommonPrefix);<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span> }<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span> }<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span> private static int findCommonPrefixInFamilyPart(Cell left, KeyValue.KeyOnlyKeyValue right,<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span> int familyCommonPrefix) {<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span> if (left instanceof ByteBufferExtendedCell) {<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span> ByteBufferExtendedCell bbLeft = (ByteBufferExtendedCell) left;<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span> return ByteBufferUtils.findCommonPrefix(bbLeft.getFamilyByteBuffer(),<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span> bbLeft.getFamilyPosition() + familyCommonPrefix,<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span> left.getFamilyLength() - familyCommonPrefix, right.getFamilyArray(),<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span> right.getFamilyOffset() + familyCommonPrefix,<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span> right.getFamilyLength() - familyCommonPrefix);<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span> } else {<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span> return Bytes.findCommonPrefix(left.getFamilyArray(), right.getFamilyArray(),<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span> left.getFamilyLength() - familyCommonPrefix, right.getFamilyLength() - familyCommonPrefix,<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span> left.getFamilyOffset() + familyCommonPrefix,<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span> right.getFamilyOffset() + familyCommonPrefix);<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span> }<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span> }<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span><a name="line.1074"></a>
+<span class="sourceLineNo">1075</span> private static int findCommonPrefixInQualifierPart(Cell left, KeyValue.KeyOnlyKeyValue right,<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span> int qualifierCommonPrefix) {<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span> if (left instanceof ByteBufferExtendedCell) {<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span> ByteBufferExtendedCell bbLeft = (ByteBufferExtendedCell) left;<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span> return ByteBufferUtils.findCommonPrefix(bbLeft.getQualifierByteBuffer(),<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span> bbLeft.getQualifierPosition() + qualifierCommonPrefix,<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span> left.getQualifierLength() - qualifierCommonPrefix, right.getQualifierArray(),<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span> right.getQualifierOffset() + qualifierCommonPrefix,<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span> right.getQualifierLength() - qualifierCommonPrefix);<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span> } else {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span> return Bytes.findCommonPrefix(left.getQualifierArray(), right.getQualifierArray(),<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span> left.getQualifierLength() - qualifierCommonPrefix,<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span> right.getQualifierLength() - qualifierCommonPrefix,<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span> left.getQualifierOffset() + qualifierCommonPrefix,<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span> right.getQualifierOffset() + qualifierCommonPrefix);<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> private void moveToPrevious() {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span> if (!previous.isValid()) {<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span> throw new IllegalStateException(<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span> "Can move back only once and not in first key in the block.");<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span> }<a name="line.1097"></a>
<span class="sourceLineNo">1098</span><a name="line.1098"></a>
-<span class="sourceLineNo">1099</span> // move after last key value<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span> currentBuffer.position(current.nextKvOffset);<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span> // Already decoded the tag bytes. We cache this tags into current state and also the total<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span> // compressed length of the tags bytes. For the next time decodeNext() we don't need to decode<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span> // the tags again. This might pollute the Data Dictionary what we use for the compression.<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span> // When current.uncompressTags is false, we will just reuse the current.tagsBuffer and skip<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span> // 'tagsCompressedLength' bytes of source stream.<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span> // See in decodeTags()<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span> current.tagsBuffer = previous.tagsBuffer;<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span> current.tagsCompressedLength = previous.tagsCompressedLength;<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span> current.uncompressTags = false;<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span> // The current key has to be reset with the previous Cell<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span> current.setKey(current.keyBuffer, current.memstoreTS);<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span> previous.invalidate();<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span> }<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span><a name="line.1114"></a>
-<span class="sourceLineNo">1115</span> @SuppressWarnings("unchecked")<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span> protected STATE createSeekerState() {<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span> // This will fail for non-default seeker state if the subclass does not<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span> // override this method.<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span> return (STATE) new SeekerState(this.tmpPair, this.includesTags());<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span> }<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span><a name="line.1121"></a>
-<span class="sourceLineNo">1122</span> abstract protected void decodeFirst();<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span><a name="line.1123"></a>
-<span class="sourceLineNo">1124</span> abstract protected void decodeNext();<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span> }<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span><a name="line.1126"></a>
-<span class="sourceLineNo">1127</span> /** Returns unencoded size added */<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span> protected final int afterEncodingKeyValue(Cell cell, DataOutputStream out,<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span> HFileBlockDefaultEncodingContext encodingCtx) throws IOException {<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span> int size = 0;<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span> if (encodingCtx.getHFileContext().isIncludesTags()) {<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span> int tagsLength = cell.getTagsLength();<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span> ByteBufferUtils.putCompressedInt(out, tagsLength);<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span> // There are some tags to be written<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span> if (tagsLength > 0) {<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span> TagCompressionContext tagCompressionContext = encodingCtx.getTagCompressionContext();<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span> // When tag compression is enabled, tagCompressionContext will have a not null value. Write<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span> // the tags using Dictionary compression in such a case<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span> if (tagCompressionContext != null) {<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span> // Not passing tagsLength considering that parsing of the tagsLength is not costly<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span> PrivateCellUtil.compressTags(out, cell, tagCompressionContext);<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span> } else {<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span> PrivateCellUtil.writeTags(out, cell, tagsLength);<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> size += tagsLength + KeyValue.TAGS_LENGTH_SIZE;<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span> }<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span> if (encodingCtx.getHFileContext().isIncludesMvcc()) {<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span> // Copy memstore timestamp from the byte buffer to the output stream.<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span> long memstoreTS = cell.getSequenceId();<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span> WritableUtils.writeVLong(out, memstoreTS);<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span> // TODO use a writeVLong which returns the #bytes written so that 2 time parsing can be<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span> // avoided.<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span> size += WritableUtils.getVIntSize(memstoreTS);<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span> }<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span> return size;<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span> }<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span><a name="line.1158"></a>
-<span class="sourceLineNo">1159</span> protected final void afterDecodingKeyValue(DataInputStream source, ByteBuffer dest,<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span> HFileBlockDefaultDecodingContext decodingCtx) throws IOException {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span> if (decodingCtx.getHFileContext().isIncludesTags()) {<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span> int tagsLength = ByteBufferUtils.readCompressedInt(source);<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span> // Put as unsigned short<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span> dest.put((byte) ((tagsLength >> 8) & 0xff));<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span> dest.put((byte) (tagsLength & 0xff));<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span> if (tagsLength > 0) {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span> TagCompressionContext tagCompressionContext = decodingCtx.getTagCompressionContext();<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span> // When tag compression is been used in this file, tagCompressionContext will have a not<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span> // null value passed.<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span> if (tagCompressionContext != null) {<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span> tagCompressionContext.uncompressTags(source, dest, tagsLength);<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span> } else {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span> ByteBufferUtils.copyFromStreamToBuffer(dest, source, tagsLength);<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span> }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span> }<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span> }<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span> if (decodingCtx.getHFileContext().isIncludesMvcc()) {<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span> long memstoreTS = -1;<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span> try {<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span> // Copy memstore timestamp from the data input stream to the byte<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span> // buffer.<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span> memstoreTS = WritableUtils.readVLong(source);<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span> ByteBufferUtils.writeVLong(dest, memstoreTS);<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span> } catch (IOException ex) {<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span> throw new RuntimeException(<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span> "Unable to copy memstore timestamp " + memstoreTS + " after decoding a key/value");<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span> }<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> protected abstract ByteBuffer internalDecodeKeyValues(DataInputStream source,<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span> int allocateHeaderLength, int skipLastBytes, HFileBlockDefaultDecodingContext decodingCtx)<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span> throws IOException;<a name="line.1193"></a>
+<span class="sourceLineNo">1099</span> STATE tmp = previous;<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span> previous = current;<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span> current = tmp;<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span><a name="line.1102"></a>
+<span class="sourceLineNo">1103</span> // move after last key value<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span> currentBuffer.position(current.nextKvOffset);<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span> // Already decoded the tag bytes. We cache this tags into current state and also the total<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span> // compressed length of the tags bytes. For the next time decodeNext() we don't need to decode<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span> // the tags again. This might pollute the Data Dictionary what we use for the compression.<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span> // When current.uncompressTags is false, we will just reuse the current.tagsBuffer and skip<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span> // 'tagsCompressedLength' bytes of source stream.<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span> // See in decodeTags()<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span> current.tagsBuffer = previous.tagsBuffer;<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span> current.tagsCompressedLength = previous.tagsCompressedLength;<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span> current.uncompressTags = false;<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span> // The current key has to be reset with the previous Cell<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span> current.setKey(current.keyBuffer, current.memstoreTS);<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span> previous.invalidate();<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span> }<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span><a name="line.1118"></a>
+<span class="sourceLineNo">1119</span> @SuppressWarnings("unchecked")<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span> protected STATE createSeekerState() {<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span> // This will fail for non-default seeker state if the subclass does not<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span> // override this method.<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span> return (STATE) new SeekerState(this.tmpPair, this.includesTags());<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span> }<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span><a name="line.1125"></a>
+<span class="sourceLineNo">1126</span> abstract protected void decodeFirst();<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span><a name="line.1127"></a>
+<span class="sourceLineNo">1128</span> abstract protected void decodeNext();<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span> }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span><a name="line.1130"></a>
+<span class="sourceLineNo">1131</span> /** Returns unencoded size added */<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span> protected final int afterEncodingKeyValue(Cell cell, DataOutputStream out,<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span> HFileBlockDefaultEncodingContext encodingCtx) throws IOException {<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span> int size = 0;<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span> if (encodingCtx.getHFileContext().isIncludesTags()) {<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span> int tagsLength = cell.getTagsLength();<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span> ByteBufferUtils.putCompressedInt(out, tagsLength);<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span> // There are some tags to be written<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span> if (tagsLength > 0) {<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span> TagCompressionContext tagCompressionContext = encodingCtx.getTagCompressionContext();<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span> // When tag compression is enabled, tagCompressionContext will have a not null value. Write<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span> // the tags using Dictionary compression in such a case<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span> if (tagCompressionContext != null) {<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span> // Not passing tagsLength considering that parsing of the tagsLength is not costly<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span> PrivateCellUtil.compressTags(out, cell, tagCompressionContext);<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span> } else {<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span> PrivateCellUtil.writeTags(out, cell, tagsLength);<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span> }<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span> }<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span> size += tagsLength + KeyValue.TAGS_LENGTH_SIZE;<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span> }<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span> if (encodingCtx.getHFileContext().isIncludesMvcc()) {<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span> // Copy memstore timestamp from the byte buffer to the output stream.<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span> long memstoreTS = cell.getSequenceId();<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span> WritableUtils.writeVLong(out, memstoreTS);<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span> // TODO use a writeVLong which returns the #bytes written so that 2 time parsing can be<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span> // avoided.<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span> size += WritableUtils.getVIntSize(memstoreTS);<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span> }<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span> return size;<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span> }<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span><a name="line.1162"></a>
+<span class="sourceLineNo">1163</span> protected final void afterDecodingKeyValue(DataInputStream source, ByteBuffer dest,<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span> HFileBlockDefaultDecodingContext decodingCtx) throws IOException {<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span> if (decodingCtx.getHFileContext().isIncludesTags()) {<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span> int tagsLength = ByteBufferUtils.readCompressedInt(source);<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span> // Put as unsigned short<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span> dest.put((byte) ((tagsLength >> 8) & 0xff));<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span> dest.put((byte) (tagsLength & 0xff));<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span> if (tagsLength > 0) {<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span> TagCompressionContext tagCompressionContext = decodingCtx.getTagCompressionContext();<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span> // When tag compression is been used in this file, tagCompressionContext will have a not<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span> // null value passed.<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span> if (tagCompressionContext != null) {<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span> tagCompressionContext.uncompressTags(source, dest, tagsLength);<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span> } else {<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span> ByteBufferUtils.copyFromStreamToBuffer(dest, source, tagsLength);<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> }<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span> if (decodingCtx.getHFileContext().isIncludesMvcc()) {<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span> long memstoreTS = -1;<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span> try {<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span> // Copy memstore timestamp from the data input stream to the byte<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span> // buffer.<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span> memstoreTS = WritableUtils.readVLong(source);<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span> ByteBufferUtils.writeVLong(dest, memstoreTS);<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span> } catch (IOException ex) {<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span> throw new RuntimeException(<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span> "Unable to copy memstore timestamp " + memstoreTS + " after decoding a key/value");<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> }<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> * Asserts that there is at least the given amount of unfilled space remaining in the given<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span> * buffer.<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span> * @param out typically, the buffer we are writing to<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span> * @param length the required space in the buffer<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span> * @throws EncoderBufferTooSmallException If there are no enough bytes.<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span> */<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span> protected static void ensureSpace(ByteBuffer out, int length)<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span> throws EncoderBufferTooSmallException {<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span> if (out.position() + length > out.limit()) {<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span> throw new EncoderBufferTooSmallException("Buffer position=" + out.position()<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span> + ", buffer limit=" + out.limit() + ", length to be written=" + length);<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span> }<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span> }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span> @Override<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span> public void startBlockEncoding(HFileBlockEncodingContext blkEncodingCtx, DataOutputStream out)<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span> throws IOException {<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span> if (blkEncodingCtx.getClass() != HFileBlockDefaultEncodingContext.class) {<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span> throw new IOException(this.getClass().getName() + " only accepts "<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span> + HFileBlockDefaultEncodingContext.class.getName() + " as the " + "encoding context.");<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span> }<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span><a name="line.1217"></a>
-<span class="sourceLineNo">1218</span> HFileBlockDefaultEncodingContext encodingCtx =<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span> (HFileBlockDefaultEncodingContext) blkEncodingCtx;<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span> encodingCtx.prepareEncoding(out);<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span> if (<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span> encodingCtx.getHFileContext().isIncludesTags()<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span> && encodingCtx.getHFileContext().isCompressTags()<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span> ) {<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span> if (encodingCtx.getTagCompressionContext() != null) {<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span> // It will be overhead to create the TagCompressionContext again and again for every block<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span> // encoding.<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span> encodingCtx.getTagCompressionContext().clear();<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span> } else {<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span> try {<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span> TagCompressionContext tagCompressionContext =<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span> new TagCompressionContext(LRUDictionary.class, Byte.MAX_VALUE);<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span> encodingCtx.setTagCompressionContext(tagCompressionContext);<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span> } catch (Exception e) {<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span> throw new IOException("Failed to initialize TagCompressionContext", e);<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span> }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span> }<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span> }<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span> StreamUtils.writeInt(out, 0); // DUMMY length. This will be updated in endBlockEncoding()<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span> blkEncodingCtx.setEncodingState(new EncodingState());<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span> }<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span><a name="line.1242"></a>
-<span class="sourceLineNo">1243</span> @Override<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span> public void encode(Cell cell, HFileBlockEncodingContext encodingCtx, DataOutputStream out)<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span> throws IOException {<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span> EncodingState state = encodingCtx.getEncodingState();<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span> int posBeforeEncode = out.size();<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span> int encodedKvSize = internalEncode(cell, (HFileBlockDefaultEncodingContext) encodingCtx, out);<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span> state.postCellEncode(encodedKvSize, out.size() - posBeforeEncode);<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span> }<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span> public abstract int internalEncode(Cell cell, HFileBlockDefaultEncodingContext encodingCtx,<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span> DataOutputStream out) throws IOException;<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span><a name="line.1254"></a>
-<span class="sourceLineNo">1255</span> @Override<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span> public void endBlockEncoding(HFileBlockEncodingContext encodingCtx, DataOutputStream out,<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span> byte[] uncompressedBytesWithHeader) throws IOException {<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span> EncodingState state = encodingCtx.getEncodingState();<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span> // Write the unencodedDataSizeWritten (with header size)<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span> Bytes.putInt(uncompressedBytesWithHeader,<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span> HConstants.HFILEBLOCK_HEADER_SIZE + DataBlockEncoding.ID_SIZE,<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span> state.getUnencodedDataSizeWritten());<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span> postEncoding(encodingCtx);<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span> }<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span><a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>}<a name="line.1266"></a>
+<span class="sourceLineNo">1195</span> protected abstract ByteBuffer internalDecodeKeyValues(DataInputStream source,<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span> int allocateHeaderLength, int skipLastBytes, HFileBlockDefaultDecodingContext decodingCtx)<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span> throws IOException;<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> * Asserts that there is at least the given amount of unfilled space remaining in the given<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span> * buffer.<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span> * @param out typically, the buffer we are writing to<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span> * @param length the required space in the buffer<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span> * @throws EncoderBufferTooSmallException If there are no enough bytes.<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span> */<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span> protected static void ensureSpace(ByteBuffer out, int length)<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span> throws EncoderBufferTooSmallException {<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span> if (out.position() + length > out.limit()) {<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span> throw new EncoderBufferTooSmallException("Buffer position=" + out.position()<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span> + ", buffer limit=" + out.limit() + ", length to be written=" + length);<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span> }<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span> }<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span><a name="line.1213"></a>
+<span class="sourceLineNo">1214</span> @Override<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span> public void startBlockEncoding(HFileBlockEncodingContext blkEncodingCtx, DataOutputStream out)<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span> throws IOException {<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span> if (blkEncodingCtx.getClass() != HFileBlockDefaultEncodingContext.class) {<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span> throw new IOException(this.getClass().getName() + " only accepts "<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span> + HFileBlockDefaultEncodingContext.class.getName() + " as the " + "encoding context.");<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span> }<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span><a name="line.1221"></a>
+<span class="sourceLineNo">1222</span> HFileBlockDefaultEncodingContext encodingCtx =<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span> (HFileBlockDefaultEncodingContext) blkEncodingCtx;<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span> encodingCtx.prepareEncoding(out);<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span> if (<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span> encodingCtx.getHFileContext().isIncludesTags()<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span> && encodingCtx.getHFileContext().isCompressTags()<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span> ) {<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span> if (encodingCtx.getTagCompressionContext() != null) {<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span> // It will be overhead to create the TagCompressionContext again and again for every block<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span> // encoding.<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span> encodingCtx.getTagCompressionContext().clear();<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span> } else {<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span> try {<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span> TagCompressionContext tagCompressionContext =<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span> new TagCompressionContext(LRUDictionary.class, Byte.MAX_VALUE);<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span> encodingCtx.setTagCompressionContext(tagCompressionContext);<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span> } catch (Exception e) {<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span> throw new IOException("Failed to initialize TagCompressionContext", e);<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span> }<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span> }<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span> }<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span> StreamUtils.writeInt(out, 0); // DUMMY length. This will be updated in endBlockEncoding()<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span> blkEncodingCtx.setEncodingState(new EncodingState());<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span> }<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span><a name="line.1246"></a>
+<span class="sourceLineNo">1247</span> @Override<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span> public void encode(Cell cell, HFileBlockEncodingContext encodingCtx, DataOutputStream out)<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span> throws IOException {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span> EncodingState state = encodingCtx.getEncodingState();<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span> int posBeforeEncode = out.size();<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span> int encodedKvSize = internalEncode(cell, (HFileBlockDefaultEncodingContext) encodingCtx, out);<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span> state.postCellEncode(encodedKvSize, out.size() - posBeforeEncode);<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> public abstract int internalEncode(Cell cell, HFileBlockDefaultEncodingContext encodingCtx,<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span> DataOutputStream out) throws IOException;<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span><a name="line.1258"></a>
+<span class="sourceLineNo">1259</span> @Override<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span> public void endBlockEncoding(HFileBlockEncodingContext encodingCtx, DataOutputStream out,<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span> byte[] uncompressedBytesWithHeader) throws IOException {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span> EncodingState state = encodingCtx.getEncodingState();<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span> // Write the unencodedDataSizeWritten (with header size)<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span> Bytes.putInt(uncompressedBytesWithHeader,<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span> HConstants.HFILEBLOCK_HEADER_SIZE + DataBlockEncoding.ID_SIZE,<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span> state.getUnencodedDataSizeWritten());<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span> postEncoding(encodingCtx);<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span> }<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span><a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>}<a name="line.1270"></a>
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.html
index 5cdb93fd392..819724d6731 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.html
@@ -842,436 +842,440 @@
<span class="sourceLineNo">834</span> public void setCurrentBuffer(ByteBuff buffer) {<a name="line.834"></a>
<span class="sourceLineNo">835</span> if (this.tagCompressionContext != null) {<a name="line.835"></a>
<span class="sourceLineNo">836</span> this.tagCompressionContext.clear();<a name="line.836"></a>
-<span class="sourceLineNo">837</span> }<a name="line.837"></a>
-<span class="sourceLineNo">838</span> currentBuffer = buffer;<a name="line.838"></a>
-<span class="sourceLineNo">839</span> current.currentBuffer = currentBuffer;<a name="line.839"></a>
-<span class="sourceLineNo">840</span> if (tagCompressionContext != null) {<a name="line.840"></a>
-<span class="sourceLineNo">841</span> current.tagCompressionContext = tagCompressionContext;<a name="line.841"></a>
-<span class="sourceLineNo">842</span> }<a name="line.842"></a>
-<span class="sourceLineNo">843</span> decodeFirst();<a name="line.843"></a>
-<span class="sourceLineNo">844</span> current.setKey(current.keyBuffer, current.memstoreTS);<a name="line.844"></a>
-<span class="sourceLineNo">845</span> previous.invalidate();<a name="line.845"></a>
-<span class="sourceLineNo">846</span> }<a name="line.846"></a>
-<span class="sourceLineNo">847</span><a name="line.847"></a>
-<span class="sourceLineNo">848</span> @Override<a name="line.848"></a>
-<span class="sourceLineNo">849</span> public Cell getKey() {<a name="line.849"></a>
-<span class="sourceLineNo">850</span> byte[] key = new byte[current.keyLength];<a name="line.850"></a>
-<span class="sourceLineNo">851</span> System.arraycopy(current.keyBuffer, 0, key, 0, current.keyLength);<a name="line.851"></a>
-<span class="sourceLineNo">852</span> return new KeyValue.KeyOnlyKeyValue(key);<a name="line.852"></a>
+<span class="sourceLineNo">837</span><a name="line.837"></a>
+<span class="sourceLineNo">838</span> // Prior seekToKeyInBlock may have reset this to false if we fell back to previous<a name="line.838"></a>
+<span class="sourceLineNo">839</span> // seeker state. This is an optimization so we don't have to uncompress tags again when<a name="line.839"></a>
+<span class="sourceLineNo">840</span> // reading last state.<a name="line.840"></a>
+<span class="sourceLineNo">841</span> // In seekBefore flow, if block change happens then rewind is not called and<a name="line.841"></a>
+<span class="sourceLineNo">842</span> // setCurrentBuffer is called, so need to uncompress any tags we see.<a name="line.842"></a>
+<span class="sourceLineNo">843</span> current.uncompressTags = true;<a name="line.843"></a>
+<span class="sourceLineNo">844</span> }<a name="line.844"></a>
+<span class="sourceLineNo">845</span> currentBuffer = buffer;<a name="line.845"></a>
+<span class="sourceLineNo">846</span> current.currentBuffer = currentBuffer;<a name="line.846"></a>
+<span class="sourceLineNo">847</span> if (tagCompressionContext != null) {<a name="line.847"></a>
+<span class="sourceLineNo">848</span> current.tagCompressionContext = tagCompressionContext;<a name="line.848"></a>
+<span class="sourceLineNo">849</span> }<a name="line.849"></a>
+<span class="sourceLineNo">850</span> decodeFirst();<a name="line.850"></a>
+<span class="sourceLineNo">851</span> current.setKey(current.keyBuffer, current.memstoreTS);<a name="line.851"></a>
+<span class="sourceLineNo">852</span> previous.invalidate();<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> @Override<a name="line.855"></a>
-<span class="sourceLineNo">856</span> public ByteBuffer getValueShallowCopy() {<a name="line.856"></a>
-<span class="sourceLineNo">857</span> currentBuffer.asSubByteBuffer(current.valueOffset, current.valueLength, tmpPair);<a name="line.857"></a>
-<span class="sourceLineNo">858</span> ByteBuffer dup = tmpPair.getFirst().duplicate();<a name="line.858"></a>
-<span class="sourceLineNo">859</span> dup.position(tmpPair.getSecond());<a name="line.859"></a>
-<span class="sourceLineNo">860</span> dup.limit(tmpPair.getSecond() + current.valueLength);<a name="line.860"></a>
-<span class="sourceLineNo">861</span> return dup.slice();<a name="line.861"></a>
-<span class="sourceLineNo">862</span> }<a name="line.862"></a>
-<span class="sourceLineNo">863</span><a name="line.863"></a>
-<span class="sourceLineNo">864</span> @Override<a name="line.864"></a>
-<span class="sourceLineNo">865</span> public Cell getCell() {<a name="line.865"></a>
-<span class="sourceLineNo">866</span> return current.toCell();<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> @Override<a name="line.869"></a>
-<span class="sourceLineNo">870</span> public void rewind() {<a name="line.870"></a>
-<span class="sourceLineNo">871</span> currentBuffer.rewind();<a name="line.871"></a>
-<span class="sourceLineNo">872</span> if (tagCompressionContext != null) {<a name="line.872"></a>
-<span class="sourceLineNo">873</span> tagCompressionContext.clear();<a name="line.873"></a>
-<span class="sourceLineNo">874</span> // Prior seekToKeyInBlock may have reset this to false if we fell back to previous<a name="line.874"></a>
-<span class="sourceLineNo">875</span> // seeker state. This is an optimization so we don't have to uncompress tags again when<a name="line.875"></a>
-<span class="sourceLineNo">876</span> // reading last state.<a name="line.876"></a>
-<span class="sourceLineNo">877</span> // In case of rewind, we are starting from the beginning of the buffer, so we need<a name="line.877"></a>
-<span class="sourceLineNo">878</span> // to uncompress any tags we see.<a name="line.878"></a>
-<span class="sourceLineNo">879</span> // It may make sense to reset this in setCurrentBuffer as well, but we seem to only call<a name="line.879"></a>
-<span class="sourceLineNo">880</span> // setCurrentBuffer after StoreFileScanner.seekAtOrAfter which calls next to consume the<a name="line.880"></a>
-<span class="sourceLineNo">881</span> // seeker state. Rewind is called by seekBefore, which doesn't and leaves us in this state.<a name="line.881"></a>
-<span class="sourceLineNo">882</span> current.uncompressTags = true;<a name="line.882"></a>
-<span class="sourceLineNo">883</span> }<a name="line.883"></a>
-<span class="sourceLineNo">884</span> decodeFirst();<a name="line.884"></a>
-<span class="sourceLineNo">885</span> current.setKey(current.keyBuffer, current.memstoreTS);<a name="line.885"></a>
-<span class="sourceLineNo">886</span> previous.invalidate();<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>
-<span class="sourceLineNo">889</span> @Override<a name="line.889"></a>
-<span class="sourceLineNo">890</span> public boolean next() {<a name="line.890"></a>
-<span class="sourceLineNo">891</span> if (!currentBuffer.hasRemaining()) {<a name="line.891"></a>
-<span class="sourceLineNo">892</span> return false;<a name="line.892"></a>
-<span class="sourceLineNo">893</span> }<a name="line.893"></a>
-<span class="sourceLineNo">894</span> decodeNext();<a name="line.894"></a>
-<span class="sourceLineNo">895</span> current.setKey(current.keyBuffer, current.memstoreTS);<a name="line.895"></a>
-<span class="sourceLineNo">896</span> previous.invalidate();<a name="line.896"></a>
-<span class="sourceLineNo">897</span> return true;<a name="line.897"></a>
-<span class="sourceLineNo">898</span> }<a name="line.898"></a>
-<span class="sourceLineNo">899</span><a name="line.899"></a>
-<span class="sourceLineNo">900</span> protected void decodeTags() {<a name="line.900"></a>
-<span class="sourceLineNo">901</span> current.tagsLength = ByteBuff.readCompressedInt(currentBuffer);<a name="line.901"></a>
-<span class="sourceLineNo">902</span> if (tagCompressionContext != null) {<a name="line.902"></a>
-<span class="sourceLineNo">903</span> if (current.uncompressTags) {<a name="line.903"></a>
-<span class="sourceLineNo">904</span> // Tag compression is been used. uncompress it into tagsBuffer<a name="line.904"></a>
-<span class="sourceLineNo">905</span> current.ensureSpaceForTags();<a name="line.905"></a>
-<span class="sourceLineNo">906</span> try {<a name="line.906"></a>
-<span class="sourceLineNo">907</span> current.tagsCompressedLength = tagCompressionContext.uncompressTags(currentBuffer,<a name="line.907"></a>
-<span class="sourceLineNo">908</span> current.tagsBuffer, 0, current.tagsLength);<a name="line.908"></a>
-<span class="sourceLineNo">909</span> } catch (Exception e) {<a name="line.909"></a>
-<span class="sourceLineNo">910</span> throw new RuntimeException("Exception while uncompressing tags", e);<a name="line.910"></a>
-<span class="sourceLineNo">911</span> }<a name="line.911"></a>
-<span class="sourceLineNo">912</span> } else {<a name="line.912"></a>
-<span class="sourceLineNo">913</span> currentBuffer.skip(current.tagsCompressedLength);<a name="line.913"></a>
-<span class="sourceLineNo">914</span> current.uncompressTags = true;// Reset this.<a name="line.914"></a>
-<span class="sourceLineNo">915</span> }<a name="line.915"></a>
-<span class="sourceLineNo">916</span> current.tagsOffset = -1;<a name="line.916"></a>
-<span class="sourceLineNo">917</span> } else {<a name="line.917"></a>
-<span class="sourceLineNo">918</span> // When tag compress is not used, let us not do copying of tags bytes into tagsBuffer.<a name="line.918"></a>
-<span class="sourceLineNo">919</span> // Just mark the tags Offset so as to create the KV buffer later in getKeyValueBuffer()<a name="line.919"></a>
-<span class="sourceLineNo">920</span> current.tagsOffset = currentBuffer.position();<a name="line.920"></a>
-<span class="sourceLineNo">921</span> currentBuffer.skip(current.tagsLength);<a name="line.921"></a>
-<span class="sourceLineNo">922</span> }<a name="line.922"></a>
-<span class="sourceLineNo">923</span> }<a name="line.923"></a>
-<span class="sourceLineNo">924</span><a name="line.924"></a>
-<span class="sourceLineNo">925</span> @Override<a name="line.925"></a>
-<span class="sourceLineNo">926</span> public int seekToKeyInBlock(Cell seekCell, boolean seekBefore) {<a name="line.926"></a>
-<span class="sourceLineNo">927</span> int rowCommonPrefix = 0;<a name="line.927"></a>
-<span class="sourceLineNo">928</span> int familyCommonPrefix = 0;<a name="line.928"></a>
-<span class="sourceLineNo">929</span> int qualCommonPrefix = 0;<a name="line.929"></a>
-<span class="sourceLineNo">930</span> previous.invalidate();<a name="line.930"></a>
-<span class="sourceLineNo">931</span> do {<a name="line.931"></a>
-<span class="sourceLineNo">932</span> int comp;<a name="line.932"></a>
-<span class="sourceLineNo">933</span> keyOnlyKV.setKey(current.keyBuffer, 0, current.keyLength);<a name="line.933"></a>
-<span class="sourceLineNo">934</span> if (current.lastCommonPrefix != 0) {<a name="line.934"></a>
-<span class="sourceLineNo">935</span> // The KV format has row key length also in the byte array. The<a name="line.935"></a>
-<span class="sourceLineNo">936</span> // common prefix<a name="line.936"></a>
-<span class="sourceLineNo">937</span> // includes it. So we need to subtract to find out the common prefix<a name="line.937"></a>
-<span class="sourceLineNo">938</span> // in the<a name="line.938"></a>
-<span class="sourceLineNo">939</span> // row part alone<a name="line.939"></a>
-<span class="sourceLineNo">940</span> rowCommonPrefix = Math.min(rowCommonPrefix, current.lastCommonPrefix - 2);<a name="line.940"></a>
-<span class="sourceLineNo">941</span> }<a name="line.941"></a>
-<span class="sourceLineNo">942</span> if (current.lastCommonPrefix <= 2) {<a name="line.942"></a>
-<span class="sourceLineNo">943</span> rowCommonPrefix = 0;<a name="line.943"></a>
-<span class="sourceLineNo">944</span> }<a name="line.944"></a>
-<span class="sourceLineNo">945</span> rowCommonPrefix += findCommonPrefixInRowPart(seekCell, keyOnlyKV, rowCommonPrefix);<a name="line.945"></a>
-<span class="sourceLineNo">946</span> comp = compareCommonRowPrefix(seekCell, keyOnlyKV, rowCommonPrefix);<a name="line.946"></a>
-<span class="sourceLineNo">947</span> if (comp == 0) {<a name="line.947"></a>
-<span class="sourceLineNo">948</span> comp = compareTypeBytes(seekCell, keyOnlyKV);<a name="line.948"></a>
-<span class="sourceLineNo">949</span> if (comp == 0) {<a name="line.949"></a>
-<span class="sourceLineNo">950</span> // Subtract the fixed row key length and the family key fixed length<a name="line.950"></a>
-<span class="sourceLineNo">951</span> familyCommonPrefix = Math.max(0, Math.min(familyCommonPrefix,<a name="line.951"></a>
-<span class="sourceLineNo">952</span> current.lastCommonPrefix - (3 + keyOnlyKV.getRowLength())));<a name="line.952"></a>
-<span class="sourceLineNo">953</span> familyCommonPrefix +=<a name="line.953"></a>
-<span class="sourceLineNo">954</span> findCommonPrefixInFamilyPart(seekCell, keyOnlyKV, familyCommonPrefix);<a name="line.954"></a>
-<span class="sourceLineNo">955</span> comp = compareCommonFamilyPrefix(seekCell, keyOnlyKV, familyCommonPrefix);<a name="line.955"></a>
-<span class="sourceLineNo">956</span> if (comp == 0) {<a name="line.956"></a>
-<span class="sourceLineNo">957</span> // subtract the rowkey fixed length and the family key fixed<a name="line.957"></a>
-<span class="sourceLineNo">958</span> // length<a name="line.958"></a>
-<span class="sourceLineNo">959</span> qualCommonPrefix = Math.max(0, Math.min(qualCommonPrefix, current.lastCommonPrefix<a name="line.959"></a>
-<span class="sourceLineNo">960</span> - (3 + keyOnlyKV.getRowLength() + keyOnlyKV.getFamilyLength())));<a name="line.960"></a>
-<span class="sourceLineNo">961</span> qualCommonPrefix +=<a name="line.961"></a>
-<span class="sourceLineNo">962</span> findCommonPrefixInQualifierPart(seekCell, keyOnlyKV, qualCommonPrefix);<a name="line.962"></a>
-<span class="sourceLineNo">963</span> comp = compareCommonQualifierPrefix(seekCell, keyOnlyKV, qualCommonPrefix);<a name="line.963"></a>
-<span class="sourceLineNo">964</span> if (comp == 0) {<a name="line.964"></a>
-<span class="sourceLineNo">965</span> comp = CellComparator.getInstance().compareTimestamps(seekCell, keyOnlyKV);<a name="line.965"></a>
-<span class="sourceLineNo">966</span> if (comp == 0) {<a name="line.966"></a>
-<span class="sourceLineNo">967</span> // Compare types. Let the delete types sort ahead of puts;<a name="line.967"></a>
-<span class="sourceLineNo">968</span> // i.e. types<a name="line.968"></a>
-<span class="sourceLineNo">969</span> // of higher numbers sort before those of lesser numbers.<a name="line.969"></a>
-<span class="sourceLineNo">970</span> // Maximum<a name="line.970"></a>
-<span class="sourceLineNo">971</span> // (255)<a name="line.971"></a>
-<span class="sourceLineNo">972</span> // appears ahead of everything, and minimum (0) appears<a name="line.972"></a>
-<span class="sourceLineNo">973</span> // after<a name="line.973"></a>
-<span class="sourceLineNo">974</span> // everything.<a name="line.974"></a>
-<span class="sourceLineNo">975</span> comp = (0xff & keyOnlyKV.getTypeByte()) - (0xff & seekCell.getTypeByte());<a name="line.975"></a>
-<span class="sourceLineNo">976</span> }<a name="line.976"></a>
-<span class="sourceLineNo">977</span> }<a name="line.977"></a>
-<span class="sourceLineNo">978</span> }<a name="line.978"></a>
-<span class="sourceLineNo">979</span> }<a name="line.979"></a>
-<span class="sourceLineNo">980</span> }<a name="line.980"></a>
-<span class="sourceLineNo">981</span> if (comp == 0) { // exact match<a name="line.981"></a>
-<span class="sourceLineNo">982</span> if (seekBefore) {<a name="line.982"></a>
-<span class="sourceLineNo">983</span> if (!previous.isValid()) {<a name="line.983"></a>
-<span class="sourceLineNo">984</span> // The caller (seekBefore) has to ensure that we are not at the<a name="line.984"></a>
-<span class="sourceLineNo">985</span> // first key in the block.<a name="line.985"></a>
-<span class="sourceLineNo">986</span> throw new IllegalStateException(<a name="line.986"></a>
-<span class="sourceLineNo">987</span> "Cannot seekBefore if " + "positioned at the first key in the block: key="<a name="line.987"></a>
-<span class="sourceLineNo">988</span> + Bytes.toStringBinary(seekCell.getRowArray()));<a name="line.988"></a>
-<span class="sourceLineNo">989</span> }<a name="line.989"></a>
-<span class="sourceLineNo">990</span> moveToPrevious();<a name="line.990"></a>
-<span class="sourceLineNo">991</span> return 1;<a name="line.991"></a>
-<span class="sourceLineNo">992</span> }<a name="line.992"></a>
-<span class="sourceLineNo">993</span> return 0;<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> if (comp < 0) { // already too large, check previous<a name="line.996"></a>
-<span class="sourceLineNo">997</span> if (previous.isValid()) {<a name="line.997"></a>
-<span class="sourceLineNo">998</span> moveToPrevious();<a name="line.998"></a>
-<span class="sourceLineNo">999</span> } else {<a name="line.999"></a>
-<span class="sourceLineNo">1000</span> return HConstants.INDEX_KEY_MAGIC; // using optimized index key<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span> }<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span> return 1;<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span> }<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span><a name="line.1004"></a>
-<span class="sourceLineNo">1005</span> // move to next, if more data is available<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span> if (currentBuffer.hasRemaining()) {<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span> previous.copyFromNext(current);<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span> decodeNext();<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span> current.setKey(current.keyBuffer, current.memstoreTS);<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span> } else {<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span> break;<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span> }<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span> } while (true);<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span><a name="line.1014"></a>
-<span class="sourceLineNo">1015</span> // we hit the end of the block, not an exact match<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span> return 1;<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span> }<a name="line.1017"></a>
+<span class="sourceLineNo">856</span> public Cell getKey() {<a name="line.856"></a>
+<span class="sourceLineNo">857</span> byte[] key = new byte[current.keyLength];<a name="line.857"></a>
+<span class="sourceLineNo">858</span> System.arraycopy(current.keyBuffer, 0, key, 0, current.keyLength);<a name="line.858"></a>
+<span class="sourceLineNo">859</span> return new KeyValue.KeyOnlyKeyValue(key);<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> @Override<a name="line.862"></a>
+<span class="sourceLineNo">863</span> public ByteBuffer getValueShallowCopy() {<a name="line.863"></a>
+<span class="sourceLineNo">864</span> currentBuffer.asSubByteBuffer(current.valueOffset, current.valueLength, tmpPair);<a name="line.864"></a>
+<span class="sourceLineNo">865</span> ByteBuffer dup = tmpPair.getFirst().duplicate();<a name="line.865"></a>
+<span class="sourceLineNo">866</span> dup.position(tmpPair.getSecond());<a name="line.866"></a>
+<span class="sourceLineNo">867</span> dup.limit(tmpPair.getSecond() + current.valueLength);<a name="line.867"></a>
+<span class="sourceLineNo">868</span> return dup.slice();<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">871</span> @Override<a name="line.871"></a>
+<span class="sourceLineNo">872</span> public Cell getCell() {<a name="line.872"></a>
+<span class="sourceLineNo">873</span> return current.toCell();<a name="line.873"></a>
+<span class="sourceLineNo">874</span> }<a name="line.874"></a>
+<span class="sourceLineNo">875</span><a name="line.875"></a>
+<span class="sourceLineNo">876</span> @Override<a name="line.876"></a>
+<span class="sourceLineNo">877</span> public void rewind() {<a name="line.877"></a>
+<span class="sourceLineNo">878</span> currentBuffer.rewind();<a name="line.878"></a>
+<span class="sourceLineNo">879</span> if (tagCompressionContext != null) {<a name="line.879"></a>
+<span class="sourceLineNo">880</span> tagCompressionContext.clear();<a name="line.880"></a>
+<span class="sourceLineNo">881</span> // Prior seekToKeyInBlock may have reset this to false if we fell back to previous<a name="line.881"></a>
+<span class="sourceLineNo">882</span> // seeker state. This is an optimization so we don't have to uncompress tags again when<a name="line.882"></a>
+<span class="sourceLineNo">883</span> // reading last state.<a name="line.883"></a>
+<span class="sourceLineNo">884</span> // In case of rewind, we are starting from the beginning of the buffer, so we need<a name="line.884"></a>
+<span class="sourceLineNo">885</span> // to uncompress any tags we see.<a name="line.885"></a>
+<span class="sourceLineNo">886</span> current.uncompressTags = true;<a name="line.886"></a>
+<span class="sourceLineNo">887</span> }<a name="line.887"></a>
+<span class="sourceLineNo">888</span> decodeFirst();<a name="line.888"></a>
+<span class="sourceLineNo">889</span> current.setKey(current.keyBuffer, current.memstoreTS);<a name="line.889"></a>
+<span class="sourceLineNo">890</span> previous.invalidate();<a name="line.890"></a>
+<span class="sourceLineNo">891</span> }<a name="line.891"></a>
+<span class="sourceLineNo">892</span><a name="line.892"></a>
+<span class="sourceLineNo">893</span> @Override<a name="line.893"></a>
+<span class="sourceLineNo">894</span> public boolean next() {<a name="line.894"></a>
+<span class="sourceLineNo">895</span> if (!currentBuffer.hasRemaining()) {<a name="line.895"></a>
+<span class="sourceLineNo">896</span> return false;<a name="line.896"></a>
+<span class="sourceLineNo">897</span> }<a name="line.897"></a>
+<span class="sourceLineNo">898</span> decodeNext();<a name="line.898"></a>
+<span class="sourceLineNo">899</span> current.setKey(current.keyBuffer, current.memstoreTS);<a name="line.899"></a>
+<span class="sourceLineNo">900</span> previous.invalidate();<a name="line.900"></a>
+<span class="sourceLineNo">901</span> return true;<a name="line.901"></a>
+<span class="sourceLineNo">902</span> }<a name="line.902"></a>
+<span class="sourceLineNo">903</span><a name="line.903"></a>
+<span class="sourceLineNo">904</span> protected void decodeTags() {<a name="line.904"></a>
+<span class="sourceLineNo">905</span> current.tagsLength = ByteBuff.readCompressedInt(currentBuffer);<a name="line.905"></a>
+<span class="sourceLineNo">906</span> if (tagCompressionContext != null) {<a name="line.906"></a>
+<span class="sourceLineNo">907</span> if (current.uncompressTags) {<a name="line.907"></a>
+<span class="sourceLineNo">908</span> // Tag compression is been used. uncompress it into tagsBuffer<a name="line.908"></a>
+<span class="sourceLineNo">909</span> current.ensureSpaceForTags();<a name="line.909"></a>
+<span class="sourceLineNo">910</span> try {<a name="line.910"></a>
+<span class="sourceLineNo">911</span> current.tagsCompressedLength = tagCompressionContext.uncompressTags(currentBuffer,<a name="line.911"></a>
+<span class="sourceLineNo">912</span> current.tagsBuffer, 0, current.tagsLength);<a name="line.912"></a>
+<span class="sourceLineNo">913</span> } catch (Exception e) {<a name="line.913"></a>
+<span class="sourceLineNo">914</span> throw new RuntimeException("Exception while uncompressing tags", e);<a name="line.914"></a>
+<span class="sourceLineNo">915</span> }<a name="line.915"></a>
+<span class="sourceLineNo">916</span> } else {<a name="line.916"></a>
+<span class="sourceLineNo">917</span> currentBuffer.skip(current.tagsCompressedLength);<a name="line.917"></a>
+<span class="sourceLineNo">918</span> current.uncompressTags = true;// Reset this.<a name="line.918"></a>
+<span class="sourceLineNo">919</span> }<a name="line.919"></a>
+<span class="sourceLineNo">920</span> current.tagsOffset = -1;<a name="line.920"></a>
+<span class="sourceLineNo">921</span> } else {<a name="line.921"></a>
+<span class="sourceLineNo">922</span> // When tag compress is not used, let us not do copying of tags bytes into tagsBuffer.<a name="line.922"></a>
+<span class="sourceLineNo">923</span> // Just mark the tags Offset so as to create the KV buffer later in getKeyValueBuffer()<a name="line.923"></a>
+<span class="sourceLineNo">924</span> current.tagsOffset = currentBuffer.position();<a name="line.924"></a>
+<span class="sourceLineNo">925</span> currentBuffer.skip(current.tagsLength);<a name="line.925"></a>
+<span class="sourceLineNo">926</span> }<a name="line.926"></a>
+<span class="sourceLineNo">927</span> }<a name="line.927"></a>
+<span class="sourceLineNo">928</span><a name="line.928"></a>
+<span class="sourceLineNo">929</span> @Override<a name="line.929"></a>
+<span class="sourceLineNo">930</span> public int seekToKeyInBlock(Cell seekCell, boolean seekBefore) {<a name="line.930"></a>
+<span class="sourceLineNo">931</span> int rowCommonPrefix = 0;<a name="line.931"></a>
+<span class="sourceLineNo">932</span> int familyCommonPrefix = 0;<a name="line.932"></a>
+<span class="sourceLineNo">933</span> int qualCommonPrefix = 0;<a name="line.933"></a>
+<span class="sourceLineNo">934</span> previous.invalidate();<a name="line.934"></a>
+<span class="sourceLineNo">935</span> do {<a name="line.935"></a>
+<span class="sourceLineNo">936</span> int comp;<a name="line.936"></a>
+<span class="sourceLineNo">937</span> keyOnlyKV.setKey(current.keyBuffer, 0, current.keyLength);<a name="line.937"></a>
+<span class="sourceLineNo">938</span> if (current.lastCommonPrefix != 0) {<a name="line.938"></a>
+<span class="sourceLineNo">939</span> // The KV format has row key length also in the byte array. The<a name="line.939"></a>
+<span class="sourceLineNo">940</span> // common prefix<a name="line.940"></a>
+<span class="sourceLineNo">941</span> // includes it. So we need to subtract to find out the common prefix<a name="line.941"></a>
+<span class="sourceLineNo">942</span> // in the<a name="line.942"></a>
+<span class="sourceLineNo">943</span> // row part alone<a name="line.943"></a>
+<span class="sourceLineNo">944</span> rowCommonPrefix = Math.min(rowCommonPrefix, current.lastCommonPrefix - 2);<a name="line.944"></a>
+<span class="sourceLineNo">945</span> }<a name="line.945"></a>
+<span class="sourceLineNo">946</span> if (current.lastCommonPrefix <= 2) {<a name="line.946"></a>
+<span class="sourceLineNo">947</span> rowCommonPrefix = 0;<a name="line.947"></a>
+<span class="sourceLineNo">948</span> }<a name="line.948"></a>
+<span class="sourceLineNo">949</span> rowCommonPrefix += findCommonPrefixInRowPart(seekCell, keyOnlyKV, rowCommonPrefix);<a name="line.949"></a>
+<span class="sourceLineNo">950</span> comp = compareCommonRowPrefix(seekCell, keyOnlyKV, rowCommonPrefix);<a name="line.950"></a>
+<span class="sourceLineNo">951</span> if (comp == 0) {<a name="line.951"></a>
+<span class="sourceLineNo">952</span> comp = compareTypeBytes(seekCell, keyOnlyKV);<a name="line.952"></a>
+<span class="sourceLineNo">953</span> if (comp == 0) {<a name="line.953"></a>
+<span class="sourceLineNo">954</span> // Subtract the fixed row key length and the family key fixed length<a name="line.954"></a>
+<span class="sourceLineNo">955</span> familyCommonPrefix = Math.max(0, Math.min(familyCommonPrefix,<a name="line.955"></a>
+<span class="sourceLineNo">956</span> current.lastCommonPrefix - (3 + keyOnlyKV.getRowLength())));<a name="line.956"></a>
+<span class="sourceLineNo">957</span> familyCommonPrefix +=<a name="line.957"></a>
+<span class="sourceLineNo">958</span> findCommonPrefixInFamilyPart(seekCell, keyOnlyKV, familyCommonPrefix);<a name="line.958"></a>
+<span class="sourceLineNo">959</span> comp = compareCommonFamilyPrefix(seekCell, keyOnlyKV, familyCommonPrefix);<a name="line.959"></a>
+<span class="sourceLineNo">960</span> if (comp == 0) {<a name="line.960"></a>
+<span class="sourceLineNo">961</span> // subtract the rowkey fixed length and the family key fixed<a name="line.961"></a>
+<span class="sourceLineNo">962</span> // length<a name="line.962"></a>
+<span class="sourceLineNo">963</span> qualCommonPrefix = Math.max(0, Math.min(qualCommonPrefix, current.lastCommonPrefix<a name="line.963"></a>
+<span class="sourceLineNo">964</span> - (3 + keyOnlyKV.getRowLength() + keyOnlyKV.getFamilyLength())));<a name="line.964"></a>
+<span class="sourceLineNo">965</span> qualCommonPrefix +=<a name="line.965"></a>
+<span class="sourceLineNo">966</span> findCommonPrefixInQualifierPart(seekCell, keyOnlyKV, qualCommonPrefix);<a name="line.966"></a>
+<span class="sourceLineNo">967</span> comp = compareCommonQualifierPrefix(seekCell, keyOnlyKV, qualCommonPrefix);<a name="line.967"></a>
+<span class="sourceLineNo">968</span> if (comp == 0) {<a name="line.968"></a>
+<span class="sourceLineNo">969</span> comp = CellComparator.getInstance().compareTimestamps(seekCell, keyOnlyKV);<a name="line.969"></a>
+<span class="sourceLineNo">970</span> if (comp == 0) {<a name="line.970"></a>
+<span class="sourceLineNo">971</span> // Compare types. Let the delete types sort ahead of puts;<a name="line.971"></a>
+<span class="sourceLineNo">972</span> // i.e. types<a name="line.972"></a>
+<span class="sourceLineNo">973</span> // of higher numbers sort before those of lesser numbers.<a name="line.973"></a>
+<span class="sourceLineNo">974</span> // Maximum<a name="line.974"></a>
+<span class="sourceLineNo">975</span> // (255)<a name="line.975"></a>
+<span class="sourceLineNo">976</span> // appears ahead of everything, and minimum (0) appears<a name="line.976"></a>
+<span class="sourceLineNo">977</span> // after<a name="line.977"></a>
+<span class="sourceLineNo">978</span> // everything.<a name="line.978"></a>
+<span class="sourceLineNo">979</span> comp = (0xff & keyOnlyKV.getTypeByte()) - (0xff & seekCell.getTypeByte());<a name="line.979"></a>
+<span class="sourceLineNo">980</span> }<a name="line.980"></a>
+<span class="sourceLineNo">981</span> }<a name="line.981"></a>
+<span class="sourceLineNo">982</span> }<a name="line.982"></a>
+<span class="sourceLineNo">983</span> }<a name="line.983"></a>
+<span class="sourceLineNo">984</span> }<a name="line.984"></a>
+<span class="sourceLineNo">985</span> if (comp == 0) { // exact match<a name="line.985"></a>
+<span class="sourceLineNo">986</span> if (seekBefore) {<a name="line.986"></a>
+<span class="sourceLineNo">987</span> if (!previous.isValid()) {<a name="line.987"></a>
+<span class="sourceLineNo">988</span> // The caller (seekBefore) has to ensure that we are not at the<a name="line.988"></a>
+<span class="sourceLineNo">989</span> // first key in the block.<a name="line.989"></a>
+<span class="sourceLineNo">990</span> throw new IllegalStateException(<a name="line.990"></a>
+<span class="sourceLineNo">991</span> "Cannot seekBefore if " + "positioned at the first key in the block: key="<a name="line.991"></a>
+<span class="sourceLineNo">992</span> + Bytes.toStringBinary(seekCell.getRowArray()));<a name="line.992"></a>
+<span class="sourceLineNo">993</span> }<a name="line.993"></a>
+<span class="sourceLineNo">994</span> moveToPrevious();<a name="line.994"></a>
+<span class="sourceLineNo">995</span> return 1;<a name="line.995"></a>
+<span class="sourceLineNo">996</span> }<a name="line.996"></a>
+<span class="sourceLineNo">997</span> return 0;<a name="line.997"></a>
+<span class="sourceLineNo">998</span> }<a name="line.998"></a>
+<span class="sourceLineNo">999</span><a name="line.999"></a>
+<span class="sourceLineNo">1000</span> if (comp < 0) { // already too large, check previous<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span> if (previous.isValid()) {<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span> moveToPrevious();<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span> } else {<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span> return HConstants.INDEX_KEY_MAGIC; // using optimized index key<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span> }<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span> return 1;<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span> }<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span><a name="line.1008"></a>
+<span class="sourceLineNo">1009</span> // move to next, if more data is available<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span> if (currentBuffer.hasRemaining()) {<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span> previous.copyFromNext(current);<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span> decodeNext();<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span> current.setKey(current.keyBuffer, current.memstoreTS);<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span> } else {<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span> break;<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span> }<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span> } while (true);<a name="line.1017"></a>
<span class="sourceLineNo">1018</span><a name="line.1018"></a>
-<span class="sourceLineNo">1019</span> private int compareTypeBytes(Cell key, Cell right) {<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span> if (<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span> key.getFamilyLength() + key.getQualifierLength() == 0<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span> && key.getTypeByte() == KeyValue.Type.Minimum.getCode()<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span> ) {<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span> // left is "bigger", i.e. it appears later in the sorted order<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span> return 1;<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span> }<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span> if (<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span> right.getFamilyLength() + right.getQualifierLength() == 0<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span> && right.getTypeByte() == KeyValue.Type.Minimum.getCode()<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span> ) {<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span> return -1;<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span> }<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span> return 0;<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span> }<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span><a name="line.1035"></a>
-<span class="sourceLineNo">1036</span> // These findCommonPrefix* methods rely on the fact that keyOnlyKv is the "right" cell argument<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span> // and always on-heap<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span><a name="line.1038"></a>
-<span class="sourceLineNo">1039</span> private static int findCommonPrefixInRowPart(Cell left, KeyValue.KeyOnlyKeyValue right,<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span> int rowCommonPrefix) {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span> if (left instanceof ByteBufferExtendedCell) {<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span> ByteBufferExtendedCell bbLeft = (ByteBufferExtendedCell) left;<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span> return ByteBufferUtils.findCommonPrefix(bbLeft.getRowByteBuffer(),<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span> bbLeft.getRowPosition() + rowCommonPrefix, left.getRowLength() - rowCommonPrefix,<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span> right.getRowArray(), right.getRowOffset() + rowCommonPrefix,<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span> right.getRowLength() - rowCommonPrefix);<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span> } else {<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span> return Bytes.findCommonPrefix(left.getRowArray(), right.getRowArray(),<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span> left.getRowLength() - rowCommonPrefix, right.getRowLength() - rowCommonPrefix,<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span> left.getRowOffset() + rowCommonPrefix, right.getRowOffset() + rowCommonPrefix);<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span> }<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span> }<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span><a name="line.1053"></a>
-<span class="sourceLineNo">1054</span> private static int findCommonPrefixInFamilyPart(Cell left, KeyValue.KeyOnlyKeyValue right,<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span> int familyCommonPrefix) {<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span> if (left instanceof ByteBufferExtendedCell) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span> ByteBufferExtendedCell bbLeft = (ByteBufferExtendedCell) left;<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span> return ByteBufferUtils.findCommonPrefix(bbLeft.getFamilyByteBuffer(),<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span> bbLeft.getFamilyPosition() + familyCommonPrefix,<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span> left.getFamilyLength() - familyCommonPrefix, right.getFamilyArray(),<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span> right.getFamilyOffset() + familyCommonPrefix,<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span> right.getFamilyLength() - familyCommonPrefix);<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span> } else {<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span> return Bytes.findCommonPrefix(left.getFamilyArray(), right.getFamilyArray(),<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span> left.getFamilyLength() - familyCommonPrefix, right.getFamilyLength() - familyCommonPrefix,<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span> left.getFamilyOffset() + familyCommonPrefix,<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span> right.getFamilyOffset() + familyCommonPrefix);<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span> }<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span> }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span><a name="line.1070"></a>
-<span class="sourceLineNo">1071</span> private static int findCommonPrefixInQualifierPart(Cell left, KeyValue.KeyOnlyKeyValue right,<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span> int qualifierCommonPrefix) {<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span> if (left instanceof ByteBufferExtendedCell) {<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span> ByteBufferExtendedCell bbLeft = (ByteBufferExtendedCell) left;<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span> return ByteBufferUtils.findCommonPrefix(bbLeft.getQualifierByteBuffer(),<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span> bbLeft.getQualifierPosition() + qualifierCommonPrefix,<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span> left.getQualifierLength() - qualifierCommonPrefix, right.getQualifierArray(),<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span> right.getQualifierOffset() + qualifierCommonPrefix,<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span> right.getQualifierLength() - qualifierCommonPrefix);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span> } else {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span> return Bytes.findCommonPrefix(left.getQualifierArray(), right.getQualifierArray(),<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span> left.getQualifierLength() - qualifierCommonPrefix,<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span> right.getQualifierLength() - qualifierCommonPrefix,<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span> left.getQualifierOffset() + qualifierCommonPrefix,<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span> right.getQualifierOffset() + qualifierCommonPrefix);<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span> }<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span> }<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span><a name="line.1088"></a>
-<span class="sourceLineNo">1089</span> private void moveToPrevious() {<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span> if (!previous.isValid()) {<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span> throw new IllegalStateException(<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span> "Can move back only once and not in first key in the block.");<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span> }<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span><a name="line.1094"></a>
-<span class="sourceLineNo">1095</span> STATE tmp = previous;<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span> previous = current;<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span> current = tmp;<a name="line.1097"></a>
+<span class="sourceLineNo">1019</span> // we hit the end of the block, not an exact match<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span> return 1;<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> private int compareTypeBytes(Cell key, Cell right) {<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span> if (<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span> key.getFamilyLength() + key.getQualifierLength() == 0<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span> && key.getTypeByte() == KeyValue.Type.Minimum.getCode()<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span> ) {<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span> // left is "bigger", i.e. it appears later in the sorted order<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span> return 1;<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span> }<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span> if (<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span> right.getFamilyLength() + right.getQualifierLength() == 0<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span> && right.getTypeByte() == KeyValue.Type.Minimum.getCode()<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span> ) {<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span> return -1;<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span> }<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span> return 0;<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span> }<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span><a name="line.1039"></a>
+<span class="sourceLineNo">1040</span> // These findCommonPrefix* methods rely on the fact that keyOnlyKv is the "right" cell argument<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span> // and always on-heap<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span><a name="line.1042"></a>
+<span class="sourceLineNo">1043</span> private static int findCommonPrefixInRowPart(Cell left, KeyValue.KeyOnlyKeyValue right,<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span> int rowCommonPrefix) {<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span> if (left instanceof ByteBufferExtendedCell) {<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span> ByteBufferExtendedCell bbLeft = (ByteBufferExtendedCell) left;<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span> return ByteBufferUtils.findCommonPrefix(bbLeft.getRowByteBuffer(),<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span> bbLeft.getRowPosition() + rowCommonPrefix, left.getRowLength() - rowCommonPrefix,<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span> right.getRowArray(), right.getRowOffset() + rowCommonPrefix,<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span> right.getRowLength() - rowCommonPrefix);<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span> } else {<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span> return Bytes.findCommonPrefix(left.getRowArray(), right.getRowArray(),<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span> left.getRowLength() - rowCommonPrefix, right.getRowLength() - rowCommonPrefix,<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span> left.getRowOffset() + rowCommonPrefix, right.getRowOffset() + rowCommonPrefix);<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span> }<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span> }<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span> private static int findCommonPrefixInFamilyPart(Cell left, KeyValue.KeyOnlyKeyValue right,<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span> int familyCommonPrefix) {<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span> if (left instanceof ByteBufferExtendedCell) {<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span> ByteBufferExtendedCell bbLeft = (ByteBufferExtendedCell) left;<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span> return ByteBufferUtils.findCommonPrefix(bbLeft.getFamilyByteBuffer(),<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span> bbLeft.getFamilyPosition() + familyCommonPrefix,<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span> left.getFamilyLength() - familyCommonPrefix, right.getFamilyArray(),<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span> right.getFamilyOffset() + familyCommonPrefix,<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span> right.getFamilyLength() - familyCommonPrefix);<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span> } else {<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span> return Bytes.findCommonPrefix(left.getFamilyArray(), right.getFamilyArray(),<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span> left.getFamilyLength() - familyCommonPrefix, right.getFamilyLength() - familyCommonPrefix,<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span> left.getFamilyOffset() + familyCommonPrefix,<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span> right.getFamilyOffset() + familyCommonPrefix);<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span> }<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span> }<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span><a name="line.1074"></a>
+<span class="sourceLineNo">1075</span> private static int findCommonPrefixInQualifierPart(Cell left, KeyValue.KeyOnlyKeyValue right,<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span> int qualifierCommonPrefix) {<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span> if (left instanceof ByteBufferExtendedCell) {<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span> ByteBufferExtendedCell bbLeft = (ByteBufferExtendedCell) left;<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span> return ByteBufferUtils.findCommonPrefix(bbLeft.getQualifierByteBuffer(),<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span> bbLeft.getQualifierPosition() + qualifierCommonPrefix,<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span> left.getQualifierLength() - qualifierCommonPrefix, right.getQualifierArray(),<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span> right.getQualifierOffset() + qualifierCommonPrefix,<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span> right.getQualifierLength() - qualifierCommonPrefix);<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span> } else {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span> return Bytes.findCommonPrefix(left.getQualifierArray(), right.getQualifierArray(),<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span> left.getQualifierLength() - qualifierCommonPrefix,<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span> right.getQualifierLength() - qualifierCommonPrefix,<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span> left.getQualifierOffset() + qualifierCommonPrefix,<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span> right.getQualifierOffset() + qualifierCommonPrefix);<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> private void moveToPrevious() {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span> if (!previous.isValid()) {<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span> throw new IllegalStateException(<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span> "Can move back only once and not in first key in the block.");<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span> }<a name="line.1097"></a>
<span class="sourceLineNo">1098</span><a name="line.1098"></a>
-<span class="sourceLineNo">1099</span> // move after last key value<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span> currentBuffer.position(current.nextKvOffset);<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span> // Already decoded the tag bytes. We cache this tags into current state and also the total<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span> // compressed length of the tags bytes. For the next time decodeNext() we don't need to decode<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span> // the tags again. This might pollute the Data Dictionary what we use for the compression.<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span> // When current.uncompressTags is false, we will just reuse the current.tagsBuffer and skip<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span> // 'tagsCompressedLength' bytes of source stream.<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span> // See in decodeTags()<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span> current.tagsBuffer = previous.tagsBuffer;<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span> current.tagsCompressedLength = previous.tagsCompressedLength;<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span> current.uncompressTags = false;<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span> // The current key has to be reset with the previous Cell<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span> current.setKey(current.keyBuffer, current.memstoreTS);<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span> previous.invalidate();<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span> }<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span><a name="line.1114"></a>
-<span class="sourceLineNo">1115</span> @SuppressWarnings("unchecked")<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span> protected STATE createSeekerState() {<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span> // This will fail for non-default seeker state if the subclass does not<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span> // override this method.<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span> return (STATE) new SeekerState(this.tmpPair, this.includesTags());<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span> }<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span><a name="line.1121"></a>
-<span class="sourceLineNo">1122</span> abstract protected void decodeFirst();<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span><a name="line.1123"></a>
-<span class="sourceLineNo">1124</span> abstract protected void decodeNext();<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span> }<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span><a name="line.1126"></a>
-<span class="sourceLineNo">1127</span> /** Returns unencoded size added */<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span> protected final int afterEncodingKeyValue(Cell cell, DataOutputStream out,<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span> HFileBlockDefaultEncodingContext encodingCtx) throws IOException {<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span> int size = 0;<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span> if (encodingCtx.getHFileContext().isIncludesTags()) {<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span> int tagsLength = cell.getTagsLength();<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span> ByteBufferUtils.putCompressedInt(out, tagsLength);<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span> // There are some tags to be written<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span> if (tagsLength > 0) {<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span> TagCompressionContext tagCompressionContext = encodingCtx.getTagCompressionContext();<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span> // When tag compression is enabled, tagCompressionContext will have a not null value. Write<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span> // the tags using Dictionary compression in such a case<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span> if (tagCompressionContext != null) {<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span> // Not passing tagsLength considering that parsing of the tagsLength is not costly<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span> PrivateCellUtil.compressTags(out, cell, tagCompressionContext);<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span> } else {<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span> PrivateCellUtil.writeTags(out, cell, tagsLength);<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> size += tagsLength + KeyValue.TAGS_LENGTH_SIZE;<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span> }<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span> if (encodingCtx.getHFileContext().isIncludesMvcc()) {<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span> // Copy memstore timestamp from the byte buffer to the output stream.<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span> long memstoreTS = cell.getSequenceId();<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span> WritableUtils.writeVLong(out, memstoreTS);<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span> // TODO use a writeVLong which returns the #bytes written so that 2 time parsing can be<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span> // avoided.<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span> size += WritableUtils.getVIntSize(memstoreTS);<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span> }<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span> return size;<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span> }<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span><a name="line.1158"></a>
-<span class="sourceLineNo">1159</span> protected final void afterDecodingKeyValue(DataInputStream source, ByteBuffer dest,<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span> HFileBlockDefaultDecodingContext decodingCtx) throws IOException {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span> if (decodingCtx.getHFileContext().isIncludesTags()) {<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span> int tagsLength = ByteBufferUtils.readCompressedInt(source);<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span> // Put as unsigned short<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span> dest.put((byte) ((tagsLength >> 8) & 0xff));<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span> dest.put((byte) (tagsLength & 0xff));<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span> if (tagsLength > 0) {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span> TagCompressionContext tagCompressionContext = decodingCtx.getTagCompressionContext();<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span> // When tag compression is been used in this file, tagCompressionContext will have a not<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span> // null value passed.<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span> if (tagCompressionContext != null) {<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span> tagCompressionContext.uncompressTags(source, dest, tagsLength);<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span> } else {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span> ByteBufferUtils.copyFromStreamToBuffer(dest, source, tagsLength);<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span> }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span> }<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span> }<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span> if (decodingCtx.getHFileContext().isIncludesMvcc()) {<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span> long memstoreTS = -1;<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span> try {<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span> // Copy memstore timestamp from the data input stream to the byte<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span> // buffer.<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span> memstoreTS = WritableUtils.readVLong(source);<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span> ByteBufferUtils.writeVLong(dest, memstoreTS);<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span> } catch (IOException ex) {<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span> throw new RuntimeException(<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span> "Unable to copy memstore timestamp " + memstoreTS + " after decoding a key/value");<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span> }<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> protected abstract ByteBuffer internalDecodeKeyValues(DataInputStream source,<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span> int allocateHeaderLength, int skipLastBytes, HFileBlockDefaultDecodingContext decodingCtx)<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span> throws IOException;<a name="line.1193"></a>
+<span class="sourceLineNo">1099</span> STATE tmp = previous;<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span> previous = current;<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span> current = tmp;<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span><a name="line.1102"></a>
+<span class="sourceLineNo">1103</span> // move after last key value<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span> currentBuffer.position(current.nextKvOffset);<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span> // Already decoded the tag bytes. We cache this tags into current state and also the total<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span> // compressed length of the tags bytes. For the next time decodeNext() we don't need to decode<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span> // the tags again. This might pollute the Data Dictionary what we use for the compression.<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span> // When current.uncompressTags is false, we will just reuse the current.tagsBuffer and skip<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span> // 'tagsCompressedLength' bytes of source stream.<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span> // See in decodeTags()<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span> current.tagsBuffer = previous.tagsBuffer;<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span> current.tagsCompressedLength = previous.tagsCompressedLength;<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span> current.uncompressTags = false;<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span> // The current key has to be reset with the previous Cell<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span> current.setKey(current.keyBuffer, current.memstoreTS);<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span> previous.invalidate();<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span> }<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span><a name="line.1118"></a>
+<span class="sourceLineNo">1119</span> @SuppressWarnings("unchecked")<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span> protected STATE createSeekerState() {<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span> // This will fail for non-default seeker state if the subclass does not<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span> // override this method.<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span> return (STATE) new SeekerState(this.tmpPair, this.includesTags());<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span> }<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span><a name="line.1125"></a>
+<span class="sourceLineNo">1126</span> abstract protected void decodeFirst();<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span><a name="line.1127"></a>
+<span class="sourceLineNo">1128</span> abstract protected void decodeNext();<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span> }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span><a name="line.1130"></a>
+<span class="sourceLineNo">1131</span> /** Returns unencoded size added */<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span> protected final int afterEncodingKeyValue(Cell cell, DataOutputStream out,<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span> HFileBlockDefaultEncodingContext encodingCtx) throws IOException {<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span> int size = 0;<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span> if (encodingCtx.getHFileContext().isIncludesTags()) {<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span> int tagsLength = cell.getTagsLength();<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span> ByteBufferUtils.putCompressedInt(out, tagsLength);<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span> // There are some tags to be written<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span> if (tagsLength > 0) {<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span> TagCompressionContext tagCompressionContext = encodingCtx.getTagCompressionContext();<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span> // When tag compression is enabled, tagCompressionContext will have a not null value. Write<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span> // the tags using Dictionary compression in such a case<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span> if (tagCompressionContext != null) {<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span> // Not passing tagsLength considering that parsing of the tagsLength is not costly<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span> PrivateCellUtil.compressTags(out, cell, tagCompressionContext);<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span> } else {<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span> PrivateCellUtil.writeTags(out, cell, tagsLength);<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span> }<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span> }<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span> size += tagsLength + KeyValue.TAGS_LENGTH_SIZE;<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span> }<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span> if (encodingCtx.getHFileContext().isIncludesMvcc()) {<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span> // Copy memstore timestamp from the byte buffer to the output stream.<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span> long memstoreTS = cell.getSequenceId();<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span> WritableUtils.writeVLong(out, memstoreTS);<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span> // TODO use a writeVLong which returns the #bytes written so that 2 time parsing can be<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span> // avoided.<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span> size += WritableUtils.getVIntSize(memstoreTS);<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span> }<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span> return size;<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span> }<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span><a name="line.1162"></a>
+<span class="sourceLineNo">1163</span> protected final void afterDecodingKeyValue(DataInputStream source, ByteBuffer dest,<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span> HFileBlockDefaultDecodingContext decodingCtx) throws IOException {<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span> if (decodingCtx.getHFileContext().isIncludesTags()) {<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span> int tagsLength = ByteBufferUtils.readCompressedInt(source);<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span> // Put as unsigned short<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span> dest.put((byte) ((tagsLength >> 8) & 0xff));<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span> dest.put((byte) (tagsLength & 0xff));<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span> if (tagsLength > 0) {<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span> TagCompressionContext tagCompressionContext = decodingCtx.getTagCompressionContext();<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span> // When tag compression is been used in this file, tagCompressionContext will have a not<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span> // null value passed.<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span> if (tagCompressionContext != null) {<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span> tagCompressionContext.uncompressTags(source, dest, tagsLength);<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span> } else {<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span> ByteBufferUtils.copyFromStreamToBuffer(dest, source, tagsLength);<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> }<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span> if (decodingCtx.getHFileContext().isIncludesMvcc()) {<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span> long memstoreTS = -1;<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span> try {<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span> // Copy memstore timestamp from the data input stream to the byte<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span> // buffer.<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span> memstoreTS = WritableUtils.readVLong(source);<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span> ByteBufferUtils.writeVLong(dest, memstoreTS);<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span> } catch (IOException ex) {<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span> throw new RuntimeException(<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span> "Unable to copy memstore timestamp " + memstoreTS + " after decoding a key/value");<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> }<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> * Asserts that there is at least the given amount of unfilled space remaining in the given<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span> * buffer.<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span> * @param out typically, the buffer we are writing to<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span> * @param length the required space in the buffer<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span> * @throws EncoderBufferTooSmallException If there are no enough bytes.<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span> */<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span> protected static void ensureSpace(ByteBuffer out, int length)<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span> throws EncoderBufferTooSmallException {<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span> if (out.position() + length > out.limit()) {<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span> throw new EncoderBufferTooSmallException("Buffer position=" + out.position()<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span> + ", buffer limit=" + out.limit() + ", length to be written=" + length);<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span> }<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span> }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span> @Override<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span> public void startBlockEncoding(HFileBlockEncodingContext blkEncodingCtx, DataOutputStream out)<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span> throws IOException {<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span> if (blkEncodingCtx.getClass() != HFileBlockDefaultEncodingContext.class) {<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span> throw new IOException(this.getClass().getName() + " only accepts "<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span> + HFileBlockDefaultEncodingContext.class.getName() + " as the " + "encoding context.");<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span> }<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span><a name="line.1217"></a>
-<span class="sourceLineNo">1218</span> HFileBlockDefaultEncodingContext encodingCtx =<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span> (HFileBlockDefaultEncodingContext) blkEncodingCtx;<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span> encodingCtx.prepareEncoding(out);<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span> if (<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span> encodingCtx.getHFileContext().isIncludesTags()<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span> && encodingCtx.getHFileContext().isCompressTags()<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span> ) {<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span> if (encodingCtx.getTagCompressionContext() != null) {<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span> // It will be overhead to create the TagCompressionContext again and again for every block<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span> // encoding.<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span> encodingCtx.getTagCompressionContext().clear();<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span> } else {<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span> try {<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span> TagCompressionContext tagCompressionContext =<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span> new TagCompressionContext(LRUDictionary.class, Byte.MAX_VALUE);<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span> encodingCtx.setTagCompressionContext(tagCompressionContext);<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span> } catch (Exception e) {<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span> throw new IOException("Failed to initialize TagCompressionContext", e);<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span> }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span> }<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span> }<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span> StreamUtils.writeInt(out, 0); // DUMMY length. This will be updated in endBlockEncoding()<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span> blkEncodingCtx.setEncodingState(new EncodingState());<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span> }<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span><a name="line.1242"></a>
-<span class="sourceLineNo">1243</span> @Override<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span> public void encode(Cell cell, HFileBlockEncodingContext encodingCtx, DataOutputStream out)<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span> throws IOException {<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span> EncodingState state = encodingCtx.getEncodingState();<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span> int posBeforeEncode = out.size();<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span> int encodedKvSize = internalEncode(cell, (HFileBlockDefaultEncodingContext) encodingCtx, out);<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span> state.postCellEncode(encodedKvSize, out.size() - posBeforeEncode);<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span> }<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span> public abstract int internalEncode(Cell cell, HFileBlockDefaultEncodingContext encodingCtx,<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span> DataOutputStream out) throws IOException;<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span><a name="line.1254"></a>
-<span class="sourceLineNo">1255</span> @Override<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span> public void endBlockEncoding(HFileBlockEncodingContext encodingCtx, DataOutputStream out,<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span> byte[] uncompressedBytesWithHeader) throws IOException {<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span> EncodingState state = encodingCtx.getEncodingState();<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span> // Write the unencodedDataSizeWritten (with header size)<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span> Bytes.putInt(uncompressedBytesWithHeader,<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span> HConstants.HFILEBLOCK_HEADER_SIZE + DataBlockEncoding.ID_SIZE,<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span> state.getUnencodedDataSizeWritten());<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span> postEncoding(encodingCtx);<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span> }<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span><a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>}<a name="line.1266"></a>
+<span class="sourceLineNo">1195</span> protected abstract ByteBuffer internalDecodeKeyValues(DataInputStream source,<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span> int allocateHeaderLength, int skipLastBytes, HFileBlockDefaultDecodingContext decodingCtx)<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span> throws IOException;<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> * Asserts that there is at least the given amount of unfilled space remaining in the given<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span> * buffer.<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span> * @param out typically, the buffer we are writing to<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span> * @param length the required space in the buffer<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span> * @throws EncoderBufferTooSmallException If there are no enough bytes.<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span> */<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span> protected static void ensureSpace(ByteBuffer out, int length)<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span> throws EncoderBufferTooSmallException {<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span> if (out.position() + length > out.limit()) {<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span> throw new EncoderBufferTooSmallException("Buffer position=" + out.position()<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span> + ", buffer limit=" + out.limit() + ", length to be written=" + length);<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span> }<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span> }<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span><a name="line.1213"></a>
+<span class="sourceLineNo">1214</span> @Override<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span> public void startBlockEncoding(HFileBlockEncodingContext blkEncodingCtx, DataOutputStream out)<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span> throws IOException {<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span> if (blkEncodingCtx.getClass() != HFileBlockDefaultEncodingContext.class) {<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span> throw new IOException(this.getClass().getName() + " only accepts "<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span> + HFileBlockDefaultEncodingContext.class.getName() + " as the " + "encoding context.");<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span> }<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span><a name="line.1221"></a>
+<span class="sourceLineNo">1222</span> HFileBlockDefaultEncodingContext encodingCtx =<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span> (HFileBlockDefaultEncodingContext) blkEncodingCtx;<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span> encodingCtx.prepareEncoding(out);<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span> if (<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span> encodingCtx.getHFileContext().isIncludesTags()<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span> && encodingCtx.getHFileContext().isCompressTags()<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span> ) {<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span> if (encodingCtx.getTagCompressionContext() != null) {<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span> // It will be overhead to create the TagCompressionContext again and again for every block<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span> // encoding.<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span> encodingCtx.getTagCompressionContext().clear();<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span> } else {<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span> try {<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span> TagCompressionContext tagCompressionContext =<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span> new TagCompressionContext(LRUDictionary.class, Byte.MAX_VALUE);<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span> encodingCtx.setTagCompressionContext(tagCompressionContext);<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span> } catch (Exception e) {<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span> throw new IOException("Failed to initialize TagCompressionContext", e);<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span> }<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span> }<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span> }<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span> StreamUtils.writeInt(out, 0); // DUMMY length. This will be updated in endBlockEncoding()<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span> blkEncodingCtx.setEncodingState(new EncodingState());<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span> }<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span><a name="line.1246"></a>
+<span class="sourceLineNo">1247</span> @Override<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span> public void encode(Cell cell, HFileBlockEncodingContext encodingCtx, DataOutputStream out)<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span> throws IOException {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span> EncodingState state = encodingCtx.getEncodingState();<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span> int posBeforeEncode = out.size();<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span> int encodedKvSize = internalEncode(cell, (HFileBlockDefaultEncodingContext) encodingCtx, out);<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span> state.postCellEncode(encodedKvSize, out.size() - posBeforeEncode);<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> public abstract int internalEncode(Cell cell, HFileBlockDefaultEncodingContext encodingCtx,<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span> DataOutputStream out) throws IOException;<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span><a name="line.1258"></a>
+<span class="sourceLineNo">1259</span> @Override<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span> public void endBlockEncoding(HFileBlockEncodingContext encodingCtx, DataOutputStream out,<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span> byte[] uncompressedBytesWithHeader) throws IOException {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span> EncodingState state = encodingCtx.getEncodingState();<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span> // Write the unencodedDataSizeWritten (with header size)<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span> Bytes.putInt(uncompressedBytesWithHeader,<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span> HConstants.HFILEBLOCK_HEADER_SIZE + DataBlockEncoding.ID_SIZE,<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span> state.getUnencodedDataSizeWritten());<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span> postEncoding(encodingCtx);<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span> }<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span><a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>}<a name="line.1270"></a>
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html
index 98b96dd2d5e..42b65efbb7e 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html
@@ -299,470 +299,496 @@
<span class="sourceLineNo">291</span> postRollBackMergeRegions(env);<a name="line.291"></a>
<span class="sourceLineNo">292</span> break;<a name="line.292"></a>
<span class="sourceLineNo">293</span> case MERGE_TABLE_REGIONS_PREPARE:<a name="line.293"></a>
-<span class="sourceLineNo">294</span> break;<a name="line.294"></a>
-<span class="sourceLineNo">295</span> default:<a name="line.295"></a>
-<span class="sourceLineNo">296</span> throw new UnsupportedOperationException(this + " unhandled state=" + state);<a name="line.296"></a>
-<span class="sourceLineNo">297</span> }<a name="line.297"></a>
-<span class="sourceLineNo">298</span> } catch (Exception e) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span> // This will be retried. Unless there is a bug in the code,<a name="line.299"></a>
-<span class="sourceLineNo">300</span> // this should be just a "temporary error" (e.g. network down)<a name="line.300"></a>
-<span class="sourceLineNo">301</span> LOG.warn("Failed rollback attempt step " + state + " for merging the regions "<a name="line.301"></a>
-<span class="sourceLineNo">302</span> + RegionInfo.getShortNameToLog(regionsToMerge) + " in table " + getTableName(), e);<a name="line.302"></a>
-<span class="sourceLineNo">303</span> throw e;<a name="line.303"></a>
-<span class="sourceLineNo">304</span> }<a name="line.304"></a>
-<span class="sourceLineNo">305</span> }<a name="line.305"></a>
-<span class="sourceLineNo">306</span><a name="line.306"></a>
-<span class="sourceLineNo">307</span> /*<a name="line.307"></a>
-<span class="sourceLineNo">308</span> * Check whether we are in the state that can be rolled back<a name="line.308"></a>
-<span class="sourceLineNo">309</span> */<a name="line.309"></a>
-<span class="sourceLineNo">310</span> @Override<a name="line.310"></a>
-<span class="sourceLineNo">311</span> protected boolean isRollbackSupported(final MergeTableRegionsState state) {<a name="line.311"></a>
-<span class="sourceLineNo">312</span> switch (state) {<a name="line.312"></a>
-<span class="sourceLineNo">313</span> case MERGE_TABLE_REGIONS_POST_OPERATION:<a name="line.313"></a>
-<span class="sourceLineNo">314</span> case MERGE_TABLE_REGIONS_OPEN_MERGED_REGION:<a name="line.314"></a>
-<span class="sourceLineNo">315</span> case MERGE_TABLE_REGIONS_POST_MERGE_COMMIT_OPERATION:<a name="line.315"></a>
-<span class="sourceLineNo">316</span> case MERGE_TABLE_REGIONS_UPDATE_META:<a name="line.316"></a>
-<span class="sourceLineNo">317</span> // It is not safe to rollback in these states.<a name="line.317"></a>
-<span class="sourceLineNo">318</span> return false;<a name="line.318"></a>
-<span class="sourceLineNo">319</span> default:<a name="line.319"></a>
-<span class="sourceLineNo">320</span> break;<a name="line.320"></a>
-<span class="sourceLineNo">321</span> }<a name="line.321"></a>
-<span class="sourceLineNo">322</span> return true;<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> private void removeNonDefaultReplicas(MasterProcedureEnv env) throws IOException {<a name="line.325"></a>
-<span class="sourceLineNo">326</span> AssignmentManagerUtil.removeNonDefaultReplicas(env, Stream.of(regionsToMerge),<a name="line.326"></a>
-<span class="sourceLineNo">327</span> getRegionReplication(env));<a name="line.327"></a>
-<span class="sourceLineNo">328</span> }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span> private void checkClosedRegions(MasterProcedureEnv env) throws IOException {<a name="line.330"></a>
-<span class="sourceLineNo">331</span> // Theoretically this should not happen any more after we use TRSP, but anyway<a name="line.331"></a>
-<span class="sourceLineNo">332</span> // let's add a check here<a name="line.332"></a>
-<span class="sourceLineNo">333</span> for (RegionInfo region : regionsToMerge) {<a name="line.333"></a>
-<span class="sourceLineNo">334</span> AssignmentManagerUtil.checkClosedRegion(env, region);<a name="line.334"></a>
-<span class="sourceLineNo">335</span> }<a name="line.335"></a>
-<span class="sourceLineNo">336</span> }<a name="line.336"></a>
-<span class="sourceLineNo">337</span><a name="line.337"></a>
-<span class="sourceLineNo">338</span> @Override<a name="line.338"></a>
-<span class="sourceLineNo">339</span> protected MergeTableRegionsState getState(final int stateId) {<a name="line.339"></a>
-<span class="sourceLineNo">340</span> return MergeTableRegionsState.forNumber(stateId);<a name="line.340"></a>
-<span class="sourceLineNo">341</span> }<a name="line.341"></a>
-<span class="sourceLineNo">342</span><a name="line.342"></a>
-<span class="sourceLineNo">343</span> @Override<a name="line.343"></a>
-<span class="sourceLineNo">344</span> protected int getStateId(final MergeTableRegionsState state) {<a name="line.344"></a>
-<span class="sourceLineNo">345</span> return state.getNumber();<a name="line.345"></a>
-<span class="sourceLineNo">346</span> }<a name="line.346"></a>
-<span class="sourceLineNo">347</span><a name="line.347"></a>
-<span class="sourceLineNo">348</span> @Override<a name="line.348"></a>
-<span class="sourceLineNo">349</span> protected MergeTableRegionsState getInitialState() {<a name="line.349"></a>
-<span class="sourceLineNo">350</span> return MergeTableRegionsState.MERGE_TABLE_REGIONS_PREPARE;<a name="line.350"></a>
-<span class="sourceLineNo">351</span> }<a name="line.351"></a>
-<span class="sourceLineNo">352</span><a name="line.352"></a>
-<span class="sourceLineNo">353</span> @Override<a name="line.353"></a>
-<span class="sourceLineNo">354</span> protected void serializeStateData(ProcedureStateSerializer serializer) throws IOException {<a name="line.354"></a>
-<span class="sourceLineNo">355</span> super.serializeStateData(serializer);<a name="line.355"></a>
-<span class="sourceLineNo">356</span><a name="line.356"></a>
-<span class="sourceLineNo">357</span> final MasterProcedureProtos.MergeTableRegionsStateData.Builder mergeTableRegionsMsg =<a name="line.357"></a>
-<span class="sourceLineNo">358</span> MasterProcedureProtos.MergeTableRegionsStateData.newBuilder()<a name="line.358"></a>
-<span class="sourceLineNo">359</span> .setUserInfo(MasterProcedureUtil.toProtoUserInfo(getUser()))<a name="line.359"></a>
-<span class="sourceLineNo">360</span> .setMergedRegionInfo(ProtobufUtil.toRegionInfo(mergedRegion)).setForcible(force);<a name="line.360"></a>
-<span class="sourceLineNo">361</span> for (RegionInfo ri : regionsToMerge) {<a name="line.361"></a>
-<span class="sourceLineNo">362</span> mergeTableRegionsMsg.addRegionInfo(ProtobufUtil.toRegionInfo(ri));<a name="line.362"></a>
-<span class="sourceLineNo">363</span> }<a name="line.363"></a>
-<span class="sourceLineNo">364</span> serializer.serialize(mergeTableRegionsMsg.build());<a name="line.364"></a>
-<span class="sourceLineNo">365</span> }<a name="line.365"></a>
-<span class="sourceLineNo">366</span><a name="line.366"></a>
-<span class="sourceLineNo">367</span> @Override<a name="line.367"></a>
-<span class="sourceLineNo">368</span> protected void deserializeStateData(ProcedureStateSerializer serializer) throws IOException {<a name="line.368"></a>
-<span class="sourceLineNo">369</span> super.deserializeStateData(serializer);<a name="line.369"></a>
-<span class="sourceLineNo">370</span><a name="line.370"></a>
-<span class="sourceLineNo">371</span> final MasterProcedureProtos.MergeTableRegionsStateData mergeTableRegionsMsg =<a name="line.371"></a>
-<span class="sourceLineNo">372</span> serializer.deserialize(MasterProcedureProtos.MergeTableRegionsStateData.class);<a name="line.372"></a>
-<span class="sourceLineNo">373</span> setUser(MasterProcedureUtil.toUserInfo(mergeTableRegionsMsg.getUserInfo()));<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span> assert (mergeTableRegionsMsg.getRegionInfoCount() == 2);<a name="line.375"></a>
-<span class="sourceLineNo">376</span> regionsToMerge = new RegionInfo[mergeTableRegionsMsg.getRegionInfoCount()];<a name="line.376"></a>
-<span class="sourceLineNo">377</span> for (int i = 0; i < regionsToMerge.length; i++) {<a name="line.377"></a>
-<span class="sourceLineNo">378</span> regionsToMerge[i] = ProtobufUtil.toRegionInfo(mergeTableRegionsMsg.getRegionInfo(i));<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> mergedRegion = ProtobufUtil.toRegionInfo(mergeTableRegionsMsg.getMergedRegionInfo());<a name="line.381"></a>
-<span class="sourceLineNo">382</span> }<a name="line.382"></a>
-<span class="sourceLineNo">383</span><a name="line.383"></a>
-<span class="sourceLineNo">384</span> @Override<a name="line.384"></a>
-<span class="sourceLineNo">385</span> public void toStringClassDetails(StringBuilder sb) {<a name="line.385"></a>
-<span class="sourceLineNo">386</span> sb.append(getClass().getSimpleName());<a name="line.386"></a>
-<span class="sourceLineNo">387</span> sb.append(" table=");<a name="line.387"></a>
-<span class="sourceLineNo">388</span> sb.append(getTableName());<a name="line.388"></a>
-<span class="sourceLineNo">389</span> sb.append(", regions=");<a name="line.389"></a>
-<span class="sourceLineNo">390</span> sb.append(RegionInfo.getShortNameToLog(regionsToMerge));<a name="line.390"></a>
-<span class="sourceLineNo">391</span> sb.append(", force=");<a name="line.391"></a>
-<span class="sourceLineNo">392</span> sb.append(force);<a name="line.392"></a>
-<span class="sourceLineNo">393</span> }<a name="line.393"></a>
-<span class="sourceLineNo">394</span><a name="line.394"></a>
-<span class="sourceLineNo">395</span> @Override<a name="line.395"></a>
-<span class="sourceLineNo">396</span> protected LockState acquireLock(final MasterProcedureEnv env) {<a name="line.396"></a>
-<span class="sourceLineNo">397</span> RegionInfo[] lockRegions = Arrays.copyOf(regionsToMerge, regionsToMerge.length + 1);<a name="line.397"></a>
-<span class="sourceLineNo">398</span> lockRegions[lockRegions.length - 1] = mergedRegion;<a name="line.398"></a>
-<span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span> if (env.getProcedureScheduler().waitRegions(this, getTableName(), lockRegions)) {<a name="line.400"></a>
-<span class="sourceLineNo">401</span> try {<a name="line.401"></a>
-<span class="sourceLineNo">402</span> LOG.debug(LockState.LOCK_EVENT_WAIT + " " + env.getProcedureScheduler().dumpLocks());<a name="line.402"></a>
-<span class="sourceLineNo">403</span> } catch (IOException e) {<a name="line.403"></a>
-<span class="sourceLineNo">404</span> // Ignore, just for logging<a name="line.404"></a>
-<span class="sourceLineNo">405</span> }<a name="line.405"></a>
-<span class="sourceLineNo">406</span> return LockState.LOCK_EVENT_WAIT;<a name="line.406"></a>
-<span class="sourceLineNo">407</span> }<a name="line.407"></a>
-<span class="sourceLineNo">408</span> return LockState.LOCK_ACQUIRED;<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> @Override<a name="line.411"></a>
-<span class="sourceLineNo">412</span> protected void releaseLock(final MasterProcedureEnv env) {<a name="line.412"></a>
-<span class="sourceLineNo">413</span> RegionInfo[] lockRegions = Arrays.copyOf(regionsToMerge, regionsToMerge.length + 1);<a name="line.413"></a>
-<span class="sourceLineNo">414</span> lockRegions[lockRegions.length - 1] = mergedRegion;<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span> env.getProcedureScheduler().wakeRegions(this, getTableName(), lockRegions);<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> @Override<a name="line.419"></a>
-<span class="sourceLineNo">420</span> protected boolean holdLock(MasterProcedureEnv env) {<a name="line.420"></a>
-<span class="sourceLineNo">421</span> return true;<a name="line.421"></a>
-<span class="sourceLineNo">422</span> }<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 TableName getTableName() {<a name="line.425"></a>
-<span class="sourceLineNo">426</span> return mergedRegion.getTable();<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 TableOperationType getTableOperationType() {<a name="line.430"></a>
-<span class="sourceLineNo">431</span> return TableOperationType.REGION_MERGE;<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> @Override<a name="line.434"></a>
-<span class="sourceLineNo">435</span> protected ProcedureMetrics getProcedureMetrics(MasterProcedureEnv env) {<a name="line.435"></a>
-<span class="sourceLineNo">436</span> return env.getAssignmentManager().getAssignmentManagerMetrics().getMergeProcMetrics();<a name="line.436"></a>
-<span class="sourceLineNo">437</span> }<a name="line.437"></a>
-<span class="sourceLineNo">438</span><a name="line.438"></a>
-<span class="sourceLineNo">439</span> /**<a name="line.439"></a>
-<span class="sourceLineNo">440</span> * Prepare merge and do some check<a name="line.440"></a>
-<span class="sourceLineNo">441</span> */<a name="line.441"></a>
-<span class="sourceLineNo">442</span> private boolean prepareMergeRegion(final MasterProcedureEnv env) throws IOException {<a name="line.442"></a>
-<span class="sourceLineNo">443</span> // Fail if we are taking snapshot for the given table<a name="line.443"></a>
-<span class="sourceLineNo">444</span> TableName tn = regionsToMerge[0].getTable();<a name="line.444"></a>
-<span class="sourceLineNo">445</span> if (env.getMasterServices().getSnapshotManager().isTableTakingAnySnapshot(tn)) {<a name="line.445"></a>
-<span class="sourceLineNo">446</span> throw new MergeRegionException("Skip merging regions "<a name="line.446"></a>
-<span class="sourceLineNo">447</span> + RegionInfo.getShortNameToLog(regionsToMerge) + ", because we are snapshotting " + tn);<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> // Mostly this check is not used because we already check the switch before submit a merge<a name="line.450"></a>
-<span class="sourceLineNo">451</span> // procedure. Just for safe, check the switch again. This procedure can be rollbacked if<a name="line.451"></a>
-<span class="sourceLineNo">452</span> // the switch was set to false after submit.<a name="line.452"></a>
-<span class="sourceLineNo">453</span> if (!env.getMasterServices().isSplitOrMergeEnabled(MasterSwitchType.MERGE)) {<a name="line.453"></a>
-<span class="sourceLineNo">454</span> String regionsStr = Arrays.deepToString(this.regionsToMerge);<a name="line.454"></a>
-<span class="sourceLineNo">455</span> LOG.warn("Merge switch is off! skip merge of " + regionsStr);<a name="line.455"></a>
-<span class="sourceLineNo">456</span> setFailure(getClass().getSimpleName(),<a name="line.456"></a>
-<span class="sourceLineNo">457</span> new IOException("Merge of " + regionsStr + " failed because merge switch is off"));<a name="line.457"></a>
-<span class="sourceLineNo">458</span> return false;<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> if (!env.getMasterServices().getTableDescriptors().get(getTableName()).isMergeEnabled()) {<a name="line.461"></a>
-<span class="sourceLineNo">462</span> String regionsStr = Arrays.deepToString(regionsToMerge);<a name="line.462"></a>
-<span class="sourceLineNo">463</span> LOG.warn("Merge is disabled for the table! Skipping merge of {}", regionsStr);<a name="line.463"></a>
-<span class="sourceLineNo">464</span> setFailure(getClass().getSimpleName(), new IOException(<a name="line.464"></a>
-<span class="sourceLineNo">465</span> "Merge of " + regionsStr + " failed as region merge is disabled for the table"));<a name="line.465"></a>
-<span class="sourceLineNo">466</span> return false;<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> RegionStates regionStates = env.getAssignmentManager().getRegionStates();<a name="line.469"></a>
-<span class="sourceLineNo">470</span> RegionStateStore regionStateStore = env.getAssignmentManager().getRegionStateStore();<a name="line.470"></a>
-<span class="sourceLineNo">471</span> for (RegionInfo ri : this.regionsToMerge) {<a name="line.471"></a>
-<span class="sourceLineNo">472</span> if (regionStateStore.hasMergeRegions(ri)) {<a name="line.472"></a>
-<span class="sourceLineNo">473</span> String msg = "Skip merging " + RegionInfo.getShortNameToLog(regionsToMerge)<a name="line.473"></a>
-<span class="sourceLineNo">474</span> + ", because a parent, " + RegionInfo.getShortNameToLog(ri) + ", has a merge qualifier "<a name="line.474"></a>
-<span class="sourceLineNo">475</span> + "(if a 'merge column' in parent, it was recently merged but still has outstanding "<a name="line.475"></a>
-<span class="sourceLineNo">476</span> + "references to its parents that must be cleared before it can participate in merge -- "<a name="line.476"></a>
-<span class="sourceLineNo">477</span> + "major compact it to hurry clearing of its references)";<a name="line.477"></a>
-<span class="sourceLineNo">478</span> LOG.warn(msg);<a name="line.478"></a>
-<span class="sourceLineNo">479</span> throw new MergeRegionException(msg);<a name="line.479"></a>
-<span class="sourceLineNo">480</span> }<a name="line.480"></a>
-<span class="sourceLineNo">481</span> RegionState state = regionStates.getRegionState(ri.getEncodedName());<a name="line.481"></a>
-<span class="sourceLineNo">482</span> if (state == null) {<a name="line.482"></a>
-<span class="sourceLineNo">483</span> throw new UnknownRegionException(<a name="line.483"></a>
-<span class="sourceLineNo">484</span> RegionInfo.getShortNameToLog(ri) + " UNKNOWN (Has it been garbage collected?)");<a name="line.484"></a>
-<span class="sourceLineNo">485</span> }<a name="line.485"></a>
-<span class="sourceLineNo">486</span> if (!state.isOpened()) {<a name="line.486"></a>
-<span class="sourceLineNo">487</span> throw new MergeRegionException("Unable to merge regions that are NOT online: " + ri);<a name="line.487"></a>
-<span class="sourceLineNo">488</span> }<a name="line.488"></a>
-<span class="sourceLineNo">489</span> // Ask the remote regionserver if regions are mergeable. If we get an IOE, report it<a name="line.489"></a>
-<span class="sourceLineNo">490</span> // along with the failure, so we can see why regions are not mergeable at this time.<a name="line.490"></a>
-<span class="sourceLineNo">491</span> try {<a name="line.491"></a>
-<span class="sourceLineNo">492</span> if (!isMergeable(env, state)) {<a name="line.492"></a>
-<span class="sourceLineNo">493</span> setFailure(getClass().getSimpleName(),<a name="line.493"></a>
-<span class="sourceLineNo">494</span> new MergeRegionException("Skip merging " + RegionInfo.getShortNameToLog(regionsToMerge)<a name="line.494"></a>
-<span class="sourceLineNo">495</span> + ", because a parent, " + RegionInfo.getShortNameToLog(ri) + ", is not mergeable"));<a name="line.495"></a>
-<span class="sourceLineNo">496</span> return false;<a name="line.496"></a>
-<span class="sourceLineNo">497</span> }<a name="line.497"></a>
-<span class="sourceLineNo">498</span> } catch (IOException e) {<a name="line.498"></a>
-<span class="sourceLineNo">499</span> IOException ioe = new IOException(RegionInfo.getShortNameToLog(ri) + " NOT mergeable", e);<a name="line.499"></a>
-<span class="sourceLineNo">500</span> setFailure(getClass().getSimpleName(), ioe);<a name="line.500"></a>
-<span class="sourceLineNo">501</span> return false;<a name="line.501"></a>
-<span class="sourceLineNo">502</span> }<a name="line.502"></a>
-<span class="sourceLineNo">503</span> }<a name="line.503"></a>
-<span class="sourceLineNo">504</span><a name="line.504"></a>
-<span class="sourceLineNo">505</span> // Update region states to Merging<a name="line.505"></a>
-<span class="sourceLineNo">506</span> setRegionStateToMerging(env);<a name="line.506"></a>
-<span class="sourceLineNo">507</span> return true;<a name="line.507"></a>
-<span class="sourceLineNo">508</span> }<a name="line.508"></a>
-<span class="sourceLineNo">509</span><a name="line.509"></a>
-<span class="sourceLineNo">510</span> private boolean isMergeable(final MasterProcedureEnv env, final RegionState rs)<a name="line.510"></a>
-<span class="sourceLineNo">511</span> throws IOException {<a name="line.511"></a>
-<span class="sourceLineNo">512</span> GetRegionInfoResponse response =<a name="line.512"></a>
-<span class="sourceLineNo">513</span> AssignmentManagerUtil.getRegionInfoResponse(env, rs.getServerName(), rs.getRegion());<a name="line.513"></a>
-<span class="sourceLineNo">514</span> return response.hasMergeable() && response.getMergeable();<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> /**<a name="line.517"></a>
-<span class="sourceLineNo">518</span> * Pre merge region action<a name="line.518"></a>
-<span class="sourceLineNo">519</span> * @param env MasterProcedureEnv<a name="line.519"></a>
-<span class="sourceLineNo">520</span> **/<a name="line.520"></a>
-<span class="sourceLineNo">521</span> private void preMergeRegions(final MasterProcedureEnv env) throws IOException {<a name="line.521"></a>
-<span class="sourceLineNo">522</span> final MasterCoprocessorHost cpHost = env.getMasterCoprocessorHost();<a name="line.522"></a>
-<span class="sourceLineNo">523</span> if (cpHost != null) {<a name="line.523"></a>
-<span class="sourceLineNo">524</span> cpHost.preMergeRegionsAction(regionsToMerge, getUser());<a name="line.524"></a>
-<span class="sourceLineNo">525</span> }<a name="line.525"></a>
-<span class="sourceLineNo">526</span> // TODO: Clean up split and merge. Currently all over the place.<a name="line.526"></a>
-<span class="sourceLineNo">527</span> try {<a name="line.527"></a>
-<span class="sourceLineNo">528</span> env.getMasterServices().getMasterQuotaManager().onRegionMerged(this.mergedRegion);<a name="line.528"></a>
-<span class="sourceLineNo">529</span> } catch (QuotaExceededException e) {<a name="line.529"></a>
-<span class="sourceLineNo">530</span> // TODO: why is this here? merge requests can be submitted by actors other than the normalizer<a name="line.530"></a>
-<span class="sourceLineNo">531</span> env.getMasterServices().getRegionNormalizerManager()<a name="line.531"></a>
-<span class="sourceLineNo">532</span> .planSkipped(NormalizationPlan.PlanType.MERGE);<a name="line.532"></a>
-<span class="sourceLineNo">533</span> throw e;<a name="line.533"></a>
-<span class="sourceLineNo">534</span> }<a name="line.534"></a>
-<span class="sourceLineNo">535</span> }<a name="line.535"></a>
-<span class="sourceLineNo">536</span><a name="line.536"></a>
-<span class="sourceLineNo">537</span> /**<a name="line.537"></a>
-<span class="sourceLineNo">538</span> * Action after rollback a merge table regions action.<a name="line.538"></a>
-<span class="sourceLineNo">539</span> */<a name="line.539"></a>
-<span class="sourceLineNo">540</span> private void postRollBackMergeRegions(final MasterProcedureEnv env) throws IOException {<a name="line.540"></a>
-<span class="sourceLineNo">541</span> final MasterCoprocessorHost cpHost = env.getMasterCoprocessorHost();<a name="line.541"></a>
-<span class="sourceLineNo">542</span> if (cpHost != null) {<a name="line.542"></a>
-<span class="sourceLineNo">543</span> cpHost.postRollBackMergeRegionsAction(regionsToMerge, getUser());<a name="line.543"></a>
-<span class="sourceLineNo">544</span> }<a name="line.544"></a>
-<span class="sourceLineNo">545</span> }<a name="line.545"></a>
-<span class="sourceLineNo">546</span><a name="line.546"></a>
-<span class="sourceLineNo">547</span> /**<a name="line.547"></a>
-<span class="sourceLineNo">548</span> * Set the region states to MERGING state<a name="line.548"></a>
-<span class="sourceLineNo">549</span> */<a name="line.549"></a>
-<span class="sourceLineNo">550</span> private void setRegionStateToMerging(final MasterProcedureEnv env) {<a name="line.550"></a>
-<span class="sourceLineNo">551</span> // Set State.MERGING to regions to be merged<a name="line.551"></a>
-<span class="sourceLineNo">552</span> RegionStates regionStates = env.getAssignmentManager().getRegionStates();<a name="line.552"></a>
-<span class="sourceLineNo">553</span> for (RegionInfo ri : this.regionsToMerge) {<a name="line.553"></a>
-<span class="sourceLineNo">554</span> regionStates.getRegionStateNode(ri).setState(State.MERGING);<a name="line.554"></a>
-<span class="sourceLineNo">555</span> }<a name="line.555"></a>
-<span class="sourceLineNo">556</span> }<a name="line.556"></a>
-<span class="sourceLineNo">557</span><a name="line.557"></a>
-<span class="sourceLineNo">558</span> /**<a name="line.558"></a>
-<span class="sourceLineNo">559</span> * Create merged region. The way the merge works is that we make a 'merges' temporary directory in<a name="line.559"></a>
-<span class="sourceLineNo">560</span> * the FIRST parent region to merge (Do not change this without also changing the rollback where<a name="line.560"></a>
-<span class="sourceLineNo">561</span> * we look in this FIRST region for the merge dir). We then collect here references to all the<a name="line.561"></a>
-<span class="sourceLineNo">562</span> * store files in all the parent regions including those of the FIRST parent region into a<a name="line.562"></a>
-<span class="sourceLineNo">563</span> * subdirectory, named for the resultant merged region. We then call commitMergeRegion. It finds<a name="line.563"></a>
-<span class="sourceLineNo">564</span> * this subdirectory of storefile references and moves them under the new merge region (creating<a name="line.564"></a>
-<span class="sourceLineNo">565</span> * the region layout as side effect). After assign of the new merge region, we will run a<a name="line.565"></a>
-<span class="sourceLineNo">566</span> * compaction. This will undo the references but the reference files remain in place until the<a name="line.566"></a>
-<span class="sourceLineNo">567</span> * archiver runs (which it does on a period as a chore in the RegionServer that hosts the merge<a name="line.567"></a>
-<span class="sourceLineNo">568</span> * region -- see CompactedHFilesDischarger). Once the archiver has moved aside the no-longer used<a name="line.568"></a>
-<span class="sourceLineNo">569</span> * references, the merge region no longer has references. The catalog janitor will notice when it<a name="line.569"></a>
-<span class="sourceLineNo">570</span> * runs next and it will remove the old parent regions.<a name="line.570"></a>
-<span class="sourceLineNo">571</span> */<a name="line.571"></a>
-<span class="sourceLineNo">572</span> private void createMergedRegion(final MasterProcedureEnv env) throws IOException {<a name="line.572"></a>
-<span class="sourceLineNo">573</span> final MasterFileSystem mfs = env.getMasterServices().getMasterFileSystem();<a name="line.573"></a>
-<span class="sourceLineNo">574</span> final Path tableDir = CommonFSUtils.getTableDir(mfs.getRootDir(), regionsToMerge[0].getTable());<a name="line.574"></a>
-<span class="sourceLineNo">575</span> final FileSystem fs = mfs.getFileSystem();<a name="line.575"></a>
-<span class="sourceLineNo">576</span> List<Path> mergedFiles = new ArrayList<>();<a name="line.576"></a>
-<span class="sourceLineNo">577</span> HRegionFileSystem mergeRegionFs = HRegionFileSystem<a name="line.577"></a>
-<span class="sourceLineNo">578</span> .createRegionOnFileSystem(env.getMasterConfiguration(), fs, tableDir, mergedRegion);<a name="line.578"></a>
-<span class="sourceLineNo">579</span><a name="line.579"></a>
-<span class="sourceLineNo">580</span> for (RegionInfo ri : this.regionsToMerge) {<a name="line.580"></a>
-<span class="sourceLineNo">581</span> HRegionFileSystem regionFs = HRegionFileSystem<a name="line.581"></a>
-<span class="sourceLineNo">582</span> .openRegionFromFileSystem(env.getMasterConfiguration(), fs, tableDir, ri, false);<a name="line.582"></a>
-<span class="sourceLineNo">583</span> mergedFiles.addAll(mergeStoreFiles(env, regionFs, mergeRegionFs, mergedRegion));<a name="line.583"></a>
-<span class="sourceLineNo">584</span> }<a name="line.584"></a>
-<span class="sourceLineNo">585</span> assert mergeRegionFs != null;<a name="line.585"></a>
-<span class="sourceLineNo">586</span> mergeRegionFs.commitMergedRegion(mergedFiles, env);<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span> // Prepare to create merged regions<a name="line.588"></a>
-<span class="sourceLineNo">589</span> env.getAssignmentManager().getRegionStates().getOrCreateRegionStateNode(mergedRegion)<a name="line.589"></a>
-<span class="sourceLineNo">590</span> .setState(State.MERGING_NEW);<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> private List<Path> mergeStoreFiles(MasterProcedureEnv env, HRegionFileSystem regionFs,<a name="line.593"></a>
-<span class="sourceLineNo">594</span> HRegionFileSystem mergeRegionFs, RegionInfo mergedRegion) throws IOException {<a name="line.594"></a>
-<span class="sourceLineNo">595</span> final TableDescriptor htd =<a name="line.595"></a>
-<span class="sourceLineNo">596</span> env.getMasterServices().getTableDescriptors().get(mergedRegion.getTable());<a name="line.596"></a>
-<span class="sourceLineNo">597</span> List<Path> mergedFiles = new ArrayList<>();<a name="line.597"></a>
-<span class="sourceLineNo">598</span> for (ColumnFamilyDescriptor hcd : htd.getColumnFamilies()) {<a name="line.598"></a>
-<span class="sourceLineNo">599</span> String family = hcd.getNameAsString();<a name="line.599"></a>
-<span class="sourceLineNo">600</span> StoreFileTracker tracker =<a name="line.600"></a>
-<span class="sourceLineNo">601</span> StoreFileTrackerFactory.create(env.getMasterConfiguration(), htd, hcd, regionFs);<a name="line.601"></a>
-<span class="sourceLineNo">602</span> final Collection<StoreFileInfo> storeFiles = tracker.load();<a name="line.602"></a>
-<span class="sourceLineNo">603</span> if (storeFiles != null && storeFiles.size() > 0) {<a name="line.603"></a>
-<span class="sourceLineNo">604</span> final Configuration storeConfiguration =<a name="line.604"></a>
-<span class="sourceLineNo">605</span> StoreUtils.createStoreConfiguration(env.getMasterConfiguration(), htd, hcd);<a name="line.605"></a>
-<span class="sourceLineNo">606</span> for (StoreFileInfo storeFileInfo : storeFiles) {<a name="line.606"></a>
-<span class="sourceLineNo">607</span> // Create reference file(s) to parent region file here in mergedDir.<a name="line.607"></a>
-<span class="sourceLineNo">608</span> // As this procedure is running on master, use CacheConfig.DISABLED means<a name="line.608"></a>
-<span class="sourceLineNo">609</span> // don't cache any block.<a name="line.609"></a>
-<span class="sourceLineNo">610</span> // We also need to pass through a suitable CompoundConfiguration as if this<a name="line.610"></a>
-<span class="sourceLineNo">611</span> // is running in a regionserver's Store context, or we might not be able<a name="line.611"></a>
-<span class="sourceLineNo">612</span> // to read the hfiles.<a name="line.612"></a>
-<span class="sourceLineNo">613</span> storeFileInfo.setConf(storeConfiguration);<a name="line.613"></a>
-<span class="sourceLineNo">614</span> Path refFile = mergeRegionFs.mergeStoreFile(regionFs.getRegionInfo(), family,<a name="line.614"></a>
-<span class="sourceLineNo">615</span> new HStoreFile(storeFileInfo, hcd.getBloomFilterType(), CacheConfig.DISABLED));<a name="line.615"></a>
-<span class="sourceLineNo">616</span> mergedFiles.add(refFile);<a name="line.616"></a>
-<span class="sourceLineNo">617</span> }<a name="line.617"></a>
-<span class="sourceLineNo">618</span> }<a name="line.618"></a>
-<span class="sourceLineNo">619</span> }<a name="line.619"></a>
-<span class="sourceLineNo">620</span> return mergedFiles;<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> /**<a name="line.623"></a>
-<span class="sourceLineNo">624</span> * Clean up a merged region on rollback after failure.<a name="line.624"></a>
-<span class="sourceLineNo">625</span> */<a name="line.625"></a>
-<span class="sourceLineNo">626</span> private void cleanupMergedRegion(final MasterProcedureEnv env) throws IOException {<a name="line.626"></a>
-<span class="sourceLineNo">627</span> final MasterFileSystem mfs = env.getMasterServices().getMasterFileSystem();<a name="line.627"></a>
-<span class="sourceLineNo">628</span> TableName tn = this.regionsToMerge[0].getTable();<a name="line.628"></a>
-<span class="sourceLineNo">629</span> final Path tabledir = CommonFSUtils.getTableDir(mfs.getRootDir(), tn);<a name="line.629"></a>
-<span class="sourceLineNo">630</span> final FileSystem fs = mfs.getFileSystem();<a name="line.630"></a>
-<span class="sourceLineNo">631</span> // See createMergedRegion above where we specify the merge dir as being in the<a name="line.631"></a>
-<span class="sourceLineNo">632</span> // FIRST merge parent region.<a name="line.632"></a>
-<span class="sourceLineNo">633</span> HRegionFileSystem regionFs = HRegionFileSystem.openRegionFromFileSystem(<a name="line.633"></a>
-<span class="sourceLineNo">634</span> env.getMasterConfiguration(), fs, tabledir, regionsToMerge[0], false);<a name="line.634"></a>
-<span class="sourceLineNo">635</span> regionFs.cleanupMergedRegion(mergedRegion);<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> /**<a name="line.638"></a>
-<span class="sourceLineNo">639</span> * Rollback close regions<a name="line.639"></a>
-<span class="sourceLineNo">640</span> **/<a name="line.640"></a>
-<span class="sourceLineNo">641</span> private void rollbackCloseRegionsForMerge(MasterProcedureEnv env) throws IOException {<a name="line.641"></a>
-<span class="sourceLineNo">642</span> AssignmentManagerUtil.reopenRegionsForRollback(env, Arrays.asList(regionsToMerge),<a name="line.642"></a>
-<span class="sourceLineNo">643</span> getRegionReplication(env), getServerName(env));<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> private TransitRegionStateProcedure[] createUnassignProcedures(MasterProcedureEnv env)<a name="line.646"></a>
-<span class="sourceLineNo">647</span> throws IOException {<a name="line.647"></a>
-<span class="sourceLineNo">648</span> return AssignmentManagerUtil.createUnassignProceduresForSplitOrMerge(env,<a name="line.648"></a>
-<span class="sourceLineNo">649</span> Stream.of(regionsToMerge), getRegionReplication(env));<a name="line.649"></a>
+<span class="sourceLineNo">294</span> rollbackPrepareMerge(env);<a name="line.294"></a>
+<span class="sourceLineNo">295</span> break;<a name="line.295"></a>
+<span class="sourceLineNo">296</span> default:<a name="line.296"></a>
+<span class="sourceLineNo">297</span> throw new UnsupportedOperationException(this + " unhandled state=" + state);<a name="line.297"></a>
+<span class="sourceLineNo">298</span> }<a name="line.298"></a>
+<span class="sourceLineNo">299</span> } catch (Exception e) {<a name="line.299"></a>
+<span class="sourceLineNo">300</span> // This will be retried. Unless there is a bug in the code,<a name="line.300"></a>
+<span class="sourceLineNo">301</span> // this should be just a "temporary error" (e.g. network down)<a name="line.301"></a>
+<span class="sourceLineNo">302</span> LOG.warn("Failed rollback attempt step " + state + " for merging the regions "<a name="line.302"></a>
+<span class="sourceLineNo">303</span> + RegionInfo.getShortNameToLog(regionsToMerge) + " in table " + getTableName(), e);<a name="line.303"></a>
+<span class="sourceLineNo">304</span> throw e;<a name="line.304"></a>
+<span class="sourceLineNo">305</span> }<a name="line.305"></a>
+<span class="sourceLineNo">306</span> }<a name="line.306"></a>
+<span class="sourceLineNo">307</span><a name="line.307"></a>
+<span class="sourceLineNo">308</span> /*<a name="line.308"></a>
+<span class="sourceLineNo">309</span> * Check whether we are in the state that can be rolled back<a name="line.309"></a>
+<span class="sourceLineNo">310</span> */<a name="line.310"></a>
+<span class="sourceLineNo">311</span> @Override<a name="line.311"></a>
+<span class="sourceLineNo">312</span> protected boolean isRollbackSupported(final MergeTableRegionsState state) {<a name="line.312"></a>
+<span class="sourceLineNo">313</span> switch (state) {<a name="line.313"></a>
+<span class="sourceLineNo">314</span> case MERGE_TABLE_REGIONS_POST_OPERATION:<a name="line.314"></a>
+<span class="sourceLineNo">315</span> case MERGE_TABLE_REGIONS_OPEN_MERGED_REGION:<a name="line.315"></a>
+<span class="sourceLineNo">316</span> case MERGE_TABLE_REGIONS_POST_MERGE_COMMIT_OPERATION:<a name="line.316"></a>
+<span class="sourceLineNo">317</span> case MERGE_TABLE_REGIONS_UPDATE_META:<a name="line.317"></a>
+<span class="sourceLineNo">318</span> // It is not safe to rollback in these states.<a name="line.318"></a>
+<span class="sourceLineNo">319</span> return false;<a name="line.319"></a>
+<span class="sourceLineNo">320</span> default:<a name="line.320"></a>
+<span class="sourceLineNo">321</span> break;<a name="line.321"></a>
+<span class="sourceLineNo">322</span> }<a name="line.322"></a>
+<span class="sourceLineNo">323</span> return true;<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> private void removeNonDefaultReplicas(MasterProcedureEnv env) throws IOException {<a name="line.326"></a>
+<span class="sourceLineNo">327</span> AssignmentManagerUtil.removeNonDefaultReplicas(env, Stream.of(regionsToMerge),<a name="line.327"></a>
+<span class="sourceLineNo">328</span> getRegionReplication(env));<a name="line.328"></a>
+<span class="sourceLineNo">329</span> }<a name="line.329"></a>
+<span class="sourceLineNo">330</span><a name="line.330"></a>
+<span class="sourceLineNo">331</span> private void checkClosedRegions(MasterProcedureEnv env) throws IOException {<a name="line.331"></a>
+<span class="sourceLineNo">332</span> // Theoretically this should not happen any more after we use TRSP, but anyway<a name="line.332"></a>
+<span class="sourceLineNo">333</span> // let's add a check here<a name="line.333"></a>
+<span class="sourceLineNo">334</span> for (RegionInfo region : regionsToMerge) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span> AssignmentManagerUtil.checkClosedRegion(env, region);<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><a name="line.338"></a>
+<span class="sourceLineNo">339</span> @Override<a name="line.339"></a>
+<span class="sourceLineNo">340</span> protected MergeTableRegionsState getState(final int stateId) {<a name="line.340"></a>
+<span class="sourceLineNo">341</span> return MergeTableRegionsState.forNumber(stateId);<a name="line.341"></a>
+<span class="sourceLineNo">342</span> }<a name="line.342"></a>
+<span class="sourceLineNo">343</span><a name="line.343"></a>
+<span class="sourceLineNo">344</span> @Override<a name="line.344"></a>
+<span class="sourceLineNo">345</span> protected int getStateId(final MergeTableRegionsState state) {<a name="line.345"></a>
+<span class="sourceLineNo">346</span> return state.getNumber();<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> protected MergeTableRegionsState getInitialState() {<a name="line.350"></a>
+<span class="sourceLineNo">351</span> return MergeTableRegionsState.MERGE_TABLE_REGIONS_PREPARE;<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> protected void serializeStateData(ProcedureStateSerializer serializer) throws IOException {<a name="line.355"></a>
+<span class="sourceLineNo">356</span> super.serializeStateData(serializer);<a name="line.356"></a>
+<span class="sourceLineNo">357</span><a name="line.357"></a>
+<span class="sourceLineNo">358</span> final MasterProcedureProtos.MergeTableRegionsStateData.Builder mergeTableRegionsMsg =<a name="line.358"></a>
+<span class="sourceLineNo">359</span> MasterProcedureProtos.MergeTableRegionsStateData.newBuilder()<a name="line.359"></a>
+<span class="sourceLineNo">360</span> .setUserInfo(MasterProcedureUtil.toProtoUserInfo(getUser()))<a name="line.360"></a>
+<span class="sourceLineNo">361</span> .setMergedRegionInfo(ProtobufUtil.toRegionInfo(mergedRegion)).setForcible(force);<a name="line.361"></a>
+<span class="sourceLineNo">362</span> for (RegionInfo ri : regionsToMerge) {<a name="line.362"></a>
+<span class="sourceLineNo">363</span> mergeTableRegionsMsg.addRegionInfo(ProtobufUtil.toRegionInfo(ri));<a name="line.363"></a>
+<span class="sourceLineNo">364</span> }<a name="line.364"></a>
+<span class="sourceLineNo">365</span> serializer.serialize(mergeTableRegionsMsg.build());<a name="line.365"></a>
+<span class="sourceLineNo">366</span> }<a name="line.366"></a>
+<span class="sourceLineNo">367</span><a name="line.367"></a>
+<span class="sourceLineNo">368</span> @Override<a name="line.368"></a>
+<span class="sourceLineNo">369</span> protected void deserializeStateData(ProcedureStateSerializer serializer) throws IOException {<a name="line.369"></a>
+<span class="sourceLineNo">370</span> super.deserializeStateData(serializer);<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span> final MasterProcedureProtos.MergeTableRegionsStateData mergeTableRegionsMsg =<a name="line.372"></a>
+<span class="sourceLineNo">373</span> serializer.deserialize(MasterProcedureProtos.MergeTableRegionsStateData.class);<a name="line.373"></a>
+<span class="sourceLineNo">374</span> setUser(MasterProcedureUtil.toUserInfo(mergeTableRegionsMsg.getUserInfo()));<a name="line.374"></a>
+<span class="sourceLineNo">375</span><a name="line.375"></a>
+<span class="sourceLineNo">376</span> assert (mergeTableRegionsMsg.getRegionInfoCount() == 2);<a name="line.376"></a>
+<span class="sourceLineNo">377</span> regionsToMerge = new RegionInfo[mergeTableRegionsMsg.getRegionInfoCount()];<a name="line.377"></a>
+<span class="sourceLineNo">378</span> for (int i = 0; i < regionsToMerge.length; i++) {<a name="line.378"></a>
+<span class="sourceLineNo">379</span> regionsToMerge[i] = ProtobufUtil.toRegionInfo(mergeTableRegionsMsg.getRegionInfo(i));<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> mergedRegion = ProtobufUtil.toRegionInfo(mergeTableRegionsMsg.getMergedRegionInfo());<a name="line.382"></a>
+<span class="sourceLineNo">383</span> }<a name="line.383"></a>
+<span class="sourceLineNo">384</span><a name="line.384"></a>
+<span class="sourceLineNo">385</span> @Override<a name="line.385"></a>
+<span class="sourceLineNo">386</span> public void toStringClassDetails(StringBuilder sb) {<a name="line.386"></a>
+<span class="sourceLineNo">387</span> sb.append(getClass().getSimpleName());<a name="line.387"></a>
+<span class="sourceLineNo">388</span> sb.append(" table=");<a name="line.388"></a>
+<span class="sourceLineNo">389</span> sb.append(getTableName());<a name="line.389"></a>
+<span class="sourceLineNo">390</span> sb.append(", regions=");<a name="line.390"></a>
+<span class="sourceLineNo">391</span> sb.append(RegionInfo.getShortNameToLog(regionsToMerge));<a name="line.391"></a>
+<span class="sourceLineNo">392</span> sb.append(", force=");<a name="line.392"></a>
+<span class="sourceLineNo">393</span> sb.append(force);<a name="line.393"></a>
+<span class="sourceLineNo">394</span> }<a name="line.394"></a>
+<span class="sourceLineNo">395</span><a name="line.395"></a>
+<span class="sourceLineNo">396</span> @Override<a name="line.396"></a>
+<span class="sourceLineNo">397</span> protected LockState acquireLock(final MasterProcedureEnv env) {<a name="line.397"></a>
+<span class="sourceLineNo">398</span> RegionInfo[] lockRegions = Arrays.copyOf(regionsToMerge, regionsToMerge.length + 1);<a name="line.398"></a>
+<span class="sourceLineNo">399</span> lockRegions[lockRegions.length - 1] = mergedRegion;<a name="line.399"></a>
+<span class="sourceLineNo">400</span><a name="line.400"></a>
+<span class="sourceLineNo">401</span> if (env.getProcedureScheduler().waitRegions(this, getTableName(), lockRegions)) {<a name="line.401"></a>
+<span class="sourceLineNo">402</span> try {<a name="line.402"></a>
+<span class="sourceLineNo">403</span> LOG.debug(LockState.LOCK_EVENT_WAIT + " " + env.getProcedureScheduler().dumpLocks());<a name="line.403"></a>
+<span class="sourceLineNo">404</span> } catch (IOException e) {<a name="line.404"></a>
+<span class="sourceLineNo">405</span> // Ignore, just for logging<a name="line.405"></a>
+<span class="sourceLineNo">406</span> }<a name="line.406"></a>
+<span class="sourceLineNo">407</span> return LockState.LOCK_EVENT_WAIT;<a name="line.407"></a>
+<span class="sourceLineNo">408</span> }<a name="line.408"></a>
+<span class="sourceLineNo">409</span> return LockState.LOCK_ACQUIRED;<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> @Override<a name="line.412"></a>
+<span class="sourceLineNo">413</span> protected void releaseLock(final MasterProcedureEnv env) {<a name="line.413"></a>
+<span class="sourceLineNo">414</span> RegionInfo[] lockRegions = Arrays.copyOf(regionsToMerge, regionsToMerge.length + 1);<a name="line.414"></a>
+<span class="sourceLineNo">415</span> lockRegions[lockRegions.length - 1] = mergedRegion;<a name="line.415"></a>
+<span class="sourceLineNo">416</span><a name="line.416"></a>
+<span class="sourceLineNo">417</span> env.getProcedureScheduler().wakeRegions(this, getTableName(), lockRegions);<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> @Override<a name="line.420"></a>
+<span class="sourceLineNo">421</span> protected boolean holdLock(MasterProcedureEnv env) {<a name="line.421"></a>
+<span class="sourceLineNo">422</span> return true;<a name="line.422"></a>
+<span class="sourceLineNo">423</span> }<a name="line.423"></a>
+<span class="sourceLineNo">424</span><a name="line.424"></a>
+<span class="sourceLineNo">425</span> @Override<a name="line.425"></a>
+<span class="sourceLineNo">426</span> public TableName getTableName() {<a name="line.426"></a>
+<span class="sourceLineNo">427</span> return mergedRegion.getTable();<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> @Override<a name="line.430"></a>
+<span class="sourceLineNo">431</span> public TableOperationType getTableOperationType() {<a name="line.431"></a>
+<span class="sourceLineNo">432</span> return TableOperationType.REGION_MERGE;<a name="line.432"></a>
+<span class="sourceLineNo">433</span> }<a name="line.433"></a>
+<span class="sourceLineNo">434</span><a name="line.434"></a>
+<span class="sourceLineNo">435</span> @Override<a name="line.435"></a>
+<span class="sourceLineNo">436</span> protected ProcedureMetrics getProcedureMetrics(MasterProcedureEnv env) {<a name="line.436"></a>
+<span class="sourceLineNo">437</span> return env.getAssignmentManager().getAssignmentManagerMetrics().getMergeProcMetrics();<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> * Prepare merge and do some check<a name="line.441"></a>
+<span class="sourceLineNo">442</span> */<a name="line.442"></a>
+<span class="sourceLineNo">443</span> private boolean prepareMergeRegion(final MasterProcedureEnv env) throws IOException {<a name="line.443"></a>
+<span class="sourceLineNo">444</span> // Fail if we are taking snapshot for the given table<a name="line.444"></a>
+<span class="sourceLineNo">445</span> TableName tn = regionsToMerge[0].getTable();<a name="line.445"></a>
+<span class="sourceLineNo">446</span> if (env.getMasterServices().getSnapshotManager().isTableTakingAnySnapshot(tn)) {<a name="line.446"></a>
+<span class="sourceLineNo">447</span> throw new MergeRegionException("Skip merging regions "<a name="line.447"></a>
+<span class="sourceLineNo">448</span> + RegionInfo.getShortNameToLog(regionsToMerge) + ", because we are snapshotting " + tn);<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> // Mostly this check is not used because we already check the switch before submit a merge<a name="line.451"></a>
+<span class="sourceLineNo">452</span> // procedure. Just for safe, check the switch again. This procedure can be rollbacked if<a name="line.452"></a>
+<span class="sourceLineNo">453</span> // the switch was set to false after submit.<a name="line.453"></a>
+<span class="sourceLineNo">454</span> if (!env.getMasterServices().isSplitOrMergeEnabled(MasterSwitchType.MERGE)) {<a name="line.454"></a>
+<span class="sourceLineNo">455</span> String regionsStr = Arrays.deepToString(this.regionsToMerge);<a name="line.455"></a>
+<span class="sourceLineNo">456</span> LOG.warn("Merge switch is off! skip merge of " + regionsStr);<a name="line.456"></a>
+<span class="sourceLineNo">457</span> setFailure(getClass().getSimpleName(),<a name="line.457"></a>
+<span class="sourceLineNo">458</span> new IOException("Merge of " + regionsStr + " failed because merge switch is off"));<a name="line.458"></a>
+<span class="sourceLineNo">459</span> return false;<a name="line.459"></a>
+<span class="sourceLineNo">460</span> }<a name="line.460"></a>
+<span class="sourceLineNo">461</span><a name="line.461"></a>
+<span class="sourceLineNo">462</span> if (!env.getMasterServices().getTableDescriptors().get(getTableName()).isMergeEnabled()) {<a name="line.462"></a>
+<span class="sourceLineNo">463</span> String regionsStr = Arrays.deepToString(regionsToMerge);<a name="line.463"></a>
+<span class="sourceLineNo">464</span> LOG.warn("Merge is disabled for the table! Skipping merge of {}", regionsStr);<a name="line.464"></a>
+<span class="sourceLineNo">465</span> setFailure(getClass().getSimpleName(), new IOException(<a name="line.465"></a>
+<span class="sourceLineNo">466</span> "Merge of " + regionsStr + " failed as region merge is disabled for the table"));<a name="line.466"></a>
+<span class="sourceLineNo">467</span> return false;<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> RegionStates regionStates = env.getAssignmentManager().getRegionStates();<a name="line.470"></a>
+<span class="sourceLineNo">471</span> RegionStateStore regionStateStore = env.getAssignmentManager().getRegionStateStore();<a name="line.471"></a>
+<span class="sourceLineNo">472</span> for (RegionInfo ri : this.regionsToMerge) {<a name="line.472"></a>
+<span class="sourceLineNo">473</span> if (regionStateStore.hasMergeRegions(ri)) {<a name="line.473"></a>
+<span class="sourceLineNo">474</span> String msg = "Skip merging " + RegionInfo.getShortNameToLog(regionsToMerge)<a name="line.474"></a>
+<span class="sourceLineNo">475</span> + ", because a parent, " + RegionInfo.getShortNameToLog(ri) + ", has a merge qualifier "<a name="line.475"></a>
+<span class="sourceLineNo">476</span> + "(if a 'merge column' in parent, it was recently merged but still has outstanding "<a name="line.476"></a>
+<span class="sourceLineNo">477</span> + "references to its parents that must be cleared before it can participate in merge -- "<a name="line.477"></a>
+<span class="sourceLineNo">478</span> + "major compact it to hurry clearing of its references)";<a name="line.478"></a>
+<span class="sourceLineNo">479</span> LOG.warn(msg);<a name="line.479"></a>
+<span class="sourceLineNo">480</span> throw new MergeRegionException(msg);<a name="line.480"></a>
+<span class="sourceLineNo">481</span> }<a name="line.481"></a>
+<span class="sourceLineNo">482</span> RegionState state = regionStates.getRegionState(ri.getEncodedName());<a name="line.482"></a>
+<span class="sourceLineNo">483</span> if (state == null) {<a name="line.483"></a>
+<span class="sourceLineNo">484</span> throw new UnknownRegionException(<a name="line.484"></a>
+<span class="sourceLineNo">485</span> RegionInfo.getShortNameToLog(ri) + " UNKNOWN (Has it been garbage collected?)");<a name="line.485"></a>
+<span class="sourceLineNo">486</span> }<a name="line.486"></a>
+<span class="sourceLineNo">487</span> if (!state.isOpened()) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span> throw new MergeRegionException("Unable to merge regions that are NOT online: " + ri);<a name="line.488"></a>
+<span class="sourceLineNo">489</span> }<a name="line.489"></a>
+<span class="sourceLineNo">490</span> // Ask the remote regionserver if regions are mergeable. If we get an IOE, report it<a name="line.490"></a>
+<span class="sourceLineNo">491</span> // along with the failure, so we can see why regions are not mergeable at this time.<a name="line.491"></a>
+<span class="sourceLineNo">492</span> try {<a name="line.492"></a>
+<span class="sourceLineNo">493</span> if (!isMergeable(env, state)) {<a name="line.493"></a>
+<span class="sourceLineNo">494</span> setFailure(getClass().getSimpleName(),<a name="line.494"></a>
+<span class="sourceLineNo">495</span> new MergeRegionException("Skip merging " + RegionInfo.getShortNameToLog(regionsToMerge)<a name="line.495"></a>
+<span class="sourceLineNo">496</span> + ", because a parent, " + RegionInfo.getShortNameToLog(ri) + ", is not mergeable"));<a name="line.496"></a>
+<span class="sourceLineNo">497</span> return false;<a name="line.497"></a>
+<span class="sourceLineNo">498</span> }<a name="line.498"></a>
+<span class="sourceLineNo">499</span> } catch (IOException e) {<a name="line.499"></a>
+<span class="sourceLineNo">500</span> IOException ioe = new IOException(RegionInfo.getShortNameToLog(ri) + " NOT mergeable", e);<a name="line.500"></a>
+<span class="sourceLineNo">501</span> setFailure(getClass().getSimpleName(), ioe);<a name="line.501"></a>
+<span class="sourceLineNo">502</span> return false;<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><a name="line.505"></a>
+<span class="sourceLineNo">506</span> // Update region states to Merging<a name="line.506"></a>
+<span class="sourceLineNo">507</span> setRegionStateToMerging(env);<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> private boolean isMergeable(final MasterProcedureEnv env, final RegionState rs)<a name="line.511"></a>
+<span class="sourceLineNo">512</span> throws IOException {<a name="line.512"></a>
+<span class="sourceLineNo">513</span> GetRegionInfoResponse response =<a name="line.513"></a>
+<span class="sourceLineNo">514</span> AssignmentManagerUtil.getRegionInfoResponse(env, rs.getServerName(), rs.getRegion());<a name="line.514"></a>
+<span class="sourceLineNo">515</span> return response.hasMergeable() && response.getMergeable();<a name="line.515"></a>
+<span class="sourceLineNo">516</span> }<a name="line.516"></a>
+<span class="sourceLineNo">517</span><a name="line.517"></a>
+<span class="sourceLineNo">518</span> /**<a name="line.518"></a>
+<span class="sourceLineNo">519</span> * Action for rollback a merge table after prepare merge<a name="line.519"></a>
+<span class="sourceLineNo">520</span> */<a name="line.520"></a>
+<span class="sourceLineNo">521</span> private void rollbackPrepareMerge(final MasterProcedureEnv env) throws IOException {<a name="line.521"></a>
+<span class="sourceLineNo">522</span> for (RegionInfo rinfo : regionsToMerge) {<a name="line.522"></a>
+<span class="sourceLineNo">523</span> RegionStateNode regionStateNode =<a name="line.523"></a>
+<span class="sourceLineNo">524</span> env.getAssignmentManager().getRegionStates().getRegionStateNode(rinfo);<a name="line.524"></a>
+<span class="sourceLineNo">525</span> if (regionStateNode.getState() == State.MERGING) {<a name="line.525"></a>
+<span class="sourceLineNo">526</span> regionStateNode.setState(State.OPEN);<a name="line.526"></a>
+<span class="sourceLineNo">527</span> }<a name="line.527"></a>
+<span class="sourceLineNo">528</span> }<a name="line.528"></a>
+<span class="sourceLineNo">529</span> }<a name="line.529"></a>
+<span class="sourceLineNo">530</span><a name="line.530"></a>
+<span class="sourceLineNo">531</span> /**<a name="line.531"></a>
+<span class="sourceLineNo">532</span> * Pre merge region action<a name="line.532"></a>
+<span class="sourceLineNo">533</span> * @param env MasterProcedureEnv<a name="line.533"></a>
+<span class="sourceLineNo">534</span> **/<a name="line.534"></a>
+<span class="sourceLineNo">535</span> private void preMergeRegions(final MasterProcedureEnv env) throws IOException {<a name="line.535"></a>
+<span class="sourceLineNo">536</span> final MasterCoprocessorHost cpHost = env.getMasterCoprocessorHost();<a name="line.536"></a>
+<span class="sourceLineNo">537</span> if (cpHost != null) {<a name="line.537"></a>
+<span class="sourceLineNo">538</span> cpHost.preMergeRegionsAction(regionsToMerge, getUser());<a name="line.538"></a>
+<span class="sourceLineNo">539</span> }<a name="line.539"></a>
+<span class="sourceLineNo">540</span> // TODO: Clean up split and merge. Currently all over the place.<a name="line.540"></a>
+<span class="sourceLineNo">541</span> try {<a name="line.541"></a>
+<span class="sourceLineNo">542</span> env.getMasterServices().getMasterQuotaManager().onRegionMerged(this.mergedRegion);<a name="line.542"></a>
+<span class="sourceLineNo">543</span> } catch (QuotaExceededException e) {<a name="line.543"></a>
+<span class="sourceLineNo">544</span> // TODO: why is this here? merge requests can be submitted by actors other than the normalizer<a name="line.544"></a>
+<span class="sourceLineNo">545</span> env.getMasterServices().getRegionNormalizerManager()<a name="line.545"></a>
+<span class="sourceLineNo">546</span> .planSkipped(NormalizationPlan.PlanType.MERGE);<a name="line.546"></a>
+<span class="sourceLineNo">547</span> throw e;<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><a name="line.550"></a>
+<span class="sourceLineNo">551</span> /**<a name="line.551"></a>
+<span class="sourceLineNo">552</span> * Action after rollback a merge table regions action.<a name="line.552"></a>
+<span class="sourceLineNo">553</span> */<a name="line.553"></a>
+<span class="sourceLineNo">554</span> private void postRollBackMergeRegions(final MasterProcedureEnv env) throws IOException {<a name="line.554"></a>
+<span class="sourceLineNo">555</span> final MasterCoprocessorHost cpHost = env.getMasterCoprocessorHost();<a name="line.555"></a>
+<span class="sourceLineNo">556</span> if (cpHost != null) {<a name="line.556"></a>
+<span class="sourceLineNo">557</span> cpHost.postRollBackMergeRegionsAction(regionsToMerge, getUser());<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><a name="line.560"></a>
+<span class="sourceLineNo">561</span> /**<a name="line.561"></a>
+<span class="sourceLineNo">562</span> * Set the region states to MERGING state<a name="line.562"></a>
+<span class="sourceLineNo">563</span> */<a name="line.563"></a>
+<span class="sourceLineNo">564</span> private void setRegionStateToMerging(final MasterProcedureEnv env) {<a name="line.564"></a>
+<span class="sourceLineNo">565</span> // Set State.MERGING to regions to be merged<a name="line.565"></a>
+<span class="sourceLineNo">566</span> RegionStates regionStates = env.getAssignmentManager().getRegionStates();<a name="line.566"></a>
+<span class="sourceLineNo">567</span> for (RegionInfo ri : this.regionsToMerge) {<a name="line.567"></a>
+<span class="sourceLineNo">568</span> regionStates.getRegionStateNode(ri).setState(State.MERGING);<a name="line.568"></a>
+<span class="sourceLineNo">569</span> }<a name="line.569"></a>
+<span class="sourceLineNo">570</span> }<a name="line.570"></a>
+<span class="sourceLineNo">571</span><a name="line.571"></a>
+<span class="sourceLineNo">572</span> /**<a name="line.572"></a>
+<span class="sourceLineNo">573</span> * Create merged region. The way the merge works is that we make a 'merges' temporary directory in<a name="line.573"></a>
+<span class="sourceLineNo">574</span> * the FIRST parent region to merge (Do not change this without also changing the rollback where<a name="line.574"></a>
+<span class="sourceLineNo">575</span> * we look in this FIRST region for the merge dir). We then collect here references to all the<a name="line.575"></a>
+<span class="sourceLineNo">576</span> * store files in all the parent regions including those of the FIRST parent region into a<a name="line.576"></a>
+<span class="sourceLineNo">577</span> * subdirectory, named for the resultant merged region. We then call commitMergeRegion. It finds<a name="line.577"></a>
+<span class="sourceLineNo">578</span> * this subdirectory of storefile references and moves them under the new merge region (creating<a name="line.578"></a>
+<span class="sourceLineNo">579</span> * the region layout as side effect). After assign of the new merge region, we will run a<a name="line.579"></a>
+<span class="sourceLineNo">580</span> * compaction. This will undo the references but the reference files remain in place until the<a name="line.580"></a>
+<span class="sourceLineNo">581</span> * archiver runs (which it does on a period as a chore in the RegionServer that hosts the merge<a name="line.581"></a>
+<span class="sourceLineNo">582</span> * region -- see CompactedHFilesDischarger). Once the archiver has moved aside the no-longer used<a name="line.582"></a>
+<span class="sourceLineNo">583</span> * references, the merge region no longer has references. The catalog janitor will notice when it<a name="line.583"></a>
+<span class="sourceLineNo">584</span> * runs next and it will remove the old parent regions.<a name="line.584"></a>
+<span class="sourceLineNo">585</span> */<a name="line.585"></a>
+<span class="sourceLineNo">586</span> private void createMergedRegion(final MasterProcedureEnv env) throws IOException {<a name="line.586"></a>
+<span class="sourceLineNo">587</span> final MasterFileSystem mfs = env.getMasterServices().getMasterFileSystem();<a name="line.587"></a>
+<span class="sourceLineNo">588</span> final Path tableDir = CommonFSUtils.getTableDir(mfs.getRootDir(), regionsToMerge[0].getTable());<a name="line.588"></a>
+<span class="sourceLineNo">589</span> final FileSystem fs = mfs.getFileSystem();<a name="line.589"></a>
+<span class="sourceLineNo">590</span> List<Path> mergedFiles = new ArrayList<>();<a name="line.590"></a>
+<span class="sourceLineNo">591</span> HRegionFileSystem mergeRegionFs = HRegionFileSystem<a name="line.591"></a>
+<span class="sourceLineNo">592</span> .createRegionOnFileSystem(env.getMasterConfiguration(), fs, tableDir, mergedRegion);<a name="line.592"></a>
+<span class="sourceLineNo">593</span><a name="line.593"></a>
+<span class="sourceLineNo">594</span> for (RegionInfo ri : this.regionsToMerge) {<a name="line.594"></a>
+<span class="sourceLineNo">595</span> HRegionFileSystem regionFs = HRegionFileSystem<a name="line.595"></a>
+<span class="sourceLineNo">596</span> .openRegionFromFileSystem(env.getMasterConfiguration(), fs, tableDir, ri, false);<a name="line.596"></a>
+<span class="sourceLineNo">597</span> mergedFiles.addAll(mergeStoreFiles(env, regionFs, mergeRegionFs, mergedRegion));<a name="line.597"></a>
+<span class="sourceLineNo">598</span> }<a name="line.598"></a>
+<span class="sourceLineNo">599</span> assert mergeRegionFs != null;<a name="line.599"></a>
+<span class="sourceLineNo">600</span> mergeRegionFs.commitMergedRegion(mergedFiles, env);<a name="line.600"></a>
+<span class="sourceLineNo">601</span><a name="line.601"></a>
+<span class="sourceLineNo">602</span> // Prepare to create merged regions<a name="line.602"></a>
+<span class="sourceLineNo">603</span> env.getAssignmentManager().getRegionStates().getOrCreateRegionStateNode(mergedRegion)<a name="line.603"></a>
+<span class="sourceLineNo">604</span> .setState(State.MERGING_NEW);<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> private List<Path> mergeStoreFiles(MasterProcedureEnv env, HRegionFileSystem regionFs,<a name="line.607"></a>
+<span class="sourceLineNo">608</span> HRegionFileSystem mergeRegionFs, RegionInfo mergedRegion) throws IOException {<a name="line.608"></a>
+<span class="sourceLineNo">609</span> final TableDescriptor htd =<a name="line.609"></a>
+<span class="sourceLineNo">610</span> env.getMasterServices().getTableDescriptors().get(mergedRegion.getTable());<a name="line.610"></a>
+<span class="sourceLineNo">611</span> List<Path> mergedFiles = new ArrayList<>();<a name="line.611"></a>
+<span class="sourceLineNo">612</span> for (ColumnFamilyDescriptor hcd : htd.getColumnFamilies()) {<a name="line.612"></a>
+<span class="sourceLineNo">613</span> String family = hcd.getNameAsString();<a name="line.613"></a>
+<span class="sourceLineNo">614</span> StoreFileTracker tracker =<a name="line.614"></a>
+<span class="sourceLineNo">615</span> StoreFileTrackerFactory.create(env.getMasterConfiguration(), htd, hcd, regionFs);<a name="line.615"></a>
+<span class="sourceLineNo">616</span> final Collection<StoreFileInfo> storeFiles = tracker.load();<a name="line.616"></a>
+<span class="sourceLineNo">617</span> if (storeFiles != null && storeFiles.size() > 0) {<a name="line.617"></a>
+<span class="sourceLineNo">618</span> final Configuration storeConfiguration =<a name="line.618"></a>
+<span class="sourceLineNo">619</span> StoreUtils.createStoreConfiguration(env.getMasterConfiguration(), htd, hcd);<a name="line.619"></a>
+<span class="sourceLineNo">620</span> for (StoreFileInfo storeFileInfo : storeFiles) {<a name="line.620"></a>
+<span class="sourceLineNo">621</span> // Create reference file(s) to parent region file here in mergedDir.<a name="line.621"></a>
+<span class="sourceLineNo">622</span> // As this procedure is running on master, use CacheConfig.DISABLED means<a name="line.622"></a>
+<span class="sourceLineNo">623</span> // don't cache any block.<a name="line.623"></a>
+<span class="sourceLineNo">624</span> // We also need to pass through a suitable CompoundConfiguration as if this<a name="line.624"></a>
+<span class="sourceLineNo">625</span> // is running in a regionserver's Store context, or we might not be able<a name="line.625"></a>
+<span class="sourceLineNo">626</span> // to read the hfiles.<a name="line.626"></a>
+<span class="sourceLineNo">627</span> storeFileInfo.setConf(storeConfiguration);<a name="line.627"></a>
+<span class="sourceLineNo">628</span> Path refFile = mergeRegionFs.mergeStoreFile(regionFs.getRegionInfo(), family,<a name="line.628"></a>
+<span class="sourceLineNo">629</span> new HStoreFile(storeFileInfo, hcd.getBloomFilterType(), CacheConfig.DISABLED));<a name="line.629"></a>
+<span class="sourceLineNo">630</span> mergedFiles.add(refFile);<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> return mergedFiles;<a name="line.634"></a>
+<span class="sourceLineNo">635</span> }<a name="line.635"></a>
+<span class="sourceLineNo">636</span><a name="line.636"></a>
+<span class="sourceLineNo">637</span> /**<a name="line.637"></a>
+<span class="sourceLineNo">638</span> * Clean up a merged region on rollback after failure.<a name="line.638"></a>
+<span class="sourceLineNo">639</span> */<a name="line.639"></a>
+<span class="sourceLineNo">640</span> private void cleanupMergedRegion(final MasterProcedureEnv env) throws IOException {<a name="line.640"></a>
+<span class="sourceLineNo">641</span> final MasterFileSystem mfs = env.getMasterServices().getMasterFileSystem();<a name="line.641"></a>
+<span class="sourceLineNo">642</span> TableName tn = this.regionsToMerge[0].getTable();<a name="line.642"></a>
+<span class="sourceLineNo">643</span> final Path tabledir = CommonFSUtils.getTableDir(mfs.getRootDir(), tn);<a name="line.643"></a>
+<span class="sourceLineNo">644</span> final FileSystem fs = mfs.getFileSystem();<a name="line.644"></a>
+<span class="sourceLineNo">645</span> // See createMergedRegion above where we specify the merge dir as being in the<a name="line.645"></a>
+<span class="sourceLineNo">646</span> // FIRST merge parent region.<a name="line.646"></a>
+<span class="sourceLineNo">647</span> HRegionFileSystem regionFs = HRegionFileSystem.openRegionFromFileSystem(<a name="line.647"></a>
+<span class="sourceLineNo">648</span> env.getMasterConfiguration(), fs, tabledir, regionsToMerge[0], false);<a name="line.648"></a>
+<span class="sourceLineNo">649</span> regionFs.cleanupMergedRegion(mergedRegion);<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> private TransitRegionStateProcedure[] createAssignProcedures(MasterProcedureEnv env)<a name="line.652"></a>
-<span class="sourceLineNo">653</span> throws IOException {<a name="line.653"></a>
-<span class="sourceLineNo">654</span> return AssignmentManagerUtil.createAssignProceduresForOpeningNewRegions(env,<a name="line.654"></a>
-<span class="sourceLineNo">655</span> Collections.singletonList(mergedRegion), getRegionReplication(env), getServerName(env));<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> private int getRegionReplication(final MasterProcedureEnv env) throws IOException {<a name="line.658"></a>
-<span class="sourceLineNo">659</span> return env.getMasterServices().getTableDescriptors().get(getTableName()).getRegionReplication();<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> /**<a name="line.662"></a>
-<span class="sourceLineNo">663</span> * Post merge region action<a name="line.663"></a>
-<span class="sourceLineNo">664</span> * @param env MasterProcedureEnv<a name="line.664"></a>
-<span class="sourceLineNo">665</span> **/<a name="line.665"></a>
-<span class="sourceLineNo">666</span> private void preMergeRegionsCommit(final MasterProcedureEnv env) throws IOException {<a name="line.666"></a>
-<span class="sourceLineNo">667</span> final MasterCoprocessorHost cpHost = env.getMasterCoprocessorHost();<a name="line.667"></a>
-<span class="sourceLineNo">668</span> if (cpHost != null) {<a name="line.668"></a>
-<span class="sourceLineNo">669</span> @MetaMutationAnnotation<a name="line.669"></a>
-<span class="sourceLineNo">670</span> final List<Mutation> metaEntries = new ArrayList<>();<a name="line.670"></a>
-<span class="sourceLineNo">671</span> cpHost.preMergeRegionsCommit(regionsToMerge, metaEntries, getUser());<a name="line.671"></a>
-<span class="sourceLineNo">672</span> try {<a name="line.672"></a>
-<span class="sourceLineNo">673</span> for (Mutation p : metaEntries) {<a name="line.673"></a>
-<span class="sourceLineNo">674</span> RegionInfo.parseRegionName(p.getRow());<a name="line.674"></a>
-<span class="sourceLineNo">675</span> }<a name="line.675"></a>
-<span class="sourceLineNo">676</span> } catch (IOException e) {<a name="line.676"></a>
-<span class="sourceLineNo">677</span> LOG.error("Row key of mutation from coprocessor is not parsable as region name. "<a name="line.677"></a>
-<span class="sourceLineNo">678</span> + "Mutations from coprocessor should only be for hbase:meta table.", e);<a name="line.678"></a>
-<span class="sourceLineNo">679</span> throw e;<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">652</span> /**<a name="line.652"></a>
+<span class="sourceLineNo">653</span> * Rollback close regions<a name="line.653"></a>
+<span class="sourceLineNo">654</span> **/<a name="line.654"></a>
+<span class="sourceLineNo">655</span> private void rollbackCloseRegionsForMerge(MasterProcedureEnv env) throws IOException {<a name="line.655"></a>
+<span class="sourceLineNo">656</span> // At this point we should check if region was actually closed. If it was not closed then we<a name="line.656"></a>
+<span class="sourceLineNo">657</span> // don't need to repoen the region and we can just change the regionNode state to OPEN.<a name="line.657"></a>
+<span class="sourceLineNo">658</span> // if it is alredy closed then we need to do a reopen of region<a name="line.658"></a>
+<span class="sourceLineNo">659</span> List<RegionInfo> toAssign = new ArrayList<>();<a name="line.659"></a>
+<span class="sourceLineNo">660</span> for (RegionInfo rinfo : regionsToMerge) {<a name="line.660"></a>
+<span class="sourceLineNo">661</span> RegionStateNode regionStateNode =<a name="line.661"></a>
+<span class="sourceLineNo">662</span> env.getAssignmentManager().getRegionStates().getRegionStateNode(rinfo);<a name="line.662"></a>
+<span class="sourceLineNo">663</span> if (regionStateNode.getState() != State.MERGING) {<a name="line.663"></a>
+<span class="sourceLineNo">664</span> // same as before HBASE-28405<a name="line.664"></a>
+<span class="sourceLineNo">665</span> toAssign.add(rinfo);<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> AssignmentManagerUtil.reopenRegionsForRollback(env, toAssign, getRegionReplication(env),<a name="line.668"></a>
+<span class="sourceLineNo">669</span> getServerName(env));<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> private TransitRegionStateProcedure[] createUnassignProcedures(MasterProcedureEnv env)<a name="line.672"></a>
+<span class="sourceLineNo">673</span> throws IOException {<a name="line.673"></a>
+<span class="sourceLineNo">674</span> return AssignmentManagerUtil.createUnassignProceduresForSplitOrMerge(env,<a name="line.674"></a>
+<span class="sourceLineNo">675</span> Stream.of(regionsToMerge), getRegionReplication(env));<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> private TransitRegionStateProcedure[] createAssignProcedures(MasterProcedureEnv env)<a name="line.678"></a>
+<span class="sourceLineNo">679</span> throws IOException {<a name="line.679"></a>
+<span class="sourceLineNo">680</span> return AssignmentManagerUtil.createAssignProceduresForOpeningNewRegions(env,<a name="line.680"></a>
+<span class="sourceLineNo">681</span> Collections.singletonList(mergedRegion), getRegionReplication(env), getServerName(env));<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> /**<a name="line.684"></a>
-<span class="sourceLineNo">685</span> * Add merged region to META and delete original regions.<a name="line.685"></a>
-<span class="sourceLineNo">686</span> */<a name="line.686"></a>
-<span class="sourceLineNo">687</span> private void updateMetaForMergedRegions(final MasterProcedureEnv env) throws IOException {<a name="line.687"></a>
-<span class="sourceLineNo">688</span> env.getAssignmentManager().markRegionAsMerged(mergedRegion, getServerName(env),<a name="line.688"></a>
-<span class="sourceLineNo">689</span> this.regionsToMerge);<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> * Post merge region action<a name="line.693"></a>
-<span class="sourceLineNo">694</span> * @param env MasterProcedureEnv<a name="line.694"></a>
-<span class="sourceLineNo">695</span> **/<a name="line.695"></a>
-<span class="sourceLineNo">696</span> private void postMergeRegionsCommit(final MasterProcedureEnv env) throws IOException {<a name="line.696"></a>
-<span class="sourceLineNo">697</span> final MasterCoprocessorHost cpHost = env.getMasterCoprocessorHost();<a name="line.697"></a>
-<span class="sourceLineNo">698</span> if (cpHost != null) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span> cpHost.postMergeRegionsCommit(regionsToMerge, mergedRegion, getUser());<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><a name="line.702"></a>
-<span class="sourceLineNo">703</span> /**<a name="line.703"></a>
-<span class="sourceLineNo">704</span> * Post merge region action<a name="line.704"></a>
-<span class="sourceLineNo">705</span> * @param env MasterProcedureEnv<a name="line.705"></a>
-<span class="sourceLineNo">706</span> **/<a name="line.706"></a>
-<span class="sourceLineNo">707</span> private void postCompletedMergeRegions(final MasterProcedureEnv env) throws IOException {<a name="line.707"></a>
-<span class="sourceLineNo">708</span> final MasterCoprocessorHost cpHost = env.getMasterCoprocessorHost();<a name="line.708"></a>
-<span class="sourceLineNo">709</span> if (cpHost != null) {<a name="line.709"></a>
-<span class="sourceLineNo">710</span> cpHost.postCompletedMergeRegionsAction(regionsToMerge, mergedRegion, getUser());<a name="line.710"></a>
-<span class="sourceLineNo">711</span> }<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">715</span> * The procedure could be restarted from a different machine. If the variable is null, we need to<a name="line.715"></a>
-<span class="sourceLineNo">716</span> * retrieve it.<a name="line.716"></a>
-<span class="sourceLineNo">717</span> * @param env MasterProcedureEnv<a name="line.717"></a>
-<span class="sourceLineNo">718</span> */<a name="line.718"></a>
-<span class="sourceLineNo">719</span> private ServerName getServerName(final MasterProcedureEnv env) {<a name="line.719"></a>
-<span class="sourceLineNo">720</span> if (regionLocation == null) {<a name="line.720"></a>
-<span class="sourceLineNo">721</span> regionLocation =<a name="line.721"></a>
-<span class="sourceLineNo">722</span> env.getAssignmentManager().getRegionStates().getRegionServerOfRegion(regionsToMerge[0]);<a name="line.722"></a>
-<span class="sourceLineNo">723</span> // May still be null here but return null and let caller deal.<a name="line.723"></a>
-<span class="sourceLineNo">724</span> // Means we lost the in-memory-only location. We are in recovery<a name="line.724"></a>
-<span class="sourceLineNo">725</span> // or so. The caller should be able to deal w/ a null ServerName.<a name="line.725"></a>
-<span class="sourceLineNo">726</span> // Let them go to the Balancer to find one to use instead.<a name="line.726"></a>
-<span class="sourceLineNo">727</span> }<a name="line.727"></a>
-<span class="sourceLineNo">728</span> return regionLocation;<a name="line.728"></a>
-<span class="sourceLineNo">729</span> }<a name="line.729"></a>
-<span class="sourceLineNo">730</span><a name="line.730"></a>
-<span class="sourceLineNo">731</span> private void writeMaxSequenceIdFile(MasterProcedureEnv env) throws IOException {<a name="line.731"></a>
-<span class="sourceLineNo">732</span> MasterFileSystem fs = env.getMasterFileSystem();<a name="line.732"></a>
-<span class="sourceLineNo">733</span> long maxSequenceId = -1L;<a name="line.733"></a>
-<span class="sourceLineNo">734</span> for (RegionInfo region : regionsToMerge) {<a name="line.734"></a>
-<span class="sourceLineNo">735</span> maxSequenceId =<a name="line.735"></a>
-<span class="sourceLineNo">736</span> Math.max(maxSequenceId, WALSplitUtil.getMaxRegionSequenceId(env.getMasterConfiguration(),<a name="line.736"></a>
-<span class="sourceLineNo">737</span> region, fs::getFileSystem, fs::getWALFileSystem));<a name="line.737"></a>
-<span class="sourceLineNo">738</span> }<a name="line.738"></a>
-<span class="sourceLineNo">739</span> if (maxSequenceId > 0) {<a name="line.739"></a>
-<span class="sourceLineNo">740</span> WALSplitUtil.writeRegionSequenceIdFile(fs.getWALFileSystem(),<a name="line.740"></a>
-<span class="sourceLineNo">741</span> getWALRegionDir(env, mergedRegion), maxSequenceId);<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><a name="line.744"></a>
-<span class="sourceLineNo">745</span> /** Returns The merged region. Maybe be null if called to early or we failed. */<a name="line.745"></a>
-<span class="sourceLineNo">746</span> RegionInfo getMergedRegion() {<a name="line.746"></a>
-<span class="sourceLineNo">747</span> return this.mergedRegion;<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> @Override<a name="line.750"></a>
-<span class="sourceLineNo">751</span> protected boolean abort(MasterProcedureEnv env) {<a name="line.751"></a>
-<span class="sourceLineNo">752</span> // Abort means rollback. We can't rollback all steps. HBASE-18018 added abort to all<a name="line.752"></a>
-<span class="sourceLineNo">753</span> // Procedures. Here is a Procedure that has a PONR and cannot be aborted once it enters this<a name="line.753"></a>
-<span class="sourceLineNo">754</span> // range of steps; what do we do for these should an operator want to cancel them? HBASE-20022.<a name="line.754"></a>
-<span class="sourceLineNo">755</span> return isRollbackSupported(getCurrentState()) && super.abort(env);<a name="line.755"></a>
-<span class="sourceLineNo">756</span> }<a name="line.756"></a>
-<span class="sourceLineNo">757</span>}<a name="line.757"></a>
+<span class="sourceLineNo">684</span> private int getRegionReplication(final MasterProcedureEnv env) throws IOException {<a name="line.684"></a>
+<span class="sourceLineNo">685</span> return env.getMasterServices().getTableDescriptors().get(getTableName()).getRegionReplication();<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> /**<a name="line.688"></a>
+<span class="sourceLineNo">689</span> * Post merge region action<a name="line.689"></a>
+<span class="sourceLineNo">690</span> * @param env MasterProcedureEnv<a name="line.690"></a>
+<span class="sourceLineNo">691</span> **/<a name="line.691"></a>
+<span class="sourceLineNo">692</span> private void preMergeRegionsCommit(final MasterProcedureEnv env) throws IOException {<a name="line.692"></a>
+<span class="sourceLineNo">693</span> final MasterCoprocessorHost cpHost = env.getMasterCoprocessorHost();<a name="line.693"></a>
+<span class="sourceLineNo">694</span> if (cpHost != null) {<a name="line.694"></a>
+<span class="sourceLineNo">695</span> @MetaMutationAnnotation<a name="line.695"></a>
+<span class="sourceLineNo">696</span> final List<Mutation> metaEntries = new ArrayList<>();<a name="line.696"></a>
+<span class="sourceLineNo">697</span> cpHost.preMergeRegionsCommit(regionsToMerge, metaEntries, getUser());<a name="line.697"></a>
+<span class="sourceLineNo">698</span> try {<a name="line.698"></a>
+<span class="sourceLineNo">699</span> for (Mutation p : metaEntries) {<a name="line.699"></a>
+<span class="sourceLineNo">700</span> RegionInfo.parseRegionName(p.getRow());<a name="line.700"></a>
+<span class="sourceLineNo">701</span> }<a name="line.701"></a>
+<span class="sourceLineNo">702</span> } catch (IOException e) {<a name="line.702"></a>
+<span class="sourceLineNo">703</span> LOG.error("Row key of mutation from coprocessor is not parsable as region name. "<a name="line.703"></a>
+<span class="sourceLineNo">704</span> + "Mutations from coprocessor should only be for hbase:meta table.", e);<a name="line.704"></a>
+<span class="sourceLineNo">705</span> throw e;<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> }<a name="line.708"></a>
+<span class="sourceLineNo">709</span><a name="line.709"></a>
+<span class="sourceLineNo">710</span> /**<a name="line.710"></a>
+<span class="sourceLineNo">711</span> * Add merged region to META and delete original regions.<a name="line.711"></a>
+<span class="sourceLineNo">712</span> */<a name="line.712"></a>
+<span class="sourceLineNo">713</span> private void updateMetaForMergedRegions(final MasterProcedureEnv env) throws IOException {<a name="line.713"></a>
+<span class="sourceLineNo">714</span> env.getAssignmentManager().markRegionAsMerged(mergedRegion, getServerName(env),<a name="line.714"></a>
+<span class="sourceLineNo">715</span> this.regionsToMerge);<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> /**<a name="line.718"></a>
+<span class="sourceLineNo">719</span> * Post merge region action<a name="line.719"></a>
+<span class="sourceLineNo">720</span> * @param env MasterProcedureEnv<a name="line.720"></a>
+<span class="sourceLineNo">721</span> **/<a name="line.721"></a>
+<span class="sourceLineNo">722</span> private void postMergeRegionsCommit(final MasterProcedureEnv env) throws IOException {<a name="line.722"></a>
+<span class="sourceLineNo">723</span> final MasterCoprocessorHost cpHost = env.getMasterCoprocessorHost();<a name="line.723"></a>
+<span class="sourceLineNo">724</span> if (cpHost != null) {<a name="line.724"></a>
+<span class="sourceLineNo">725</span> cpHost.postMergeRegionsCommit(regionsToMerge, mergedRegion, getUser());<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><a name="line.728"></a>
+<span class="sourceLineNo">729</span> /**<a name="line.729"></a>
+<span class="sourceLineNo">730</span> * Post merge region action<a name="line.730"></a>
+<span class="sourceLineNo">731</span> * @param env MasterProcedureEnv<a name="line.731"></a>
+<span class="sourceLineNo">732</span> **/<a name="line.732"></a>
+<span class="sourceLineNo">733</span> private void postCompletedMergeRegions(final MasterProcedureEnv env) throws IOException {<a name="line.733"></a>
+<span class="sourceLineNo">734</span> final MasterCoprocessorHost cpHost = env.getMasterCoprocessorHost();<a name="line.734"></a>
+<span class="sourceLineNo">735</span> if (cpHost != null) {<a name="line.735"></a>
+<span class="sourceLineNo">736</span> cpHost.postCompletedMergeRegionsAction(regionsToMerge, mergedRegion, getUser());<a name="line.736"></a>
+<span class="sourceLineNo">737</span> }<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> /**<a name="line.740"></a>
+<span class="sourceLineNo">741</span> * The procedure could be restarted from a different machine. If the variable is null, we need to<a name="line.741"></a>
+<span class="sourceLineNo">742</span> * retrieve it.<a name="line.742"></a>
+<span class="sourceLineNo">743</span> * @param env MasterProcedureEnv<a name="line.743"></a>
+<span class="sourceLineNo">744</span> */<a name="line.744"></a>
+<span class="sourceLineNo">745</span> private ServerName getServerName(final MasterProcedureEnv env) {<a name="line.745"></a>
+<span class="sourceLineNo">746</span> if (regionLocation == null) {<a name="line.746"></a>
+<span class="sourceLineNo">747</span> regionLocation =<a name="line.747"></a>
+<span class="sourceLineNo">748</span> env.getAssignmentManager().getRegionStates().getRegionServerOfRegion(regionsToMerge[0]);<a name="line.748"></a>
+<span class="sourceLineNo">749</span> // May still be null here but return null and let caller deal.<a name="line.749"></a>
+<span class="sourceLineNo">750</span> // Means we lost the in-memory-only location. We are in recovery<a name="line.750"></a>
+<span class="sourceLineNo">751</span> // or so. The caller should be able to deal w/ a null ServerName.<a name="line.751"></a>
+<span class="sourceLineNo">752</span> // Let them go to the Balancer to find one to use instead.<a name="line.752"></a>
+<span class="sourceLineNo">753</span> }<a name="line.753"></a>
+<span class="sourceLineNo">754</span> return regionLocation;<a name="line.754"></a>
+<span class="sourceLineNo">755</span> }<a name="line.755"></a>
+<span class="sourceLineNo">756</span><a name="line.756"></a>
+<span class="sourceLineNo">757</span> private void writeMaxSequenceIdFile(MasterProcedureEnv env) throws IOException {<a name="line.757"></a>
+<span class="sourceLineNo">758</span> MasterFileSystem fs = env.getMasterFileSystem();<a name="line.758"></a>
+<span class="sourceLineNo">759</span> long maxSequenceId = -1L;<a name="line.759"></a>
+<span class="sourceLineNo">760</span> for (RegionInfo region : regionsToMerge) {<a name="line.760"></a>
+<span class="sourceLineNo">761</span> maxSequenceId =<a name="line.761"></a>
+<span class="sourceLineNo">762</span> Math.max(maxSequenceId, WALSplitUtil.getMaxRegionSequenceId(env.getMasterConfiguration(),<a name="line.762"></a>
+<span class="sourceLineNo">763</span> region, fs::getFileSystem, fs::getWALFileSystem));<a name="line.763"></a>
+<span class="sourceLineNo">764</span> }<a name="line.764"></a>
+<span class="sourceLineNo">765</span> if (maxSequenceId > 0) {<a name="line.765"></a>
+<span class="sourceLineNo">766</span> WALSplitUtil.writeRegionSequenceIdFile(fs.getWALFileSystem(),<a name="line.766"></a>
+<span class="sourceLineNo">767</span> getWALRegionDir(env, mergedRegion), maxSequenceId);<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><a name="line.770"></a>
+<span class="sourceLineNo">771</span> /** Returns The merged region. Maybe be null if called to early or we failed. */<a name="line.771"></a>
+<span class="sourceLineNo">772</span> RegionInfo getMergedRegion() {<a name="line.772"></a>
+<span class="sourceLineNo">773</span> return this.mergedRegion;<a name="line.773"></a>
+<span class="sourceLineNo">774</span> }<a name="line.774"></a>
+<span class="sourceLineNo">775</span><a name="line.775"></a>
+<span class="sourceLineNo">776</span> @Override<a name="line.776"></a>
+<span class="sourceLineNo">777</span> protected boolean abort(MasterProcedureEnv env) {<a name="line.777"></a>
+<span class="sourceLineNo">778</span> // Abort means rollback. We can't rollback all steps. HBASE-18018 added abort to all<a name="line.778"></a>
+<span class="sourceLineNo">779</span> // Procedures. Here is a Procedure that has a PONR and cannot be aborted once it enters this<a name="line.779"></a>
+<span class="sourceLineNo">780</span> // range of steps; what do we do for these should an operator want to cancel them? HBASE-20022.<a name="line.780"></a>
+<span class="sourceLineNo">781</span> return isRollbackSupported(getCurrentState()) && super.abort(env);<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>
diff --git a/downloads.html b/downloads.html
index f75c412a7d8..db516d65d38 100644
--- a/downloads.html
+++ b/downloads.html
@@ -415,7 +415,7 @@
<div class="row">
<p>Copyright ©2007–2024
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-26</li>
+All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-29</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 707e82920dc..63b81191a70 100644
--- a/export_control.html
+++ b/export_control.html
@@ -205,7 +205,7 @@ for more details.</p>
<div class="row">
<p>Copyright ©2007–2024
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-26</li>
+All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-29</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 37ee943d491..c04748e357c 100644
--- a/index.html
+++ b/index.html
@@ -278,7 +278,7 @@
<div class="row">
<p>Copyright ©2007–2024
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-26</li>
+All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-29</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-management.html b/issue-management.html
index 8e57f93f1d3..9dea7e3896a 100644
--- a/issue-management.html
+++ b/issue-management.html
@@ -176,7 +176,7 @@
<div class="row">
<p>Copyright ©2007–2024
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-26</li>
+All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-29</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/licenses.html b/licenses.html
index b0091e6663e..d88befc6c38 100644
--- a/licenses.html
+++ b/licenses.html
@@ -378,7 +378,7 @@
<div class="row">
<p>Copyright ©2007–2024
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-26</li>
+All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-29</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/mailing-lists.html b/mailing-lists.html
index 6a26e64e5cc..d8e75422cb3 100644
--- a/mailing-lists.html
+++ b/mailing-lists.html
@@ -223,7 +223,7 @@
<div class="row">
<p>Copyright ©2007–2024
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-26</li>
+All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-29</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 f0dac11d120..5b1792b7731 100644
--- a/metrics.html
+++ b/metrics.html
@@ -327,7 +327,7 @@ export HBASE_REGIONSERVER_OPTS="$HBASE_JMX_OPTS -Dcom.sun.management.jmxrem
<div class="row">
<p>Copyright ©2007–2024
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-26</li>
+All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-29</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 11101bc3a9a..94003433abc 100644
--- a/old_news.html
+++ b/old_news.html
@@ -324,7 +324,7 @@
<div class="row">
<p>Copyright ©2007–2024
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-26</li>
+All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-29</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 b9750816477..a69ec3e59bb 100644
--- a/plugin-management.html
+++ b/plugin-management.html
@@ -329,7 +329,7 @@
<div class="row">
<p>Copyright ©2007–2024
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-26</li>
+All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-29</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 81e2a86a59d..42595e8f11b 100644
--- a/plugins.html
+++ b/plugins.html
@@ -263,7 +263,7 @@
<div class="row">
<p>Copyright ©2007–2024
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-26</li>
+All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-29</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 125bd226ea5..ec7bb97e786 100644
--- a/poweredbyhbase.html
+++ b/poweredbyhbase.html
@@ -658,7 +658,7 @@
<div class="row">
<p>Copyright ©2007–2024
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-26</li>
+All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-29</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 9baaed6ef0a..140fe96a310 100644
--- a/project-info.html
+++ b/project-info.html
@@ -220,7 +220,7 @@
<div class="row">
<p>Copyright ©2007–2024
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-26</li>
+All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-29</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 f5be9769bf3..8893fc78e7e 100644
--- a/project-reports.html
+++ b/project-reports.html
@@ -193,7 +193,7 @@
<div class="row">
<p>Copyright ©2007–2024
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-26</li>
+All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-29</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 84f5011a663..806397f66d6 100644
--- a/pseudo-distributed.html
+++ b/pseudo-distributed.html
@@ -182,7 +182,7 @@ Running Apache HBase (TM) in pseudo-distributed mode
<div class="row">
<p>Copyright ©2007–2024
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-26</li>
+All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-29</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 11f2d59e777..c3fb1961f58 100644
--- a/replication.html
+++ b/replication.html
@@ -177,7 +177,7 @@
<div class="row">
<p>Copyright ©2007–2024
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-26</li>
+All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-29</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 fcd7dbca6e8..38bccfe35ff 100644
--- a/resources.html
+++ b/resources.html
@@ -200,7 +200,7 @@
<div class="row">
<p>Copyright ©2007–2024
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-26</li>
+All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-29</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/scm.html b/scm.html
index 40de69d4e87..503dbeb21ca 100644
--- a/scm.html
+++ b/scm.html
@@ -184,7 +184,7 @@
<div class="row">
<p>Copyright ©2007–2024
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-26</li>
+All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-29</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 2ab38ec16d9..d47f33dca93 100644
--- a/sponsors.html
+++ b/sponsors.html
@@ -206,7 +206,7 @@
<div class="row">
<p>Copyright ©2007–2024
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-26</li>
+All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-29</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/summary.html b/summary.html
index 9610ec5e2dc..b790dad9421 100644
--- a/summary.html
+++ b/summary.html
@@ -217,7 +217,7 @@
<div class="row">
<p>Copyright ©2007–2024
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-26</li>
+All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-29</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 1ae2f2bf08d..f5685ffea45 100644
--- a/supportingprojects.html
+++ b/supportingprojects.html
@@ -396,7 +396,7 @@
<div class="row">
<p>Copyright ©2007–2024
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-26</li>
+All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-29</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.html b/team.html
index 0c6837dd80a..f63f1ff2bd4 100644
--- a/team.html
+++ b/team.html
@@ -809,7 +809,7 @@
<div class="row">
<p>Copyright ©2007–2024
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-26</li>
+All rights reserved. <li id="publishDate" class="pull-right">Last Published: 2024-04-29</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/index-all.html b/testdevapidocs/index-all.html
index bfb49b3cc7e..28dd6781da9 100644
--- a/testdevapidocs/index-all.html
+++ b/testdevapidocs/index-all.html
@@ -80320,8 +80320,12 @@
<dd>
<div class="block">Test that we can do reverse scans when writing tags and using DataBlockEncoding.</div>
</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestTags.html#testReverseScanWithDBE-org.apache.hadoop.hbase.client.Connection-org.apache.hadoop.hbase.io.encoding.DataBlockEncoding-byte:A-">testReverseScanWithDBE(Connection, DataBlockEncoding, byte[])</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestTags.html" title="class in org.apache.hadoop.hbase.regionserver">TestTags</a></dt>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestTags.html#testReverseScanWithDBE-org.apache.hadoop.hbase.client.Connection-org.apache.hadoop.hbase.io.encoding.DataBlockEncoding-byte:A-int-int-">testReverseScanWithDBE(Connection, DataBlockEncoding, byte[], int, int)</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestTags.html" title="class in org.apache.hadoop.hbase.regionserver">TestTags</a></dt>
<dd> </dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestTags.html#testReverseScanWithDBEWhenCurrentBlockUpdates--">testReverseScanWithDBEWhenCurrentBlockUpdates()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestTags.html" title="class in org.apache.hadoop.hbase.regionserver">TestTags</a></dt>
+<dd>
+<div class="block">Test that we can do reverse scans when writing tags and using DataBlockEncoding.</div>
+</dd>
<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestScannersFromClientSide.html#testReverseScanWithFlush--">testReverseScanWithFlush()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestScannersFromClientSide.html" title="class in org.apache.hadoop.hbase.client">TestScannersFromClientSide</a></dt>
<dd> </dd>
<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/encoding/TestSeekBeforeWithReverseScan.html#testReverseScanWithoutPadding--">testReverseScanWithoutPadding()</a></span> - Method in class org.apache.hadoop.hbase.io.encoding.<a href="org/apache/hadoop/hbase/io/encoding/TestSeekBeforeWithReverseScan.html" title="class in org.apache.hadoop.hbase.io.encoding">TestSeekBeforeWithReverseScan</a></dt>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/example/TestZooKeeperScanPolicyObserver.html b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/example/TestZooKeeperScanPolicyObserver.html
index 4a6d948af0b..0c2e0d469bd 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/example/TestZooKeeperScanPolicyObserver.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/example/TestZooKeeperScanPolicyObserver.html
@@ -109,7 +109,7 @@ var activeTableTab = "activeTableTab";
<li class="blockList">
<hr>
<br>
-<pre>public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/coprocessor/example/TestZooKeeperScanPolicyObserver.html#line.47">TestZooKeeperScanPolicyObserver</a>
+<pre>public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/coprocessor/example/TestZooKeeperScanPolicyObserver.html#line.48">TestZooKeeperScanPolicyObserver</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>
@@ -245,7 +245,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
<ul class="blockList">
<li class="blockList">
<h4>CLASS_RULE</h4>
-<pre>public static final <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/example/TestZooKeeperScanPolicyObserver.html#line.50">CLASS_RULE</a></pre>
+<pre>public static final <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/example/TestZooKeeperScanPolicyObserver.html#line.51">CLASS_RULE</a></pre>
</li>
</ul>
<a name="UTIL">
@@ -254,7 +254,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
<ul class="blockList">
<li class="blockList">
<h4>UTIL</h4>
-<pre>private static final <a href="../../../../../../org/apache/hadoop/hbase/HBaseTestingUtil.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtil</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/coprocessor/example/TestZooKeeperScanPolicyObserver.html#line.53">UTIL</a></pre>
+<pre>private static final <a href="../../../../../../org/apache/hadoop/hbase/HBaseTestingUtil.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtil</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/coprocessor/example/TestZooKeeperScanPolicyObserver.html#line.54">UTIL</a></pre>
</li>
</ul>
<a name="NAME">
@@ -263,7 +263,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
<ul class="blockList">
<li class="blockList">
<h4>NAME</h4>
-<pre>private static org.apache.hadoop.hbase.TableName <a href="../../../../../../src-html/org/apache/hadoop/hbase/coprocessor/example/TestZooKeeperScanPolicyObserver.html#line.55">NAME</a></pre>
+<pre>private static org.apache.hadoop.hbase.TableName <a href="../../../../../../src-html/org/apache/hadoop/hbase/coprocessor/example/TestZooKeeperScanPolicyObserver.html#line.56">NAME</a></pre>
</li>
</ul>
<a name="FAMILY">
@@ -272,7 +272,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
<ul class="blockList">
<li class="blockList">
<h4>FAMILY</h4>
-<pre>private static byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/coprocessor/example/TestZooKeeperScanPolicyObserver.html#line.57">FAMILY</a></pre>
+<pre>private static byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/coprocessor/example/TestZooKeeperScanPolicyObserver.html#line.58">FAMILY</a></pre>
</li>
</ul>
<a name="QUALIFIER">
@@ -281,7 +281,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
<ul class="blockList">
<li class="blockList">
<h4>QUALIFIER</h4>
-<pre>private static byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/coprocessor/example/TestZooKeeperScanPolicyObserver.html#line.59">QUALIFIER</a></pre>
+<pre>private static byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/coprocessor/example/TestZooKeeperScanPolicyObserver.html#line.60">QUALIFIER</a></pre>
</li>
</ul>
<a name="TABLE">
@@ -290,7 +290,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
<ul class="blockListLast">
<li class="blockList">
<h4>TABLE</h4>
-<pre>private static org.apache.hadoop.hbase.client.Table <a href="../../../../../../src-html/org/apache/hadoop/hbase/coprocessor/example/TestZooKeeperScanPolicyObserver.html#line.61">TABLE</a></pre>
+<pre>private static org.apache.hadoop.hbase.client.Table <a href="../../../../../../src-html/org/apache/hadoop/hbase/coprocessor/example/TestZooKeeperScanPolicyObserver.html#line.62">TABLE</a></pre>
</li>
</ul>
</li>
@@ -307,7 +307,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
<ul class="blockListLast">
<li class="blockList">
<h4>TestZooKeeperScanPolicyObserver</h4>
-<pre>public <a href="../../../../../../src-html/org/apache/hadoop/hbase/coprocessor/example/TestZooKeeperScanPolicyObserver.html#line.47">TestZooKeeperScanPolicyObserver</a>()</pre>
+<pre>public <a href="../../../../../../src-html/org/apache/hadoop/hbase/coprocessor/example/TestZooKeeperScanPolicyObserver.html#line.48">TestZooKeeperScanPolicyObserver</a>()</pre>
</li>
</ul>
</li>
@@ -324,7 +324,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
<ul class="blockList">
<li class="blockList">
<h4>setUp</h4>
-<pre>public static void <a href="../../../../../../src-html/org/apache/hadoop/hbase/coprocessor/example/TestZooKeeperScanPolicyObserver.html#line.64">setUp</a>()
+<pre>public static void <a href="../../../../../../src-html/org/apache/hadoop/hbase/coprocessor/example/TestZooKeeperScanPolicyObserver.html#line.65">setUp</a>()
throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
<dl>
<dt><span class="throwsLabel">Throws:</span></dt>
@@ -338,7 +338,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
<ul class="blockList">
<li class="blockList">
<h4>tearDown</h4>
-<pre>public static void <a href="../../../../../../src-html/org/apache/hadoop/hbase/coprocessor/example/TestZooKeeperScanPolicyObserver.html#line.77">tearDown</a>()
+<pre>public static void <a href="../../../../../../src-html/org/apache/hadoop/hbase/coprocessor/example/TestZooKeeperScanPolicyObserver.html#line.78">tearDown</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>
@@ -352,7 +352,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
<ul class="blockList">
<li class="blockList">
<h4>setExpireBefore</h4>
-<pre>private void <a href="../../../../../../src-html/org/apache/hadoop/hbase/coprocessor/example/TestZooKeeperScanPolicyObserver.html#line.84">setExpireBefore</a>(long time)
+<pre>private void <a href="../../../../../../src-html/org/apache/hadoop/hbase/coprocessor/example/TestZooKeeperScanPolicyObserver.html#line.85">setExpireBefore</a>(long time)
throws org.apache.zookeeper.KeeperException,
<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a>,
<a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -370,7 +370,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
<ul class="blockList">
<li class="blockList">
<h4>assertValueEquals</h4>
-<pre>private void <a href="../../../../../../src-html/org/apache/hadoop/hbase/coprocessor/example/TestZooKeeperScanPolicyObserver.html#line.95">assertValueEquals</a>(int start,
+<pre>private void <a href="../../../../../../src-html/org/apache/hadoop/hbase/coprocessor/example/TestZooKeeperScanPolicyObserver.html#line.101">assertValueEquals</a>(int start,
int end)
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>
@@ -385,7 +385,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
<ul class="blockList">
<li class="blockList">
<h4>assertNotExists</h4>
-<pre>private void <a href="../../../../../../src-html/org/apache/hadoop/hbase/coprocessor/example/TestZooKeeperScanPolicyObserver.html#line.102">assertNotExists</a>(int start,
+<pre>private void <a href="../../../../../../src-html/org/apache/hadoop/hbase/coprocessor/example/TestZooKeeperScanPolicyObserver.html#line.108">assertNotExists</a>(int start,
int end)
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>
@@ -400,7 +400,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
<ul class="blockList">
<li class="blockList">
<h4>put</h4>
-<pre>private void <a href="../../../../../../src-html/org/apache/hadoop/hbase/coprocessor/example/TestZooKeeperScanPolicyObserver.html#line.108">put</a>(int start,
+<pre>private void <a href="../../../../../../src-html/org/apache/hadoop/hbase/coprocessor/example/TestZooKeeperScanPolicyObserver.html#line.114">put</a>(int start,
int end,
long ts)
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>
@@ -416,7 +416,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
<ul class="blockListLast">
<li class="blockList">
<h4>test</h4>
-<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/coprocessor/example/TestZooKeeperScanPolicyObserver.html#line.115">test</a>()
+<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/coprocessor/example/TestZooKeeperScanPolicyObserver.html#line.121">test</a>()
throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
org.apache.zookeeper.KeeperException,
<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>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
index 08ca08a1034..c147dffa10b 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
@@ -691,20 +691,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><E> (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><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
<ul>
-<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/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/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/HBaseClusterManager.Signal.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HBaseClusterManager.Signal</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/RESTApiClusterManager.HealthSummary.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">RESTApiClusterManager.HealthSummary</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/RESTApiClusterManager.RoleState.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">RESTApiClusterManager.RoleState</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/ZNodeClusterManager.CmdType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ZNodeClusterManager.CmdType</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/TestCustomPriorityRpcControllerFactory.State.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">TestCustomPriorityRpcControllerFactory.State</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/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/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/ZNodeClusterManager.CmdType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ZNodeClusterManager.CmdType</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/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/RESTApiClusterManager.RoleState.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">RESTApiClusterManager.RoleState</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/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>
</ul>
</li>
</ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
index b3d048d048f..db3e868b0db 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
@@ -248,10 +248,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><E> (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><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
<ul>
-<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestYieldProcedures.TestStateMachineProcedure.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestYieldProcedures.TestStateMachineProcedure.State</span></a></li>
<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineState.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestProcedureBypass.StuckStateMachineState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureRecovery.TestStateMachineProcedure.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestProcedureRecovery.TestStateMachineProcedure.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestYieldProcedures.TestStateMachineProcedure.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestYieldProcedures.TestStateMachineProcedure.State</span></a></li>
<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestStateMachineProcedure.TestSMProcedureState.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestStateMachineProcedure.TestSMProcedureState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureRecovery.TestStateMachineProcedure.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestProcedureRecovery.TestStateMachineProcedure.State</span></a></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 a6ae5da0e90..ccfd63d6cad 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestTags.TestCoprocessorForTags.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestTags.TestCoprocessorForTags.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
</dl>
<hr>
<br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestTags.html#line.619">TestTags.TestCoprocessorForTags</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestTags.html#line.633">TestTags.TestCoprocessorForTags</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>
@@ -289,7 +289,7 @@ implements org.apache.hadoop.hbase.coprocessor.RegionCoprocessor, org.apache.had
<ul class="blockList">
<li class="blockList">
<h4>checkTagPresence</h4>
-<pre>public static volatile boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestTags.TestCoprocessorForTags.html#line.621">checkTagPresence</a></pre>
+<pre>public static volatile boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestTags.TestCoprocessorForTags.html#line.635">checkTagPresence</a></pre>
</li>
</ul>
<a name="tags">
@@ -298,7 +298,7 @@ implements org.apache.hadoop.hbase.coprocessor.RegionCoprocessor, org.apache.had
<ul class="blockListLast">
<li class="blockList">
<h4>tags</h4>
-<pre>public static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a><org.apache.hadoop.hbase.Tag> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestTags.TestCoprocessorForTags.html#line.622">tags</a></pre>
+<pre>public static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a><org.apache.hadoop.hbase.Tag> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestTags.TestCoprocessorForTags.html#line.636">tags</a></pre>
</li>
</ul>
</li>
@@ -315,7 +315,7 @@ implements org.apache.hadoop.hbase.coprocessor.RegionCoprocessor, org.apache.had
<ul class="blockListLast">
<li class="blockList">
<h4>TestCoprocessorForTags</h4>
-<pre>public <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestTags.TestCoprocessorForTags.html#line.619">TestCoprocessorForTags</a>()</pre>
+<pre>public <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestTags.TestCoprocessorForTags.html#line.633">TestCoprocessorForTags</a>()</pre>
</li>
</ul>
</li>
@@ -332,7 +332,7 @@ implements org.apache.hadoop.hbase.coprocessor.RegionCoprocessor, org.apache.had
<ul class="blockList">
<li class="blockList">
<h4>getRegionObserver</h4>
-<pre>public <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><org.apache.hadoop.hbase.coprocessor.RegionObserver> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestTags.TestCoprocessorForTags.html#line.625">getRegionObserver</a>()</pre>
+<pre>public <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><org.apache.hadoop.hbase.coprocessor.RegionObserver> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestTags.TestCoprocessorForTags.html#line.639">getRegionObserver</a>()</pre>
<dl>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code>getRegionObserver</code> in interface <code>org.apache.hadoop.hbase.coprocessor.RegionCoprocessor</code></dd>
@@ -345,7 +345,7 @@ implements org.apache.hadoop.hbase.coprocessor.RegionCoprocessor, org.apache.had
<ul class="blockList">
<li class="blockList">
<h4>prePut</h4>
-<pre>public void <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestTags.TestCoprocessorForTags.html#line.630">prePut</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext<org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> e,
+<pre>public void <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestTags.TestCoprocessorForTags.html#line.644">prePut</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext<org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> e,
org.apache.hadoop.hbase.client.Put put,
org.apache.hadoop.hbase.wal.WALEdit edit,
org.apache.hadoop.hbase.client.Durability durability)
@@ -364,7 +364,7 @@ implements org.apache.hadoop.hbase.coprocessor.RegionCoprocessor, org.apache.had
<ul class="blockList">
<li class="blockList">
<h4>updateMutationAddingTags</h4>
-<pre>private void <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestTags.TestCoprocessorForTags.html#line.635">updateMutationAddingTags</a>(org.apache.hadoop.hbase.client.Mutation m)</pre>
+<pre>private void <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestTags.TestCoprocessorForTags.html#line.649">updateMutationAddingTags</a>(org.apache.hadoop.hbase.client.Mutation m)</pre>
</li>
</ul>
<a name="preIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">
@@ -373,7 +373,7 @@ implements org.apache.hadoop.hbase.coprocessor.RegionCoprocessor, org.apache.had
<ul class="blockList">
<li class="blockList">
<h4>preIncrement</h4>
-<pre>public org.apache.hadoop.hbase.client.Result <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestTags.TestCoprocessorForTags.html#line.665">preIncrement</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext<org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> e,
+<pre>public org.apache.hadoop.hbase.client.Result <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestTags.TestCoprocessorForTags.html#line.679">preIncrement</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext<org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> e,
org.apache.hadoop.hbase.client.Increment 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>
@@ -390,7 +390,7 @@ implements org.apache.hadoop.hbase.coprocessor.RegionCoprocessor, org.apache.had
<ul class="blockList">
<li class="blockList">
<h4>preAppend</h4>
-<pre>public org.apache.hadoop.hbase.client.Result <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestTags.TestCoprocessorForTags.html#line.672">preAppend</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext<org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> e,
+<pre>public org.apache.hadoop.hbase.client.Result <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestTags.TestCoprocessorForTags.html#line.686">preAppend</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext<org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> e,
org.apache.hadoop.hbase.client.Append 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>
@@ -407,7 +407,7 @@ implements org.apache.hadoop.hbase.coprocessor.RegionCoprocessor, org.apache.had
<ul class="blockListLast">
<li class="blockList">
<h4>postScannerNext</h4>
-<pre>public boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestTags.TestCoprocessorForTags.html#line.679">postScannerNext</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext<org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> e,
+<pre>public boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestTags.TestCoprocessorForTags.html#line.693">postScannerNext</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext<org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> e,
org.apache.hadoop.hbase.regionserver.InternalScanner 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><org.apache.hadoop.hbase.client.Result> results,
int limit,
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestTags.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestTags.html
index c691bb56c71..a40db49b184 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestTags.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestTags.html
@@ -18,7 +18,7 @@
catch(err) {
}
//-->
-var methods = {"i0":10,"i1":9,"i2":10,"i3":9,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10};
+var methods = {"i0":10,"i1":9,"i2":10,"i3":9,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":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";
@@ -241,16 +241,24 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
</tr>
<tr id="i7" class="rowColor">
<td class="colFirst"><code>private void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestTags.html#testReverseScanWithDBE-org.apache.hadoop.hbase.client.Connection-org.apache.hadoop.hbase.io.encoding.DataBlockEncoding-byte:A-">testReverseScanWithDBE</a></span>(org.apache.hadoop.hbase.client.Connection conn,
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestTags.html#testReverseScanWithDBE-org.apache.hadoop.hbase.client.Connection-org.apache.hadoop.hbase.io.encoding.DataBlockEncoding-byte:A-int-int-">testReverseScanWithDBE</a></span>(org.apache.hadoop.hbase.client.Connection conn,
org.apache.hadoop.hbase.io.encoding.DataBlockEncoding encoding,
- byte[] family)</code> </td>
+ byte[] family,
+ int blockSize,
+ int maxRows)</code> </td>
</tr>
<tr id="i8" class="altColor">
<td class="colFirst"><code>void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestTags.html#testTags--">testTags</a></span>()</code> </td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestTags.html#testReverseScanWithDBEWhenCurrentBlockUpdates--">testReverseScanWithDBEWhenCurrentBlockUpdates</a></span>()</code>
+<div class="block">Test that we can do reverse scans when writing tags and using DataBlockEncoding.</div>
+</td>
</tr>
<tr id="i9" class="rowColor">
<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestTags.html#testTags--">testTags</a></span>()</code> </td>
+</tr>
+<tr id="i10" class="altColor">
+<td class="colFirst"><code>void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestTags.html#testTagsWithAppendAndIncrement--">testTagsWithAppendAndIncrement</a></span>()</code> </td>
</tr>
</table>
@@ -398,15 +406,33 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
</dl>
</li>
</ul>
-<a name="testReverseScanWithDBE-org.apache.hadoop.hbase.client.Connection-org.apache.hadoop.hbase.io.encoding.DataBlockEncoding-byte:A-">
+<a name="testReverseScanWithDBEWhenCurrentBlockUpdates--">
+<!-- -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>testReverseScanWithDBEWhenCurrentBlockUpdates</h4>
+<pre>public void <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestTags.html#line.137">testReverseScanWithDBEWhenCurrentBlockUpdates</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 can do reverse scans when writing tags and using DataBlockEncoding. Fails with an
+ exception for PREFIX, DIFF, and FAST_DIFF</div>
+<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="testReverseScanWithDBE-org.apache.hadoop.hbase.client.Connection-org.apache.hadoop.hbase.io.encoding.DataBlockEncoding-byte:A-int-int-">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>testReverseScanWithDBE</h4>
-<pre>private void <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestTags.html#line.132">testReverseScanWithDBE</a>(org.apache.hadoop.hbase.client.Connection conn,
+<pre>private void <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestTags.html#line.150">testReverseScanWithDBE</a>(org.apache.hadoop.hbase.client.Connection conn,
org.apache.hadoop.hbase.io.encoding.DataBlockEncoding encoding,
- byte[] family)
+ byte[] family,
+ int blockSize,
+ int maxRows)
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>
@@ -420,7 +446,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
<ul class="blockList">
<li class="blockList">
<h4>testTags</h4>
-<pre>public void <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestTags.html#line.180">testTags</a>()
+<pre>public void <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestTags.html#line.194">testTags</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>
@@ -434,7 +460,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
<ul class="blockList">
<li class="blockList">
<h4>testFlushAndCompactionWithoutTags</h4>
-<pre>public void <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestTags.html#line.245">testFlushAndCompactionWithoutTags</a>()
+<pre>public void <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestTags.html#line.259">testFlushAndCompactionWithoutTags</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>
@@ -448,7 +474,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
<ul class="blockList">
<li class="blockList">
<h4>testFlushAndCompactionwithCombinations</h4>
-<pre>public void <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestTags.html#line.333">testFlushAndCompactionwithCombinations</a>()
+<pre>public void <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestTags.html#line.347">testFlushAndCompactionwithCombinations</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>
@@ -462,7 +488,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
<ul class="blockList">
<li class="blockList">
<h4>testTagsWithAppendAndIncrement</h4>
-<pre>public void <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestTags.html#line.453">testTagsWithAppendAndIncrement</a>()
+<pre>public void <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestTags.html#line.467">testTagsWithAppendAndIncrement</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>
@@ -476,7 +502,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
<ul class="blockListLast">
<li class="blockList">
<h4>result</h4>
-<pre>private void <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestTags.html#line.589">result</a>(byte[] fam,
+<pre>private void <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestTags.html#line.603">result</a>(byte[] fam,
byte[] row,
byte[] qual,
byte[] row2,
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
index 6014c468dc4..0ea2e3543da 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -784,12 +784,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><E> (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><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
<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/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/TestCompactionState.StateSource.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestCompactionState.StateSource</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/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/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/DataBlockEncodingTool.Manipulation.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">DataBlockEncodingTool.Manipulation</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestMultiLogThreshold.ActionType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestMultiLogThreshold.ActionType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestAtomicOperation.TestStep</span></a></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 b9e0e305d26..7caa69b1752 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
@@ -260,11 +260,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><E> (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><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
<ul>
-<li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Generator.GeneratorCounts.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestBigLinkedList.Generator.GeneratorCounts</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/IntegrationTestLoadCommonCrawl.Counts.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestLoadCommonCrawl.Counts</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Generator.GeneratorCounts.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestBigLinkedList.Generator.GeneratorCounts</span></a></li>
<li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Verify.VerifyCounts.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestBigLinkedList.Verify.VerifyCounts</span></a></li>
<li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestLoadAndVerify.Counters.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestLoadAndVerify.Counters</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestWithCellVisibilityLoadAndVerify.Counters.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestWithCellVisibilityLoadAndVerify.Counters</span></a></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 e28c3ca3673..7a9f3c2ca03 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
@@ -210,8 +210,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><E> (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><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
<ul>
<li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">IOTestProvider.AllowedOperations</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/TestWALSplit.Corruptions.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">TestWALSplit.Corruptions</span></a></li>
<li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/FaultyFSLog.FailureType.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">FaultyFSLog.FailureType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/TestWALSplit.Corruptions.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">TestWALSplit.Corruptions</span></a></li>
</ul>
</li>
</ul>
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/coprocessor/example/TestZooKeeperScanPolicyObserver.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/coprocessor/example/TestZooKeeperScanPolicyObserver.html
index f101a9bdf65..c34019929fe 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/coprocessor/example/TestZooKeeperScanPolicyObserver.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/coprocessor/example/TestZooKeeperScanPolicyObserver.html
@@ -41,110 +41,116 @@
<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.33"></a>
<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.34"></a>
<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.zookeeper.CreateMode;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.zookeeper.KeeperException;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.zookeeper.ZooDefs;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.zookeeper.ZooKeeper;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.junit.AfterClass;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.junit.BeforeClass;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.junit.ClassRule;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.junit.Test;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.junit.experimental.categories.Category;<a name="line.44"></a>
-<span class="sourceLineNo">045</span><a name="line.45"></a>
-<span class="sourceLineNo">046</span>@Category({ CoprocessorTests.class, MediumTests.class })<a name="line.46"></a>
-<span class="sourceLineNo">047</span>public class TestZooKeeperScanPolicyObserver {<a name="line.47"></a>
-<span class="sourceLineNo">048</span><a name="line.48"></a>
-<span class="sourceLineNo">049</span> @ClassRule<a name="line.49"></a>
-<span class="sourceLineNo">050</span> public static final HBaseClassTestRule CLASS_RULE =<a name="line.50"></a>
-<span class="sourceLineNo">051</span> HBaseClassTestRule.forClass(TestZooKeeperScanPolicyObserver.class);<a name="line.51"></a>
-<span class="sourceLineNo">052</span><a name="line.52"></a>
-<span class="sourceLineNo">053</span> private static final HBaseTestingUtil UTIL = new HBaseTestingUtil();<a name="line.53"></a>
-<span class="sourceLineNo">054</span><a name="line.54"></a>
-<span class="sourceLineNo">055</span> private static TableName NAME = TableName.valueOf("TestCP");<a name="line.55"></a>
-<span class="sourceLineNo">056</span><a name="line.56"></a>
-<span class="sourceLineNo">057</span> private static byte[] FAMILY = Bytes.toBytes("cf");<a name="line.57"></a>
-<span class="sourceLineNo">058</span><a name="line.58"></a>
-<span class="sourceLineNo">059</span> private static byte[] QUALIFIER = Bytes.toBytes("cq");<a name="line.59"></a>
-<span class="sourceLineNo">060</span><a name="line.60"></a>
-<span class="sourceLineNo">061</span> private static Table TABLE;<a name="line.61"></a>
-<span class="sourceLineNo">062</span><a name="line.62"></a>
-<span class="sourceLineNo">063</span> @BeforeClass<a name="line.63"></a>
-<span class="sourceLineNo">064</span> public static void setUp() throws Exception {<a name="line.64"></a>
-<span class="sourceLineNo">065</span> UTIL.startMiniCluster(3);<a name="line.65"></a>
-<span class="sourceLineNo">066</span> UTIL.getAdmin()<a name="line.66"></a>
-<span class="sourceLineNo">067</span> .createTable(TableDescriptorBuilder.newBuilder(NAME)<a name="line.67"></a>
-<span class="sourceLineNo">068</span> .setCoprocessor(ZooKeeperScanPolicyObserver.class.getName())<a name="line.68"></a>
-<span class="sourceLineNo">069</span> .setValue(ZooKeeperScanPolicyObserver.ZK_ENSEMBLE_KEY,<a name="line.69"></a>
-<span class="sourceLineNo">070</span> UTIL.getZkCluster().getAddress().toString())<a name="line.70"></a>
-<span class="sourceLineNo">071</span> .setValue(ZooKeeperScanPolicyObserver.ZK_SESSION_TIMEOUT_KEY, "2000")<a name="line.71"></a>
-<span class="sourceLineNo">072</span> .setColumnFamily(ColumnFamilyDescriptorBuilder.newBuilder(FAMILY).build()).build());<a name="line.72"></a>
-<span class="sourceLineNo">073</span> TABLE = UTIL.getConnection().getTable(NAME);<a name="line.73"></a>
-<span class="sourceLineNo">074</span> }<a name="line.74"></a>
-<span class="sourceLineNo">075</span><a name="line.75"></a>
-<span class="sourceLineNo">076</span> @AfterClass<a name="line.76"></a>
-<span class="sourceLineNo">077</span> public static void tearDown() throws Exception {<a name="line.77"></a>
-<span class="sourceLineNo">078</span> if (TABLE != null) {<a name="line.78"></a>
-<span class="sourceLineNo">079</span> TABLE.close();<a name="line.79"></a>
-<span class="sourceLineNo">080</span> }<a name="line.80"></a>
-<span class="sourceLineNo">081</span> UTIL.shutdownMiniCluster();<a name="line.81"></a>
-<span class="sourceLineNo">082</span> }<a name="line.82"></a>
-<span class="sourceLineNo">083</span><a name="line.83"></a>
-<span class="sourceLineNo">084</span> private void setExpireBefore(long time)<a name="line.84"></a>
-<span class="sourceLineNo">085</span> throws KeeperException, InterruptedException, IOException {<a name="line.85"></a>
-<span class="sourceLineNo">086</span> ZooKeeper zk = UTIL.getZooKeeperWatcher().getRecoverableZooKeeper().getZooKeeper();<a name="line.86"></a>
-<span class="sourceLineNo">087</span> if (zk.exists(ZooKeeperScanPolicyObserver.NODE, false) == null) {<a name="line.87"></a>
-<span class="sourceLineNo">088</span> zk.create(ZooKeeperScanPolicyObserver.NODE, Bytes.toBytes(time), ZooDefs.Ids.OPEN_ACL_UNSAFE,<a name="line.88"></a>
-<span class="sourceLineNo">089</span> CreateMode.PERSISTENT);<a name="line.89"></a>
-<span class="sourceLineNo">090</span> } else {<a name="line.90"></a>
-<span class="sourceLineNo">091</span> zk.setData(ZooKeeperScanPolicyObserver.NODE, Bytes.toBytes(time), -1);<a name="line.91"></a>
-<span class="sourceLineNo">092</span> }<a name="line.92"></a>
-<span class="sourceLineNo">093</span> }<a name="line.93"></a>
-<span class="sourceLineNo">094</span><a name="line.94"></a>
-<span class="sourceLineNo">095</span> private void assertValueEquals(int start, int end) throws IOException {<a name="line.95"></a>
-<span class="sourceLineNo">096</span> for (int i = start; i < end; i++) {<a name="line.96"></a>
-<span class="sourceLineNo">097</span> assertEquals(i,<a name="line.97"></a>
-<span class="sourceLineNo">098</span> Bytes.toInt(TABLE.get(new Get(Bytes.toBytes(i))).getValue(FAMILY, QUALIFIER)));<a name="line.98"></a>
-<span class="sourceLineNo">099</span> }<a name="line.99"></a>
-<span class="sourceLineNo">100</span> }<a name="line.100"></a>
-<span class="sourceLineNo">101</span><a name="line.101"></a>
-<span class="sourceLineNo">102</span> private void assertNotExists(int start, int end) throws IOException {<a name="line.102"></a>
-<span class="sourceLineNo">103</span> for (int i = start; i < end; i++) {<a name="line.103"></a>
-<span class="sourceLineNo">104</span> assertFalse(TABLE.exists(new Get(Bytes.toBytes(i))));<a name="line.104"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.zookeeper.RecoverableZooKeeper;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.zookeeper.CreateMode;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.zookeeper.KeeperException;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.zookeeper.ZooDefs;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.zookeeper.ZooKeeper;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.junit.AfterClass;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.junit.BeforeClass;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.junit.ClassRule;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.junit.Test;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.junit.experimental.categories.Category;<a name="line.45"></a>
+<span class="sourceLineNo">046</span><a name="line.46"></a>
+<span class="sourceLineNo">047</span>@Category({ CoprocessorTests.class, MediumTests.class })<a name="line.47"></a>
+<span class="sourceLineNo">048</span>public class TestZooKeeperScanPolicyObserver {<a name="line.48"></a>
+<span class="sourceLineNo">049</span><a name="line.49"></a>
+<span class="sourceLineNo">050</span> @ClassRule<a name="line.50"></a>
+<span class="sourceLineNo">051</span> public static final HBaseClassTestRule CLASS_RULE =<a name="line.51"></a>
+<span class="sourceLineNo">052</span> HBaseClassTestRule.forClass(TestZooKeeperScanPolicyObserver.class);<a name="line.52"></a>
+<span class="sourceLineNo">053</span><a name="line.53"></a>
+<span class="sourceLineNo">054</span> private static final HBaseTestingUtil UTIL = new HBaseTestingUtil();<a name="line.54"></a>
+<span class="sourceLineNo">055</span><a name="line.55"></a>
+<span class="sourceLineNo">056</span> private static TableName NAME = TableName.valueOf("TestCP");<a name="line.56"></a>
+<span class="sourceLineNo">057</span><a name="line.57"></a>
+<span class="sourceLineNo">058</span> private static byte[] FAMILY = Bytes.toBytes("cf");<a name="line.58"></a>
+<span class="sourceLineNo">059</span><a name="line.59"></a>
+<span class="sourceLineNo">060</span> private static byte[] QUALIFIER = Bytes.toBytes("cq");<a name="line.60"></a>
+<span class="sourceLineNo">061</span><a name="line.61"></a>
+<span class="sourceLineNo">062</span> private static Table TABLE;<a name="line.62"></a>
+<span class="sourceLineNo">063</span><a name="line.63"></a>
+<span class="sourceLineNo">064</span> @BeforeClass<a name="line.64"></a>
+<span class="sourceLineNo">065</span> public static void setUp() throws Exception {<a name="line.65"></a>
+<span class="sourceLineNo">066</span> UTIL.startMiniCluster(3);<a name="line.66"></a>
+<span class="sourceLineNo">067</span> UTIL.getAdmin()<a name="line.67"></a>
+<span class="sourceLineNo">068</span> .createTable(TableDescriptorBuilder.newBuilder(NAME)<a name="line.68"></a>
+<span class="sourceLineNo">069</span> .setCoprocessor(ZooKeeperScanPolicyObserver.class.getName())<a name="line.69"></a>
+<span class="sourceLineNo">070</span> .setValue(ZooKeeperScanPolicyObserver.ZK_ENSEMBLE_KEY,<a name="line.70"></a>
+<span class="sourceLineNo">071</span> UTIL.getZkCluster().getAddress().toString())<a name="line.71"></a>
+<span class="sourceLineNo">072</span> .setValue(ZooKeeperScanPolicyObserver.ZK_SESSION_TIMEOUT_KEY, "2000")<a name="line.72"></a>
+<span class="sourceLineNo">073</span> .setColumnFamily(ColumnFamilyDescriptorBuilder.newBuilder(FAMILY).build()).build());<a name="line.73"></a>
+<span class="sourceLineNo">074</span> TABLE = UTIL.getConnection().getTable(NAME);<a name="line.74"></a>
+<span class="sourceLineNo">075</span> }<a name="line.75"></a>
+<span class="sourceLineNo">076</span><a name="line.76"></a>
+<span class="sourceLineNo">077</span> @AfterClass<a name="line.77"></a>
+<span class="sourceLineNo">078</span> public static void tearDown() throws Exception {<a name="line.78"></a>
+<span class="sourceLineNo">079</span> if (TABLE != null) {<a name="line.79"></a>
+<span class="sourceLineNo">080</span> TABLE.close();<a name="line.80"></a>
+<span class="sourceLineNo">081</span> }<a name="line.81"></a>
+<span class="sourceLineNo">082</span> UTIL.shutdownMiniCluster();<a name="line.82"></a>
+<span class="sourceLineNo">083</span> }<a name="line.83"></a>
+<span class="sourceLineNo">084</span><a name="line.84"></a>
+<span class="sourceLineNo">085</span> private void setExpireBefore(long time)<a name="line.85"></a>
+<span class="sourceLineNo">086</span> throws KeeperException, InterruptedException, IOException {<a name="line.86"></a>
+<span class="sourceLineNo">087</span> RecoverableZooKeeper recoverableZk = UTIL.getZooKeeperWatcher().getRecoverableZooKeeper();<a name="line.87"></a>
+<span class="sourceLineNo">088</span> // we need to call this for setting up the zookeeper connection<a name="line.88"></a>
+<span class="sourceLineNo">089</span> recoverableZk.reconnectAfterExpiration();<a name="line.89"></a>
+<span class="sourceLineNo">090</span> // we have to use the original ZooKeeper as the RecoverableZooKeeper will append a magic prefix<a name="line.90"></a>
+<span class="sourceLineNo">091</span> // for the data stored on zookeeper<a name="line.91"></a>
+<span class="sourceLineNo">092</span> ZooKeeper zk = recoverableZk.getZooKeeper();<a name="line.92"></a>
+<span class="sourceLineNo">093</span> if (zk.exists(ZooKeeperScanPolicyObserver.NODE, false) == null) {<a name="line.93"></a>
+<span class="sourceLineNo">094</span> zk.create(ZooKeeperScanPolicyObserver.NODE, Bytes.toBytes(time), ZooDefs.Ids.OPEN_ACL_UNSAFE,<a name="line.94"></a>
+<span class="sourceLineNo">095</span> CreateMode.PERSISTENT);<a name="line.95"></a>
+<span class="sourceLineNo">096</span> } else {<a name="line.96"></a>
+<span class="sourceLineNo">097</span> zk.setData(ZooKeeperScanPolicyObserver.NODE, Bytes.toBytes(time), -1);<a name="line.97"></a>
+<span class="sourceLineNo">098</span> }<a name="line.98"></a>
+<span class="sourceLineNo">099</span> }<a name="line.99"></a>
+<span class="sourceLineNo">100</span><a name="line.100"></a>
+<span class="sourceLineNo">101</span> private void assertValueEquals(int start, int end) throws IOException {<a name="line.101"></a>
+<span class="sourceLineNo">102</span> for (int i = start; i < end; i++) {<a name="line.102"></a>
+<span class="sourceLineNo">103</span> assertEquals(i,<a name="line.103"></a>
+<span class="sourceLineNo">104</span> Bytes.toInt(TABLE.get(new Get(Bytes.toBytes(i))).getValue(FAMILY, QUALIFIER)));<a name="line.104"></a>
<span class="sourceLineNo">105</span> }<a name="line.105"></a>
<span class="sourceLineNo">106</span> }<a name="line.106"></a>
<span class="sourceLineNo">107</span><a name="line.107"></a>
-<span class="sourceLineNo">108</span> private void put(int start, int end, long ts) throws IOException {<a name="line.108"></a>
+<span class="sourceLineNo">108</span> private void assertNotExists(int start, int end) throws IOException {<a name="line.108"></a>
<span class="sourceLineNo">109</span> for (int i = start; i < end; i++) {<a name="line.109"></a>
-<span class="sourceLineNo">110</span> TABLE.put(new Put(Bytes.toBytes(i)).addColumn(FAMILY, QUALIFIER, ts, Bytes.toBytes(i)));<a name="line.110"></a>
+<span class="sourceLineNo">110</span> assertFalse(TABLE.exists(new Get(Bytes.toBytes(i))));<a name="line.110"></a>
<span class="sourceLineNo">111</span> }<a name="line.111"></a>
<span class="sourceLineNo">112</span> }<a name="line.112"></a>
<span class="sourceLineNo">113</span><a name="line.113"></a>
-<span class="sourceLineNo">114</span> @Test<a name="line.114"></a>
-<span class="sourceLineNo">115</span> public void test() throws IOException, KeeperException, InterruptedException {<a name="line.115"></a>
-<span class="sourceLineNo">116</span> long now = EnvironmentEdgeManager.currentTime();<a name="line.116"></a>
-<span class="sourceLineNo">117</span> put(0, 100, now - 10000);<a name="line.117"></a>
-<span class="sourceLineNo">118</span> assertValueEquals(0, 100);<a name="line.118"></a>
+<span class="sourceLineNo">114</span> private void put(int start, int end, long ts) throws IOException {<a name="line.114"></a>
+<span class="sourceLineNo">115</span> for (int i = start; i < end; i++) {<a name="line.115"></a>
+<span class="sourceLineNo">116</span> TABLE.put(new Put(Bytes.toBytes(i)).addColumn(FAMILY, QUALIFIER, ts, Bytes.toBytes(i)));<a name="line.116"></a>
+<span class="sourceLineNo">117</span> }<a name="line.117"></a>
+<span class="sourceLineNo">118</span> }<a name="line.118"></a>
<span class="sourceLineNo">119</span><a name="line.119"></a>
-<span class="sourceLineNo">120</span> setExpireBefore(now - 5000);<a name="line.120"></a>
-<span class="sourceLineNo">121</span> Thread.sleep(5000);<a name="line.121"></a>
-<span class="sourceLineNo">122</span> UTIL.getAdmin().flush(NAME);<a name="line.122"></a>
-<span class="sourceLineNo">123</span> assertNotExists(0, 100);<a name="line.123"></a>
-<span class="sourceLineNo">124</span><a name="line.124"></a>
-<span class="sourceLineNo">125</span> put(0, 50, now - 1000);<a name="line.125"></a>
-<span class="sourceLineNo">126</span> UTIL.getAdmin().flush(NAME);<a name="line.126"></a>
-<span class="sourceLineNo">127</span> put(50, 100, now - 100);<a name="line.127"></a>
+<span class="sourceLineNo">120</span> @Test<a name="line.120"></a>
+<span class="sourceLineNo">121</span> public void test() throws IOException, KeeperException, InterruptedException {<a name="line.121"></a>
+<span class="sourceLineNo">122</span> long now = EnvironmentEdgeManager.currentTime();<a name="line.122"></a>
+<span class="sourceLineNo">123</span> put(0, 100, now - 10000);<a name="line.123"></a>
+<span class="sourceLineNo">124</span> assertValueEquals(0, 100);<a name="line.124"></a>
+<span class="sourceLineNo">125</span><a name="line.125"></a>
+<span class="sourceLineNo">126</span> setExpireBefore(now - 5000);<a name="line.126"></a>
+<span class="sourceLineNo">127</span> Thread.sleep(5000);<a name="line.127"></a>
<span class="sourceLineNo">128</span> UTIL.getAdmin().flush(NAME);<a name="line.128"></a>
-<span class="sourceLineNo">129</span> assertValueEquals(0, 100);<a name="line.129"></a>
+<span class="sourceLineNo">129</span> assertNotExists(0, 100);<a name="line.129"></a>
<span class="sourceLineNo">130</span><a name="line.130"></a>
-<span class="sourceLineNo">131</span> setExpireBefore(now - 500);<a name="line.131"></a>
-<span class="sourceLineNo">132</span> Thread.sleep(5000);<a name="line.132"></a>
-<span class="sourceLineNo">133</span> UTIL.getAdmin().majorCompact(NAME);<a name="line.133"></a>
-<span class="sourceLineNo">134</span> UTIL.waitFor(30000, () -> UTIL.getHBaseCluster().getRegions(NAME).iterator().next()<a name="line.134"></a>
-<span class="sourceLineNo">135</span> .getStore(FAMILY).getStorefilesCount() == 1);<a name="line.135"></a>
-<span class="sourceLineNo">136</span> assertNotExists(0, 50);<a name="line.136"></a>
-<span class="sourceLineNo">137</span> assertValueEquals(50, 100);<a name="line.137"></a>
-<span class="sourceLineNo">138</span> }<a name="line.138"></a>
-<span class="sourceLineNo">139</span>}<a name="line.139"></a>
+<span class="sourceLineNo">131</span> put(0, 50, now - 1000);<a name="line.131"></a>
+<span class="sourceLineNo">132</span> UTIL.getAdmin().flush(NAME);<a name="line.132"></a>
+<span class="sourceLineNo">133</span> put(50, 100, now - 100);<a name="line.133"></a>
+<span class="sourceLineNo">134</span> UTIL.getAdmin().flush(NAME);<a name="line.134"></a>
+<span class="sourceLineNo">135</span> assertValueEquals(0, 100);<a name="line.135"></a>
+<span class="sourceLineNo">136</span><a name="line.136"></a>
+<span class="sourceLineNo">137</span> setExpireBefore(now - 500);<a name="line.137"></a>
+<span class="sourceLineNo">138</span> Thread.sleep(5000);<a name="line.138"></a>
+<span class="sourceLineNo">139</span> UTIL.getAdmin().majorCompact(NAME);<a name="line.139"></a>
+<span class="sourceLineNo">140</span> UTIL.waitFor(30000, () -> UTIL.getHBaseCluster().getRegions(NAME).iterator().next()<a name="line.140"></a>
+<span class="sourceLineNo">141</span> .getStore(FAMILY).getStorefilesCount() == 1);<a name="line.141"></a>
+<span class="sourceLineNo">142</span> assertNotExists(0, 50);<a name="line.142"></a>
+<span class="sourceLineNo">143</span> assertValueEquals(50, 100);<a name="line.143"></a>
+<span class="sourceLineNo">144</span> }<a name="line.144"></a>
+<span class="sourceLineNo">145</span>}<a name="line.145"></a>
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CPMasterObserver.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CPMasterObserver.html
index b53467a0085..716d9ef03af 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CPMasterObserver.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CPMasterObserver.html
@@ -45,21 +45,21 @@
<span class="sourceLineNo">037</span>import org.apache.hadoop.fs.Path;<a name="line.37"></a>
<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.Coprocessor;<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.HBaseClassTestRule;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.HBaseTestingUtil;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.HConstants;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.NamespaceDescriptor;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.SingleProcessHBaseCluster;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.StartTestingClusterOption;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.TableName;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.Waiter;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.client.Admin;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.client.CompactionState;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.DoNotRetryRegionException;<a name="line.54"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.DoNotRetryIOException;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.HBaseTestingUtil;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.HConstants;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.NamespaceDescriptor;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.SingleProcessHBaseCluster;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.StartTestingClusterOption;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.TableName;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.Waiter;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.client.Admin;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.CompactionState;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.54"></a>
<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.55"></a>
<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.RegionLocator;<a name="line.56"></a>
<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.Table;<a name="line.57"></a>
@@ -415,7 +415,7 @@
<span class="sourceLineNo">407</span> try {<a name="line.407"></a>
<span class="sourceLineNo">408</span> ADMIN.split(tableTwo, Bytes.toBytes("6"));<a name="line.408"></a>
<span class="sourceLineNo">409</span> fail();<a name="line.409"></a>
-<span class="sourceLineNo">410</span> } catch (DoNotRetryRegionException e) {<a name="line.410"></a>
+<span class="sourceLineNo">410</span> } catch (DoNotRetryIOException e) {<a name="line.410"></a>
<span class="sourceLineNo">411</span> // Expected<a name="line.411"></a>
<span class="sourceLineNo">412</span> }<a name="line.412"></a>
<span class="sourceLineNo">413</span> Thread.sleep(2000);<a name="line.413"></a>
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CPRegionServerObserver.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CPRegionServerObserver.html
index b53467a0085..716d9ef03af 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CPRegionServerObserver.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CPRegionServerObserver.html
@@ -45,21 +45,21 @@
<span class="sourceLineNo">037</span>import org.apache.hadoop.fs.Path;<a name="line.37"></a>
<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.Coprocessor;<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.HBaseClassTestRule;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.HBaseTestingUtil;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.HConstants;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.NamespaceDescriptor;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.SingleProcessHBaseCluster;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.StartTestingClusterOption;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.TableName;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.Waiter;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.client.Admin;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.client.CompactionState;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.DoNotRetryRegionException;<a name="line.54"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.DoNotRetryIOException;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.HBaseTestingUtil;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.HConstants;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.NamespaceDescriptor;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.SingleProcessHBaseCluster;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.StartTestingClusterOption;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.TableName;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.Waiter;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.client.Admin;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.CompactionState;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.54"></a>
<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.55"></a>
<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.RegionLocator;<a name="line.56"></a>
<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.Table;<a name="line.57"></a>
@@ -415,7 +415,7 @@
<span class="sourceLineNo">407</span> try {<a name="line.407"></a>
<span class="sourceLineNo">408</span> ADMIN.split(tableTwo, Bytes.toBytes("6"));<a name="line.408"></a>
<span class="sourceLineNo">409</span> fail();<a name="line.409"></a>
-<span class="sourceLineNo">410</span> } catch (DoNotRetryRegionException e) {<a name="line.410"></a>
+<span class="sourceLineNo">410</span> } catch (DoNotRetryIOException e) {<a name="line.410"></a>
<span class="sourceLineNo">411</span> // Expected<a name="line.411"></a>
<span class="sourceLineNo">412</span> }<a name="line.412"></a>
<span class="sourceLineNo">413</span> Thread.sleep(2000);<a name="line.413"></a>
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CustomObserver.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CustomObserver.html
index b53467a0085..716d9ef03af 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CustomObserver.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CustomObserver.html
@@ -45,21 +45,21 @@
<span class="sourceLineNo">037</span>import org.apache.hadoop.fs.Path;<a name="line.37"></a>
<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.Coprocessor;<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.HBaseClassTestRule;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.HBaseTestingUtil;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.HConstants;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.NamespaceDescriptor;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.SingleProcessHBaseCluster;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.StartTestingClusterOption;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.TableName;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.Waiter;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.client.Admin;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.client.CompactionState;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.DoNotRetryRegionException;<a name="line.54"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.DoNotRetryIOException;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.HBaseTestingUtil;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.HConstants;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.NamespaceDescriptor;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.SingleProcessHBaseCluster;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.StartTestingClusterOption;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.TableName;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.Waiter;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.client.Admin;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.CompactionState;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.54"></a>
<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.55"></a>
<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.RegionLocator;<a name="line.56"></a>
<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.Table;<a name="line.57"></a>
@@ -415,7 +415,7 @@
<span class="sourceLineNo">407</span> try {<a name="line.407"></a>
<span class="sourceLineNo">408</span> ADMIN.split(tableTwo, Bytes.toBytes("6"));<a name="line.408"></a>
<span class="sourceLineNo">409</span> fail();<a name="line.409"></a>
-<span class="sourceLineNo">410</span> } catch (DoNotRetryRegionException e) {<a name="line.410"></a>
+<span class="sourceLineNo">410</span> } catch (DoNotRetryIOException e) {<a name="line.410"></a>
<span class="sourceLineNo">411</span> // Expected<a name="line.411"></a>
<span class="sourceLineNo">412</span> }<a name="line.412"></a>
<span class="sourceLineNo">413</span> Thread.sleep(2000);<a name="line.413"></a>
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.MasterSyncObserver.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.MasterSyncObserver.html
index b53467a0085..716d9ef03af 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.MasterSyncObserver.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.MasterSyncObserver.html
@@ -45,21 +45,21 @@
<span class="sourceLineNo">037</span>import org.apache.hadoop.fs.Path;<a name="line.37"></a>
<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.Coprocessor;<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.HBaseClassTestRule;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.HBaseTestingUtil;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.HConstants;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.NamespaceDescriptor;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.SingleProcessHBaseCluster;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.StartTestingClusterOption;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.TableName;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.Waiter;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.client.Admin;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.client.CompactionState;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.DoNotRetryRegionException;<a name="line.54"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.DoNotRetryIOException;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.HBaseTestingUtil;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.HConstants;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.NamespaceDescriptor;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.SingleProcessHBaseCluster;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.StartTestingClusterOption;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.TableName;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.Waiter;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.client.Admin;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.CompactionState;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.54"></a>
<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.55"></a>
<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.RegionLocator;<a name="line.56"></a>
<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.Table;<a name="line.57"></a>
@@ -415,7 +415,7 @@
<span class="sourceLineNo">407</span> try {<a name="line.407"></a>
<span class="sourceLineNo">408</span> ADMIN.split(tableTwo, Bytes.toBytes("6"));<a name="line.408"></a>
<span class="sourceLineNo">409</span> fail();<a name="line.409"></a>
-<span class="sourceLineNo">410</span> } catch (DoNotRetryRegionException e) {<a name="line.410"></a>
+<span class="sourceLineNo">410</span> } catch (DoNotRetryIOException e) {<a name="line.410"></a>
<span class="sourceLineNo">411</span> // Expected<a name="line.411"></a>
<span class="sourceLineNo">412</span> }<a name="line.412"></a>
<span class="sourceLineNo">413</span> Thread.sleep(2000);<a name="line.413"></a>
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html
index b53467a0085..716d9ef03af 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html
@@ -45,21 +45,21 @@
<span class="sourceLineNo">037</span>import org.apache.hadoop.fs.Path;<a name="line.37"></a>
<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.Coprocessor;<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.HBaseClassTestRule;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.HBaseTestingUtil;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.HConstants;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.NamespaceDescriptor;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.SingleProcessHBaseCluster;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.StartTestingClusterOption;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.TableName;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.Waiter;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.client.Admin;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.client.CompactionState;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.DoNotRetryRegionException;<a name="line.54"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.DoNotRetryIOException;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.HBaseTestingUtil;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.HConstants;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.NamespaceDescriptor;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.SingleProcessHBaseCluster;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.StartTestingClusterOption;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.TableName;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.Waiter;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.client.Admin;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.CompactionState;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.54"></a>
<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.55"></a>
<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.RegionLocator;<a name="line.56"></a>
<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.Table;<a name="line.57"></a>
@@ -415,7 +415,7 @@
<span class="sourceLineNo">407</span> try {<a name="line.407"></a>
<span class="sourceLineNo">408</span> ADMIN.split(tableTwo, Bytes.toBytes("6"));<a name="line.408"></a>
<span class="sourceLineNo">409</span> fail();<a name="line.409"></a>
-<span class="sourceLineNo">410</span> } catch (DoNotRetryRegionException e) {<a name="line.410"></a>
+<span class="sourceLineNo">410</span> } catch (DoNotRetryIOException e) {<a name="line.410"></a>
<span class="sourceLineNo">411</span> // Expected<a name="line.411"></a>
<span class="sourceLineNo">412</span> }<a name="line.412"></a>
<span class="sourceLineNo">413</span> Thread.sleep(2000);<a name="line.413"></a>
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestTags.TestCoprocessorForTags.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestTags.TestCoprocessorForTags.html
index 685ff579058..e92fcf93cb4 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestTags.TestCoprocessorForTags.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestTags.TestCoprocessorForTags.html
@@ -132,575 +132,589 @@
<span class="sourceLineNo">124</span><a name="line.124"></a>
<span class="sourceLineNo">125</span> try (Connection connection = ConnectionFactory.createConnection(conf)) {<a name="line.125"></a>
<span class="sourceLineNo">126</span> for (DataBlockEncoding encoding : DataBlockEncoding.values()) {<a name="line.126"></a>
-<span class="sourceLineNo">127</span> testReverseScanWithDBE(connection, encoding, family);<a name="line.127"></a>
+<span class="sourceLineNo">127</span> testReverseScanWithDBE(connection, encoding, family, HConstants.DEFAULT_BLOCKSIZE, 10);<a name="line.127"></a>
<span class="sourceLineNo">128</span> }<a name="line.128"></a>
<span class="sourceLineNo">129</span> }<a name="line.129"></a>
<span class="sourceLineNo">130</span> }<a name="line.130"></a>
<span class="sourceLineNo">131</span><a name="line.131"></a>
-<span class="sourceLineNo">132</span> private void testReverseScanWithDBE(Connection conn, DataBlockEncoding encoding, byte[] family)<a name="line.132"></a>
-<span class="sourceLineNo">133</span> throws IOException {<a name="line.133"></a>
-<span class="sourceLineNo">134</span> LOG.info("Running test with DBE={}", encoding);<a name="line.134"></a>
-<span class="sourceLineNo">135</span> TableName tableName = TableName.valueOf(TEST_NAME.getMethodName() + "-" + encoding);<a name="line.135"></a>
-<span class="sourceLineNo">136</span> TEST_UTIL.createTable(TableDescriptorBuilder.newBuilder(tableName)<a name="line.136"></a>
-<span class="sourceLineNo">137</span> .setColumnFamily(<a name="line.137"></a>
-<span class="sourceLineNo">138</span> ColumnFamilyDescriptorBuilder.newBuilder(family).setDataBlockEncoding(encoding).build())<a name="line.138"></a>
-<span class="sourceLineNo">139</span> .build(), null);<a name="line.139"></a>
-<span class="sourceLineNo">140</span><a name="line.140"></a>
-<span class="sourceLineNo">141</span> Table table = conn.getTable(tableName);<a name="line.141"></a>
+<span class="sourceLineNo">132</span> /**<a name="line.132"></a>
+<span class="sourceLineNo">133</span> * Test that we can do reverse scans when writing tags and using DataBlockEncoding. Fails with an<a name="line.133"></a>
+<span class="sourceLineNo">134</span> * exception for PREFIX, DIFF, and FAST_DIFF<a name="line.134"></a>
+<span class="sourceLineNo">135</span> */<a name="line.135"></a>
+<span class="sourceLineNo">136</span> @Test<a name="line.136"></a>
+<span class="sourceLineNo">137</span> public void testReverseScanWithDBEWhenCurrentBlockUpdates() throws IOException {<a name="line.137"></a>
+<span class="sourceLineNo">138</span> byte[] family = Bytes.toBytes("0");<a name="line.138"></a>
+<span class="sourceLineNo">139</span><a name="line.139"></a>
+<span class="sourceLineNo">140</span> Configuration conf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.140"></a>
+<span class="sourceLineNo">141</span> conf.setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, 1);<a name="line.141"></a>
<span class="sourceLineNo">142</span><a name="line.142"></a>
-<span class="sourceLineNo">143</span> int maxRows = 10;<a name="line.143"></a>
-<span class="sourceLineNo">144</span> byte[] val1 = new byte[10];<a name="line.144"></a>
-<span class="sourceLineNo">145</span> byte[] val2 = new byte[10];<a name="line.145"></a>
-<span class="sourceLineNo">146</span> Bytes.random(val1);<a name="line.146"></a>
-<span class="sourceLineNo">147</span> Bytes.random(val2);<a name="line.147"></a>
-<span class="sourceLineNo">148</span><a name="line.148"></a>
-<span class="sourceLineNo">149</span> for (int i = 0; i < maxRows; i++) {<a name="line.149"></a>
-<span class="sourceLineNo">150</span> if (i == maxRows / 2) {<a name="line.150"></a>
-<span class="sourceLineNo">151</span> TEST_UTIL.flush(tableName);<a name="line.151"></a>
-<span class="sourceLineNo">152</span> }<a name="line.152"></a>
-<span class="sourceLineNo">153</span> table.put(new Put(Bytes.toBytes(i)).addColumn(family, Bytes.toBytes(1), val1)<a name="line.153"></a>
-<span class="sourceLineNo">154</span> .addColumn(family, Bytes.toBytes(2), val2).setTTL(600_000));<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> TEST_UTIL.flush(table.getName());<a name="line.157"></a>
+<span class="sourceLineNo">143</span> try (Connection connection = ConnectionFactory.createConnection(conf)) {<a name="line.143"></a>
+<span class="sourceLineNo">144</span> for (DataBlockEncoding encoding : DataBlockEncoding.values()) {<a name="line.144"></a>
+<span class="sourceLineNo">145</span> testReverseScanWithDBE(connection, encoding, family, 1024, 30000);<a name="line.145"></a>
+<span class="sourceLineNo">146</span> }<a name="line.146"></a>
+<span class="sourceLineNo">147</span> }<a name="line.147"></a>
+<span class="sourceLineNo">148</span> }<a name="line.148"></a>
+<span class="sourceLineNo">149</span><a name="line.149"></a>
+<span class="sourceLineNo">150</span> private void testReverseScanWithDBE(Connection conn, DataBlockEncoding encoding, byte[] family,<a name="line.150"></a>
+<span class="sourceLineNo">151</span> int blockSize, int maxRows) throws IOException {<a name="line.151"></a>
+<span class="sourceLineNo">152</span> LOG.info("Running test with DBE={}", encoding);<a name="line.152"></a>
+<span class="sourceLineNo">153</span> TableName tableName = TableName.valueOf(TEST_NAME.getMethodName() + "-" + encoding);<a name="line.153"></a>
+<span class="sourceLineNo">154</span> TEST_UTIL.createTable(<a name="line.154"></a>
+<span class="sourceLineNo">155</span> TableDescriptorBuilder.newBuilder(tableName).setColumnFamily(ColumnFamilyDescriptorBuilder<a name="line.155"></a>
+<span class="sourceLineNo">156</span> .newBuilder(family).setDataBlockEncoding(encoding).setBlocksize(blockSize).build()).build(),<a name="line.156"></a>
+<span class="sourceLineNo">157</span> null);<a name="line.157"></a>
<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span> Scan scan = new Scan();<a name="line.159"></a>
-<span class="sourceLineNo">160</span> scan.setReversed(true);<a name="line.160"></a>
-<span class="sourceLineNo">161</span><a name="line.161"></a>
-<span class="sourceLineNo">162</span> try (ResultScanner scanner = table.getScanner(scan)) {<a name="line.162"></a>
-<span class="sourceLineNo">163</span> for (int i = maxRows - 1; i >= 0; i--) {<a name="line.163"></a>
-<span class="sourceLineNo">164</span> Result row = scanner.next();<a name="line.164"></a>
-<span class="sourceLineNo">165</span> assertEquals(2, row.size());<a name="line.165"></a>
-<span class="sourceLineNo">166</span><a name="line.166"></a>
-<span class="sourceLineNo">167</span> Cell cell1 = row.getColumnLatestCell(family, Bytes.toBytes(1));<a name="line.167"></a>
-<span class="sourceLineNo">168</span> assertTrue(CellUtil.matchingRows(cell1, Bytes.toBytes(i)));<a name="line.168"></a>
-<span class="sourceLineNo">169</span> assertTrue(CellUtil.matchingValue(cell1, val1));<a name="line.169"></a>
+<span class="sourceLineNo">159</span> Table table = conn.getTable(tableName);<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span> byte[] val1 = new byte[10];<a name="line.161"></a>
+<span class="sourceLineNo">162</span> byte[] val2 = new byte[10];<a name="line.162"></a>
+<span class="sourceLineNo">163</span> Bytes.random(val1);<a name="line.163"></a>
+<span class="sourceLineNo">164</span> Bytes.random(val2);<a name="line.164"></a>
+<span class="sourceLineNo">165</span><a name="line.165"></a>
+<span class="sourceLineNo">166</span> for (int i = 0; i < maxRows; i++) {<a name="line.166"></a>
+<span class="sourceLineNo">167</span> table.put(new Put(Bytes.toBytes(i)).addColumn(family, Bytes.toBytes(1), val1)<a name="line.167"></a>
+<span class="sourceLineNo">168</span> .addColumn(family, Bytes.toBytes(2), val2).setTTL(600_000));<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> Cell cell2 = row.getColumnLatestCell(family, Bytes.toBytes(2));<a name="line.171"></a>
-<span class="sourceLineNo">172</span> assertTrue(CellUtil.matchingRows(cell2, Bytes.toBytes(i)));<a name="line.172"></a>
-<span class="sourceLineNo">173</span> assertTrue(CellUtil.matchingValue(cell2, val2));<a name="line.173"></a>
-<span class="sourceLineNo">174</span> }<a name="line.174"></a>
-<span class="sourceLineNo">175</span> }<a name="line.175"></a>
-<span class="sourceLineNo">176</span><a name="line.176"></a>
-<span class="sourceLineNo">177</span> }<a name="line.177"></a>
-<span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span> @Test<a name="line.179"></a>
-<span class="sourceLineNo">180</span> public void testTags() throws Exception {<a name="line.180"></a>
-<span class="sourceLineNo">181</span> Table table = null;<a name="line.181"></a>
-<span class="sourceLineNo">182</span> try {<a name="line.182"></a>
-<span class="sourceLineNo">183</span> TableName tableName = TableName.valueOf(TEST_NAME.getMethodName());<a name="line.183"></a>
-<span class="sourceLineNo">184</span> byte[] fam = Bytes.toBytes("info");<a name="line.184"></a>
-<span class="sourceLineNo">185</span> byte[] row = Bytes.toBytes("rowa");<a name="line.185"></a>
-<span class="sourceLineNo">186</span> // column names<a name="line.186"></a>
-<span class="sourceLineNo">187</span> byte[] qual = Bytes.toBytes("qual");<a name="line.187"></a>
-<span class="sourceLineNo">188</span><a name="line.188"></a>
-<span class="sourceLineNo">189</span> byte[] row1 = Bytes.toBytes("rowb");<a name="line.189"></a>
+<span class="sourceLineNo">171</span> TEST_UTIL.flush(table.getName());<a name="line.171"></a>
+<span class="sourceLineNo">172</span><a name="line.172"></a>
+<span class="sourceLineNo">173</span> Scan scan = new Scan();<a name="line.173"></a>
+<span class="sourceLineNo">174</span> scan.setReversed(true);<a name="line.174"></a>
+<span class="sourceLineNo">175</span><a name="line.175"></a>
+<span class="sourceLineNo">176</span> try (ResultScanner scanner = table.getScanner(scan)) {<a name="line.176"></a>
+<span class="sourceLineNo">177</span> for (int i = maxRows - 1; i >= 0; i--) {<a name="line.177"></a>
+<span class="sourceLineNo">178</span> Result row = scanner.next();<a name="line.178"></a>
+<span class="sourceLineNo">179</span> assertEquals(2, row.size());<a name="line.179"></a>
+<span class="sourceLineNo">180</span><a name="line.180"></a>
+<span class="sourceLineNo">181</span> Cell cell1 = row.getColumnLatestCell(family, Bytes.toBytes(1));<a name="line.181"></a>
+<span class="sourceLineNo">182</span> assertTrue(CellUtil.matchingRows(cell1, Bytes.toBytes(i)));<a name="line.182"></a>
+<span class="sourceLineNo">183</span> assertTrue(CellUtil.matchingValue(cell1, val1));<a name="line.183"></a>
+<span class="sourceLineNo">184</span><a name="line.184"></a>
+<span class="sourceLineNo">185</span> Cell cell2 = row.getColumnLatestCell(family, Bytes.toBytes(2));<a name="line.185"></a>
+<span class="sourceLineNo">186</span> assertTrue(CellUtil.matchingRows(cell2, Bytes.toBytes(i)));<a name="line.186"></a>
+<span class="sourceLineNo">187</span> assertTrue(CellUtil.matchingValue(cell2, val2));<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> byte[] row2 = Bytes.toBytes("rowc");<a name="line.191"></a>
+<span class="sourceLineNo">191</span> }<a name="line.191"></a>
<span class="sourceLineNo">192</span><a name="line.192"></a>
-<span class="sourceLineNo">193</span> TableDescriptor tableDescriptor =<a name="line.193"></a>
-<span class="sourceLineNo">194</span> TableDescriptorBuilder<a name="line.194"></a>
-<span class="sourceLineNo">195</span> .newBuilder(tableName).setColumnFamily(ColumnFamilyDescriptorBuilder.newBuilder(fam)<a name="line.195"></a>
-<span class="sourceLineNo">196</span> .setBlockCacheEnabled(true).setDataBlockEncoding(DataBlockEncoding.NONE).build())<a name="line.196"></a>
-<span class="sourceLineNo">197</span> .build();<a name="line.197"></a>
-<span class="sourceLineNo">198</span> Admin admin = TEST_UTIL.getAdmin();<a name="line.198"></a>
-<span class="sourceLineNo">199</span> admin.createTable(tableDescriptor);<a name="line.199"></a>
-<span class="sourceLineNo">200</span> byte[] value = Bytes.toBytes("value");<a name="line.200"></a>
-<span class="sourceLineNo">201</span> table = TEST_UTIL.getConnection().getTable(tableName);<a name="line.201"></a>
-<span class="sourceLineNo">202</span> Put put = new Put(row);<a name="line.202"></a>
-<span class="sourceLineNo">203</span> put.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, value);<a name="line.203"></a>
-<span class="sourceLineNo">204</span> put.setAttribute("visibility", Bytes.toBytes("myTag"));<a name="line.204"></a>
-<span class="sourceLineNo">205</span> table.put(put);<a name="line.205"></a>
-<span class="sourceLineNo">206</span> admin.flush(tableName);<a name="line.206"></a>
-<span class="sourceLineNo">207</span> // We are lacking an API for confirming flush request compaction.<a name="line.207"></a>
-<span class="sourceLineNo">208</span> // Just sleep for a short time. We won't be able to confirm flush<a name="line.208"></a>
-<span class="sourceLineNo">209</span> // completion but the test won't hang now or in the future if<a name="line.209"></a>
-<span class="sourceLineNo">210</span> // default compaction policy causes compaction between flush and<a name="line.210"></a>
-<span class="sourceLineNo">211</span> // when we go to confirm it.<a name="line.211"></a>
-<span class="sourceLineNo">212</span> Thread.sleep(1000);<a name="line.212"></a>
-<span class="sourceLineNo">213</span><a name="line.213"></a>
-<span class="sourceLineNo">214</span> Put put1 = new Put(row1);<a name="line.214"></a>
-<span class="sourceLineNo">215</span> byte[] value1 = Bytes.toBytes("1000dfsdf");<a name="line.215"></a>
-<span class="sourceLineNo">216</span> put1.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, value1);<a name="line.216"></a>
-<span class="sourceLineNo">217</span> // put1.setAttribute("visibility", Bytes.toBytes("myTag3"));<a name="line.217"></a>
-<span class="sourceLineNo">218</span> table.put(put1);<a name="line.218"></a>
-<span class="sourceLineNo">219</span> admin.flush(tableName);<a name="line.219"></a>
-<span class="sourceLineNo">220</span> Thread.sleep(1000);<a name="line.220"></a>
-<span class="sourceLineNo">221</span><a name="line.221"></a>
-<span class="sourceLineNo">222</span> Put put2 = new Put(row2);<a name="line.222"></a>
-<span class="sourceLineNo">223</span> byte[] value2 = Bytes.toBytes("1000dfsdf");<a name="line.223"></a>
-<span class="sourceLineNo">224</span> put2.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, value2);<a name="line.224"></a>
-<span class="sourceLineNo">225</span> put2.setAttribute("visibility", Bytes.toBytes("myTag3"));<a name="line.225"></a>
-<span class="sourceLineNo">226</span> table.put(put2);<a name="line.226"></a>
-<span class="sourceLineNo">227</span> admin.flush(tableName);<a name="line.227"></a>
-<span class="sourceLineNo">228</span> Thread.sleep(1000);<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span> result(fam, row, qual, row2, table, value, value2, row1, value1);<a name="line.230"></a>
-<span class="sourceLineNo">231</span><a name="line.231"></a>
-<span class="sourceLineNo">232</span> admin.compact(tableName);<a name="line.232"></a>
-<span class="sourceLineNo">233</span> while (admin.getCompactionState(tableName) != CompactionState.NONE) {<a name="line.233"></a>
-<span class="sourceLineNo">234</span> Thread.sleep(10);<a name="line.234"></a>
-<span class="sourceLineNo">235</span> }<a name="line.235"></a>
-<span class="sourceLineNo">236</span> result(fam, row, qual, row2, table, value, value2, row1, value1);<a name="line.236"></a>
-<span class="sourceLineNo">237</span> } finally {<a name="line.237"></a>
-<span class="sourceLineNo">238</span> if (table != null) {<a name="line.238"></a>
-<span class="sourceLineNo">239</span> table.close();<a name="line.239"></a>
-<span class="sourceLineNo">240</span> }<a name="line.240"></a>
-<span class="sourceLineNo">241</span> }<a name="line.241"></a>
-<span class="sourceLineNo">242</span> }<a name="line.242"></a>
+<span class="sourceLineNo">193</span> @Test<a name="line.193"></a>
+<span class="sourceLineNo">194</span> public void testTags() throws Exception {<a name="line.194"></a>
+<span class="sourceLineNo">195</span> Table table = null;<a name="line.195"></a>
+<span class="sourceLineNo">196</span> try {<a name="line.196"></a>
+<span class="sourceLineNo">197</span> TableName tableName = TableName.valueOf(TEST_NAME.getMethodName());<a name="line.197"></a>
+<span class="sourceLineNo">198</span> byte[] fam = Bytes.toBytes("info");<a name="line.198"></a>
+<span class="sourceLineNo">199</span> byte[] row = Bytes.toBytes("rowa");<a name="line.199"></a>
+<span class="sourceLineNo">200</span> // column names<a name="line.200"></a>
+<span class="sourceLineNo">201</span> byte[] qual = Bytes.toBytes("qual");<a name="line.201"></a>
+<span class="sourceLineNo">202</span><a name="line.202"></a>
+<span class="sourceLineNo">203</span> byte[] row1 = Bytes.toBytes("rowb");<a name="line.203"></a>
+<span class="sourceLineNo">204</span><a name="line.204"></a>
+<span class="sourceLineNo">205</span> byte[] row2 = Bytes.toBytes("rowc");<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span> TableDescriptor tableDescriptor =<a name="line.207"></a>
+<span class="sourceLineNo">208</span> TableDescriptorBuilder<a name="line.208"></a>
+<span class="sourceLineNo">209</span> .newBuilder(tableName).setColumnFamily(ColumnFamilyDescriptorBuilder.newBuilder(fam)<a name="line.209"></a>
+<span class="sourceLineNo">210</span> .setBlockCacheEnabled(true).setDataBlockEncoding(DataBlockEncoding.NONE).build())<a name="line.210"></a>
+<span class="sourceLineNo">211</span> .build();<a name="line.211"></a>
+<span class="sourceLineNo">212</span> Admin admin = TEST_UTIL.getAdmin();<a name="line.212"></a>
+<span class="sourceLineNo">213</span> admin.createTable(tableDescriptor);<a name="line.213"></a>
+<span class="sourceLineNo">214</span> byte[] value = Bytes.toBytes("value");<a name="line.214"></a>
+<span class="sourceLineNo">215</span> table = TEST_UTIL.getConnection().getTable(tableName);<a name="line.215"></a>
+<span class="sourceLineNo">216</span> Put put = new Put(row);<a name="line.216"></a>
+<span class="sourceLineNo">217</span> put.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, value);<a name="line.217"></a>
+<span class="sourceLineNo">218</span> put.setAttribute("visibility", Bytes.toBytes("myTag"));<a name="line.218"></a>
+<span class="sourceLineNo">219</span> table.put(put);<a name="line.219"></a>
+<span class="sourceLineNo">220</span> admin.flush(tableName);<a name="line.220"></a>
+<span class="sourceLineNo">221</span> // We are lacking an API for confirming flush request compaction.<a name="line.221"></a>
+<span class="sourceLineNo">222</span> // Just sleep for a short time. We won't be able to confirm flush<a name="line.222"></a>
+<span class="sourceLineNo">223</span> // completion but the test won't hang now or in the future if<a name="line.223"></a>
+<span class="sourceLineNo">224</span> // default compaction policy causes compaction between flush and<a name="line.224"></a>
+<span class="sourceLineNo">225</span> // when we go to confirm it.<a name="line.225"></a>
+<span class="sourceLineNo">226</span> Thread.sleep(1000);<a name="line.226"></a>
+<span class="sourceLineNo">227</span><a name="line.227"></a>
+<span class="sourceLineNo">228</span> Put put1 = new Put(row1);<a name="line.228"></a>
+<span class="sourceLineNo">229</span> byte[] value1 = Bytes.toBytes("1000dfsdf");<a name="line.229"></a>
+<span class="sourceLineNo">230</span> put1.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, value1);<a name="line.230"></a>
+<span class="sourceLineNo">231</span> // put1.setAttribute("visibility", Bytes.toBytes("myTag3"));<a name="line.231"></a>
+<span class="sourceLineNo">232</span> table.put(put1);<a name="line.232"></a>
+<span class="sourceLineNo">233</span> admin.flush(tableName);<a name="line.233"></a>
+<span class="sourceLineNo">234</span> Thread.sleep(1000);<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span> Put put2 = new Put(row2);<a name="line.236"></a>
+<span class="sourceLineNo">237</span> byte[] value2 = Bytes.toBytes("1000dfsdf");<a name="line.237"></a>
+<span class="sourceLineNo">238</span> put2.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, value2);<a name="line.238"></a>
+<span class="sourceLineNo">239</span> put2.setAttribute("visibility", Bytes.toBytes("myTag3"));<a name="line.239"></a>
+<span class="sourceLineNo">240</span> table.put(put2);<a name="line.240"></a>
+<span class="sourceLineNo">241</span> admin.flush(tableName);<a name="line.241"></a>
+<span class="sourceLineNo">242</span> Thread.sleep(1000);<a name="line.242"></a>
<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span> @Test<a name="line.244"></a>
-<span class="sourceLineNo">245</span> public void testFlushAndCompactionWithoutTags() throws Exception {<a name="line.245"></a>
-<span class="sourceLineNo">246</span> Table table = null;<a name="line.246"></a>
-<span class="sourceLineNo">247</span> try {<a name="line.247"></a>
-<span class="sourceLineNo">248</span> TableName tableName = TableName.valueOf(TEST_NAME.getMethodName());<a name="line.248"></a>
-<span class="sourceLineNo">249</span> byte[] fam = Bytes.toBytes("info");<a name="line.249"></a>
-<span class="sourceLineNo">250</span> byte[] row = Bytes.toBytes("rowa");<a name="line.250"></a>
-<span class="sourceLineNo">251</span> // column names<a name="line.251"></a>
-<span class="sourceLineNo">252</span> byte[] qual = Bytes.toBytes("qual");<a name="line.252"></a>
-<span class="sourceLineNo">253</span><a name="line.253"></a>
-<span class="sourceLineNo">254</span> byte[] row1 = Bytes.toBytes("rowb");<a name="line.254"></a>
-<span class="sourceLineNo">255</span><a name="line.255"></a>
-<span class="sourceLineNo">256</span> byte[] row2 = Bytes.toBytes("rowc");<a name="line.256"></a>
+<span class="sourceLineNo">244</span> result(fam, row, qual, row2, table, value, value2, row1, value1);<a name="line.244"></a>
+<span class="sourceLineNo">245</span><a name="line.245"></a>
+<span class="sourceLineNo">246</span> admin.compact(tableName);<a name="line.246"></a>
+<span class="sourceLineNo">247</span> while (admin.getCompactionState(tableName) != CompactionState.NONE) {<a name="line.247"></a>
+<span class="sourceLineNo">248</span> Thread.sleep(10);<a name="line.248"></a>
+<span class="sourceLineNo">249</span> }<a name="line.249"></a>
+<span class="sourceLineNo">250</span> result(fam, row, qual, row2, table, value, value2, row1, value1);<a name="line.250"></a>
+<span class="sourceLineNo">251</span> } finally {<a name="line.251"></a>
+<span class="sourceLineNo">252</span> if (table != null) {<a name="line.252"></a>
+<span class="sourceLineNo">253</span> table.close();<a name="line.253"></a>
+<span class="sourceLineNo">254</span> }<a name="line.254"></a>
+<span class="sourceLineNo">255</span> }<a name="line.255"></a>
+<span class="sourceLineNo">256</span> }<a name="line.256"></a>
<span class="sourceLineNo">257</span><a name="line.257"></a>
-<span class="sourceLineNo">258</span> TableDescriptor tableDescriptor =<a name="line.258"></a>
-<span class="sourceLineNo">259</span> TableDescriptorBuilder.newBuilder(tableName)<a name="line.259"></a>
-<span class="sourceLineNo">260</span> .setColumnFamily(<a name="line.260"></a>
-<span class="sourceLineNo">261</span> ColumnFamilyDescriptorBuilder.newBuilder(fam).setBlockCacheEnabled(true).build())<a name="line.261"></a>
-<span class="sourceLineNo">262</span> .build();<a name="line.262"></a>
-<span class="sourceLineNo">263</span> Admin admin = TEST_UTIL.getAdmin();<a name="line.263"></a>
-<span class="sourceLineNo">264</span> admin.createTable(tableDescriptor);<a name="line.264"></a>
-<span class="sourceLineNo">265</span><a name="line.265"></a>
-<span class="sourceLineNo">266</span> table = TEST_UTIL.getConnection().getTable(tableName);<a name="line.266"></a>
-<span class="sourceLineNo">267</span> Put put = new Put(row);<a name="line.267"></a>
-<span class="sourceLineNo">268</span> byte[] value = Bytes.toBytes("value");<a name="line.268"></a>
-<span class="sourceLineNo">269</span> put.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, value);<a name="line.269"></a>
-<span class="sourceLineNo">270</span> table.put(put);<a name="line.270"></a>
-<span class="sourceLineNo">271</span> admin.flush(tableName);<a name="line.271"></a>
-<span class="sourceLineNo">272</span> // We are lacking an API for confirming flush request compaction.<a name="line.272"></a>
-<span class="sourceLineNo">273</span> // Just sleep for a short time. We won't be able to confirm flush<a name="line.273"></a>
-<span class="sourceLineNo">274</span> // completion but the test won't hang now or in the future if<a name="line.274"></a>
-<span class="sourceLineNo">275</span> // default compaction policy causes compaction between flush and<a name="line.275"></a>
-<span class="sourceLineNo">276</span> // when we go to confirm it.<a name="line.276"></a>
-<span class="sourceLineNo">277</span> Thread.sleep(1000);<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span> Put put1 = new Put(row1);<a name="line.279"></a>
-<span class="sourceLineNo">280</span> byte[] value1 = Bytes.toBytes("1000dfsdf");<a name="line.280"></a>
-<span class="sourceLineNo">281</span> put1.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, value1);<a name="line.281"></a>
-<span class="sourceLineNo">282</span> table.put(put1);<a name="line.282"></a>
-<span class="sourceLineNo">283</span> admin.flush(tableName);<a name="line.283"></a>
-<span class="sourceLineNo">284</span> Thread.sleep(1000);<a name="line.284"></a>
-<span class="sourceLineNo">285</span><a name="line.285"></a>
-<span class="sourceLineNo">286</span> Put put2 = new Put(row2);<a name="line.286"></a>
-<span class="sourceLineNo">287</span> byte[] value2 = Bytes.toBytes("1000dfsdf");<a name="line.287"></a>
-<span class="sourceLineNo">288</span> put2.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, value2);<a name="line.288"></a>
-<span class="sourceLineNo">289</span> table.put(put2);<a name="line.289"></a>
-<span class="sourceLineNo">290</span> admin.flush(tableName);<a name="line.290"></a>
+<span class="sourceLineNo">258</span> @Test<a name="line.258"></a>
+<span class="sourceLineNo">259</span> public void testFlushAndCompactionWithoutTags() throws Exception {<a name="line.259"></a>
+<span class="sourceLineNo">260</span> Table table = null;<a name="line.260"></a>
+<span class="sourceLineNo">261</span> try {<a name="line.261"></a>
+<span class="sourceLineNo">262</span> TableName tableName = TableName.valueOf(TEST_NAME.getMethodName());<a name="line.262"></a>
+<span class="sourceLineNo">263</span> byte[] fam = Bytes.toBytes("info");<a name="line.263"></a>
+<span class="sourceLineNo">264</span> byte[] row = Bytes.toBytes("rowa");<a name="line.264"></a>
+<span class="sourceLineNo">265</span> // column names<a name="line.265"></a>
+<span class="sourceLineNo">266</span> byte[] qual = Bytes.toBytes("qual");<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span> byte[] row1 = Bytes.toBytes("rowb");<a name="line.268"></a>
+<span class="sourceLineNo">269</span><a name="line.269"></a>
+<span class="sourceLineNo">270</span> byte[] row2 = Bytes.toBytes("rowc");<a name="line.270"></a>
+<span class="sourceLineNo">271</span><a name="line.271"></a>
+<span class="sourceLineNo">272</span> TableDescriptor tableDescriptor =<a name="line.272"></a>
+<span class="sourceLineNo">273</span> TableDescriptorBuilder.newBuilder(tableName)<a name="line.273"></a>
+<span class="sourceLineNo">274</span> .setColumnFamily(<a name="line.274"></a>
+<span class="sourceLineNo">275</span> ColumnFamilyDescriptorBuilder.newBuilder(fam).setBlockCacheEnabled(true).build())<a name="line.275"></a>
+<span class="sourceLineNo">276</span> .build();<a name="line.276"></a>
+<span class="sourceLineNo">277</span> Admin admin = TEST_UTIL.getAdmin();<a name="line.277"></a>
+<span class="sourceLineNo">278</span> admin.createTable(tableDescriptor);<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span> table = TEST_UTIL.getConnection().getTable(tableName);<a name="line.280"></a>
+<span class="sourceLineNo">281</span> Put put = new Put(row);<a name="line.281"></a>
+<span class="sourceLineNo">282</span> byte[] value = Bytes.toBytes("value");<a name="line.282"></a>
+<span class="sourceLineNo">283</span> put.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, value);<a name="line.283"></a>
+<span class="sourceLineNo">284</span> table.put(put);<a name="line.284"></a>
+<span class="sourceLineNo">285</span> admin.flush(tableName);<a name="line.285"></a>
+<span class="sourceLineNo">286</span> // We are lacking an API for confirming flush request compaction.<a name="line.286"></a>
+<span class="sourceLineNo">287</span> // Just sleep for a short time. We won't be able to confirm flush<a name="line.287"></a>
+<span class="sourceLineNo">288</span> // completion but the test won't hang now or in the future if<a name="line.288"></a>
+<span class="sourceLineNo">289</span> // default compaction policy causes compaction between flush and<a name="line.289"></a>
+<span class="sourceLineNo">290</span> // when we go to confirm it.<a name="line.290"></a>
<span class="sourceLineNo">291</span> Thread.sleep(1000);<a name="line.291"></a>
<span class="sourceLineNo">292</span><a name="line.292"></a>
-<span class="sourceLineNo">293</span> Scan s = new Scan().withStartRow(row);<a name="line.293"></a>
-<span class="sourceLineNo">294</span> ResultScanner scanner = table.getScanner(s);<a name="line.294"></a>
-<span class="sourceLineNo">295</span> try {<a name="line.295"></a>
-<span class="sourceLineNo">296</span> Result[] next = scanner.next(3);<a name="line.296"></a>
-<span class="sourceLineNo">297</span> for (Result result : next) {<a name="line.297"></a>
-<span class="sourceLineNo">298</span> CellScanner cellScanner = result.cellScanner();<a name="line.298"></a>
-<span class="sourceLineNo">299</span> cellScanner.advance();<a name="line.299"></a>
-<span class="sourceLineNo">300</span> Cell current = cellScanner.current();<a name="line.300"></a>
-<span class="sourceLineNo">301</span> assertEquals(0, current.getTagsLength());<a name="line.301"></a>
-<span class="sourceLineNo">302</span> }<a name="line.302"></a>
-<span class="sourceLineNo">303</span> } finally {<a name="line.303"></a>
-<span class="sourceLineNo">304</span> if (scanner != null) scanner.close();<a name="line.304"></a>
-<span class="sourceLineNo">305</span> }<a name="line.305"></a>
-<span class="sourceLineNo">306</span> admin.compact(tableName);<a name="line.306"></a>
-<span class="sourceLineNo">307</span> while (admin.getCompactionState(tableName) != CompactionState.NONE) {<a name="line.307"></a>
-<span class="sourceLineNo">308</span> Thread.sleep(10);<a name="line.308"></a>
-<span class="sourceLineNo">309</span> }<a name="line.309"></a>
-<span class="sourceLineNo">310</span> s = new Scan().withStartRow(row);<a name="line.310"></a>
-<span class="sourceLineNo">311</span> scanner = table.getScanner(s);<a name="line.311"></a>
-<span class="sourceLineNo">312</span> try {<a name="line.312"></a>
-<span class="sourceLineNo">313</span> Result[] next = scanner.next(3);<a name="line.313"></a>
-<span class="sourceLineNo">314</span> for (Result result : next) {<a name="line.314"></a>
-<span class="sourceLineNo">315</span> CellScanner cellScanner = result.cellScanner();<a name="line.315"></a>
-<span class="sourceLineNo">316</span> cellScanner.advance();<a name="line.316"></a>
-<span class="sourceLineNo">317</span> Cell current = cellScanner.current();<a name="line.317"></a>
-<span class="sourceLineNo">318</span> assertEquals(0, current.getTagsLength());<a name="line.318"></a>
-<span class="sourceLineNo">319</span> }<a name="line.319"></a>
-<span class="sourceLineNo">320</span> } finally {<a name="line.320"></a>
-<span class="sourceLineNo">321</span> if (scanner != null) {<a name="line.321"></a>
-<span class="sourceLineNo">322</span> scanner.close();<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> } finally {<a name="line.325"></a>
-<span class="sourceLineNo">326</span> if (table != null) {<a name="line.326"></a>
-<span class="sourceLineNo">327</span> table.close();<a name="line.327"></a>
-<span class="sourceLineNo">328</span> }<a name="line.328"></a>
-<span class="sourceLineNo">329</span> }<a name="line.329"></a>
-<span class="sourceLineNo">330</span> }<a name="line.330"></a>
-<span class="sourceLineNo">331</span><a name="line.331"></a>
-<span class="sourceLineNo">332</span> @Test<a name="line.332"></a>
-<span class="sourceLineNo">333</span> public void testFlushAndCompactionwithCombinations() throws Exception {<a name="line.333"></a>
-<span class="sourceLineNo">334</span> TableName tableName = TableName.valueOf(TEST_NAME.getMethodName());<a name="line.334"></a>
-<span class="sourceLineNo">335</span> byte[] fam = Bytes.toBytes("info");<a name="line.335"></a>
-<span class="sourceLineNo">336</span> byte[] row = Bytes.toBytes("rowa");<a name="line.336"></a>
-<span class="sourceLineNo">337</span> // column names<a name="line.337"></a>
-<span class="sourceLineNo">338</span> byte[] qual = Bytes.toBytes("qual");<a name="line.338"></a>
-<span class="sourceLineNo">339</span><a name="line.339"></a>
-<span class="sourceLineNo">340</span> byte[] row1 = Bytes.toBytes("rowb");<a name="line.340"></a>
-<span class="sourceLineNo">341</span><a name="line.341"></a>
-<span class="sourceLineNo">342</span> byte[] row2 = Bytes.toBytes("rowc");<a name="line.342"></a>
-<span class="sourceLineNo">343</span> byte[] rowd = Bytes.toBytes("rowd");<a name="line.343"></a>
-<span class="sourceLineNo">344</span> byte[] rowe = Bytes.toBytes("rowe");<a name="line.344"></a>
-<span class="sourceLineNo">345</span> Table table = null;<a name="line.345"></a>
-<span class="sourceLineNo">346</span> for (DataBlockEncoding encoding : DataBlockEncoding.values()) {<a name="line.346"></a>
-<span class="sourceLineNo">347</span> TableDescriptor tableDescriptor = TableDescriptorBuilder.newBuilder(tableName)<a name="line.347"></a>
-<span class="sourceLineNo">348</span> .setColumnFamily(ColumnFamilyDescriptorBuilder.newBuilder(fam).setBlockCacheEnabled(true)<a name="line.348"></a>
-<span class="sourceLineNo">349</span> .setDataBlockEncoding(encoding).build())<a name="line.349"></a>
-<span class="sourceLineNo">350</span> .build();<a name="line.350"></a>
-<span class="sourceLineNo">351</span> Admin admin = TEST_UTIL.getAdmin();<a name="line.351"></a>
-<span class="sourceLineNo">352</span> admin.createTable(tableDescriptor);<a name="line.352"></a>
-<span class="sourceLineNo">353</span> try {<a name="line.353"></a>
-<span class="sourceLineNo">354</span> table = TEST_UTIL.getConnection().getTable(tableName);<a name="line.354"></a>
-<span class="sourceLineNo">355</span> Put put = new Put(row);<a name="line.355"></a>
-<span class="sourceLineNo">356</span> byte[] value = Bytes.toBytes("value");<a name="line.356"></a>
-<span class="sourceLineNo">357</span> put.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, value);<a name="line.357"></a>
-<span class="sourceLineNo">358</span> int bigTagLen = Short.MAX_VALUE - 5;<a name="line.358"></a>
-<span class="sourceLineNo">359</span> put.setAttribute("visibility", new byte[bigTagLen]);<a name="line.359"></a>
-<span class="sourceLineNo">360</span> table.put(put);<a name="line.360"></a>
-<span class="sourceLineNo">361</span> Put put1 = new Put(row1);<a name="line.361"></a>
-<span class="sourceLineNo">362</span> byte[] value1 = Bytes.toBytes("1000dfsdf");<a name="line.362"></a>
-<span class="sourceLineNo">363</span> put1.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, value1);<a name="line.363"></a>
-<span class="sourceLineNo">364</span> table.put(put1);<a name="line.364"></a>
-<span class="sourceLineNo">365</span> admin.flush(tableName);<a name="line.365"></a>
-<span class="sourceLineNo">366</span> // We are lacking an API for confirming flush request compaction.<a name="line.366"></a>
-<span class="sourceLineNo">367</span> // Just sleep for a short time. We won't be able to confirm flush<a name="line.367"></a>
-<span class="sourceLineNo">368</span> // completion but the test won't hang now or in the future if<a name="line.368"></a>
-<span class="sourceLineNo">369</span> // default compaction policy causes compaction between flush and<a name="line.369"></a>
-<span class="sourceLineNo">370</span> // when we go to confirm it.<a name="line.370"></a>
-<span class="sourceLineNo">371</span> Thread.sleep(1000);<a name="line.371"></a>
-<span class="sourceLineNo">372</span><a name="line.372"></a>
-<span class="sourceLineNo">373</span> put1 = new Put(row2);<a name="line.373"></a>
-<span class="sourceLineNo">374</span> value1 = Bytes.toBytes("1000dfsdf");<a name="line.374"></a>
-<span class="sourceLineNo">375</span> put1.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, value1);<a name="line.375"></a>
-<span class="sourceLineNo">376</span> table.put(put1);<a name="line.376"></a>
-<span class="sourceLineNo">377</span> admin.flush(tableName);<a name="line.377"></a>
-<span class="sourceLineNo">378</span> Thread.sleep(1000);<a name="line.378"></a>
-<span class="sourceLineNo">379</span><a name="line.379"></a>
-<span class="sourceLineNo">380</span> Put put2 = new Put(rowd);<a name="line.380"></a>
-<span class="sourceLineNo">381</span> byte[] value2 = Bytes.toBytes("1000dfsdf");<a name="line.381"></a>
-<span class="sourceLineNo">382</span> put2.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, value2);<a name="line.382"></a>
-<span class="sourceLineNo">383</span> table.put(put2);<a name="line.383"></a>
-<span class="sourceLineNo">384</span> put2 = new Put(rowe);<a name="line.384"></a>
-<span class="sourceLineNo">385</span> value2 = Bytes.toBytes("1000dfsddfdf");<a name="line.385"></a>
-<span class="sourceLineNo">386</span> put2.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, value2);<a name="line.386"></a>
-<span class="sourceLineNo">387</span> put.setAttribute("visibility", Bytes.toBytes("ram"));<a name="line.387"></a>
-<span class="sourceLineNo">388</span> table.put(put2);<a name="line.388"></a>
-<span class="sourceLineNo">389</span> admin.flush(tableName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span> Thread.sleep(1000);<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span> TestCoprocessorForTags.checkTagPresence = true;<a name="line.392"></a>
-<span class="sourceLineNo">393</span> Scan s = new Scan().withStartRow(row);<a name="line.393"></a>
-<span class="sourceLineNo">394</span> s.setCaching(1);<a name="line.394"></a>
-<span class="sourceLineNo">395</span> ResultScanner scanner = table.getScanner(s);<a name="line.395"></a>
-<span class="sourceLineNo">396</span> try {<a name="line.396"></a>
-<span class="sourceLineNo">397</span> Result next = null;<a name="line.397"></a>
-<span class="sourceLineNo">398</span> while ((next = scanner.next()) != null) {<a name="line.398"></a>
-<span class="sourceLineNo">399</span> CellScanner cellScanner = next.cellScanner();<a name="line.399"></a>
-<span class="sourceLineNo">400</span> cellScanner.advance();<a name="line.400"></a>
-<span class="sourceLineNo">401</span> Cell current = cellScanner.current();<a name="line.401"></a>
-<span class="sourceLineNo">402</span> if (CellUtil.matchingRows(current, row)) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span> assertEquals(1, TestCoprocessorForTags.tags.size());<a name="line.403"></a>
-<span class="sourceLineNo">404</span> Tag tag = TestCoprocessorForTags.tags.get(0);<a name="line.404"></a>
-<span class="sourceLineNo">405</span> assertEquals(bigTagLen, tag.getValueLength());<a name="line.405"></a>
-<span class="sourceLineNo">406</span> } else {<a name="line.406"></a>
-<span class="sourceLineNo">407</span> assertEquals(0, TestCoprocessorForTags.tags.size());<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> } finally {<a name="line.410"></a>
-<span class="sourceLineNo">411</span> if (scanner != null) {<a name="line.411"></a>
-<span class="sourceLineNo">412</span> scanner.close();<a name="line.412"></a>
-<span class="sourceLineNo">413</span> }<a name="line.413"></a>
-<span class="sourceLineNo">414</span> TestCoprocessorForTags.checkTagPresence = false;<a name="line.414"></a>
-<span class="sourceLineNo">415</span> }<a name="line.415"></a>
-<span class="sourceLineNo">416</span> while (admin.getCompactionState(tableName) != CompactionState.NONE) {<a name="line.416"></a>
-<span class="sourceLineNo">417</span> Thread.sleep(10);<a name="line.417"></a>
-<span class="sourceLineNo">418</span> }<a name="line.418"></a>
-<span class="sourceLineNo">419</span> TestCoprocessorForTags.checkTagPresence = true;<a name="line.419"></a>
-<span class="sourceLineNo">420</span> scanner = table.getScanner(s);<a name="line.420"></a>
-<span class="sourceLineNo">421</span> try {<a name="line.421"></a>
-<span class="sourceLineNo">422</span> Result next = null;<a name="line.422"></a>
-<span class="sourceLineNo">423</span> while ((next = scanner.next()) != null) {<a name="line.423"></a>
-<span class="sourceLineNo">424</span> CellScanner cellScanner = next.cellScanner();<a name="line.424"></a>
-<span class="sourceLineNo">425</span> cellScanner.advance();<a name="line.425"></a>
-<span class="sourceLineNo">426</span> Cell current = cellScanner.current();<a name="line.426"></a>
-<span class="sourceLineNo">427</span> if (CellUtil.matchingRows(current, row)) {<a name="line.427"></a>
-<span class="sourceLineNo">428</span> assertEquals(1, TestCoprocessorForTags.tags.size());<a name="line.428"></a>
-<span class="sourceLineNo">429</span> Tag tag = TestCoprocessorForTags.tags.get(0);<a name="line.429"></a>
-<span class="sourceLineNo">430</span> assertEquals(bigTagLen, tag.getValueLength());<a name="line.430"></a>
-<span class="sourceLineNo">431</span> } else {<a name="line.431"></a>
-<span class="sourceLineNo">432</span> assertEquals(0, TestCoprocessorForTags.tags.size());<a name="line.432"></a>
-<span class="sourceLineNo">433</span> }<a name="line.433"></a>
-<span class="sourceLineNo">434</span> }<a name="line.434"></a>
-<span class="sourceLineNo">435</span> } finally {<a name="line.435"></a>
-<span class="sourceLineNo">436</span> if (scanner != null) {<a name="line.436"></a>
-<span class="sourceLineNo">437</span> scanner.close();<a name="line.437"></a>
-<span class="sourceLineNo">438</span> }<a name="line.438"></a>
-<span class="sourceLineNo">439</span> TestCoprocessorForTags.checkTagPresence = false;<a name="line.439"></a>
-<span class="sourceLineNo">440</span> }<a name="line.440"></a>
-<span class="sourceLineNo">441</span> } finally {<a name="line.441"></a>
-<span class="sourceLineNo">442</span> if (table != null) {<a name="line.442"></a>
-<span class="sourceLineNo">443</span> table.close();<a name="line.443"></a>
-<span class="sourceLineNo">444</span> }<a name="line.444"></a>
-<span class="sourceLineNo">445</span> // delete the table<a name="line.445"></a>
-<span class="sourceLineNo">446</span> admin.disableTable(tableName);<a name="line.446"></a>
-<span class="sourceLineNo">447</span> admin.deleteTable(tableName);<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> @Test<a name="line.452"></a>
-<span class="sourceLineNo">453</span> public void testTagsWithAppendAndIncrement() throws Exception {<a name="line.453"></a>
-<span class="sourceLineNo">454</span> TableName tableName = TableName.valueOf(TEST_NAME.getMethodName());<a name="line.454"></a>
-<span class="sourceLineNo">455</span> byte[] f = Bytes.toBytes("f");<a name="line.455"></a>
-<span class="sourceLineNo">456</span> byte[] q = Bytes.toBytes("q");<a name="line.456"></a>
-<span class="sourceLineNo">457</span> byte[] row1 = Bytes.toBytes("r1");<a name="line.457"></a>
-<span class="sourceLineNo">458</span> byte[] row2 = Bytes.toBytes("r2");<a name="line.458"></a>
-<span class="sourceLineNo">459</span><a name="line.459"></a>
-<span class="sourceLineNo">460</span> TableDescriptor tableDescriptor = TableDescriptorBuilder.newBuilder(tableName)<a name="line.460"></a>
-<span class="sourceLineNo">461</span> .setColumnFamily(ColumnFamilyDescriptorBuilder.of(f)).build();<a name="line.461"></a>
-<span class="sourceLineNo">462</span> TEST_UTIL.getAdmin().createTable(tableDescriptor);<a name="line.462"></a>
-<span class="sourceLineNo">463</span><a name="line.463"></a>
-<span class="sourceLineNo">464</span> Table table = null;<a name="line.464"></a>
-<span class="sourceLineNo">465</span> try {<a name="line.465"></a>
-<span class="sourceLineNo">466</span> table = TEST_UTIL.getConnection().getTable(tableName);<a name="line.466"></a>
-<span class="sourceLineNo">467</span> Put put = new Put(row1);<a name="line.467"></a>
-<span class="sourceLineNo">468</span> byte[] v = Bytes.toBytes(2L);<a name="line.468"></a>
-<span class="sourceLineNo">469</span> put.addColumn(f, q, v);<a name="line.469"></a>
-<span class="sourceLineNo">470</span> put.setAttribute("visibility", Bytes.toBytes("tag1"));<a name="line.470"></a>
-<span class="sourceLineNo">471</span> table.put(put);<a name="line.471"></a>
-<span class="sourceLineNo">472</span> Increment increment = new Increment(row1);<a name="line.472"></a>
-<span class="sourceLineNo">473</span> increment.addColumn(f, q, 1L);<a name="line.473"></a>
-<span class="sourceLineNo">474</span> table.increment(increment);<a name="line.474"></a>
-<span class="sourceLineNo">475</span> TestCoprocessorForTags.checkTagPresence = true;<a name="line.475"></a>
-<span class="sourceLineNo">476</span> ResultScanner scanner = table.getScanner(new Scan());<a name="line.476"></a>
-<span class="sourceLineNo">477</span> Result result = scanner.next();<a name="line.477"></a>
-<span class="sourceLineNo">478</span> KeyValue kv = KeyValueUtil.ensureKeyValue(result.getColumnLatestCell(f, q));<a name="line.478"></a>
-<span class="sourceLineNo">479</span> List<Tag> tags = TestCoprocessorForTags.tags;<a name="line.479"></a>
-<span class="sourceLineNo">480</span> assertEquals(3L, Bytes.toLong(kv.getValueArray(), kv.getValueOffset(), kv.getValueLength()));<a name="line.480"></a>
-<span class="sourceLineNo">481</span> assertEquals(1, tags.size());<a name="line.481"></a>
-<span class="sourceLineNo">482</span> assertEquals("tag1", Bytes.toString(Tag.cloneValue(tags.get(0))));<a name="line.482"></a>
-<span class="sourceLineNo">483</span> TestCoprocessorForTags.checkTagPresence = false;<a name="line.483"></a>
-<span class="sourceLineNo">484</span> TestCoprocessorForTags.tags = null;<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span> increment = new Increment(row1);<a name="line.486"></a>
-<span class="sourceLineNo">487</span> increment.add(new KeyValue(row1, f, q, 1234L, v));<a name="line.487"></a>
-<span class="sourceLineNo">488</span> increment.setAttribute("visibility", Bytes.toBytes("tag2"));<a name="line.488"></a>
-<span class="sourceLineNo">489</span> table.increment(increment);<a name="line.489"></a>
-<span class="sourceLineNo">490</span> TestCoprocessorForTags.checkTagPresence = true;<a name="line.490"></a>
-<span class="sourceLineNo">491</span> scanner = table.getScanner(new Scan());<a name="line.491"></a>
-<span class="sourceLineNo">492</span> result = scanner.next();<a name="line.492"></a>
-<span class="sourceLineNo">493</span> kv = KeyValueUtil.ensureKeyValue(result.getColumnLatestCell(f, q));<a name="line.493"></a>
-<span class="sourceLineNo">494</span> tags = TestCoprocessorForTags.tags;<a name="line.494"></a>
-<span class="sourceLineNo">495</span> assertEquals(5L, Bytes.toLong(kv.getValueArray(), kv.getValueOffset(), kv.getValueLength()));<a name="line.495"></a>
-<span class="sourceLineNo">496</span> assertEquals(2, tags.size());<a name="line.496"></a>
-<span class="sourceLineNo">497</span> // We cannot assume the ordering of tags<a name="line.497"></a>
-<span class="sourceLineNo">498</span> List<String> tagValues = new ArrayList<>();<a name="line.498"></a>
-<span class="sourceLineNo">499</span> for (Tag tag : tags) {<a name="line.499"></a>
-<span class="sourceLineNo">500</span> tagValues.add(Bytes.toString(Tag.cloneValue(tag)));<a name="line.500"></a>
-<span class="sourceLineNo">501</span> }<a name="line.501"></a>
-<span class="sourceLineNo">502</span> assertTrue(tagValues.contains("tag1"));<a name="line.502"></a>
-<span class="sourceLineNo">503</span> assertTrue(tagValues.contains("tag2"));<a name="line.503"></a>
-<span class="sourceLineNo">504</span> TestCoprocessorForTags.checkTagPresence = false;<a name="line.504"></a>
-<span class="sourceLineNo">505</span> TestCoprocessorForTags.tags = null;<a name="line.505"></a>
-<span class="sourceLineNo">506</span><a name="line.506"></a>
-<span class="sourceLineNo">507</span> put = new Put(row2);<a name="line.507"></a>
-<span class="sourceLineNo">508</span> v = Bytes.toBytes(2L);<a name="line.508"></a>
-<span class="sourceLineNo">509</span> put.addColumn(f, q, v);<a name="line.509"></a>
-<span class="sourceLineNo">510</span> table.put(put);<a name="line.510"></a>
-<span class="sourceLineNo">511</span> increment = new Increment(row2);<a name="line.511"></a>
-<span class="sourceLineNo">512</span> increment.add(new KeyValue(row2, f, q, 1234L, v));<a name="line.512"></a>
-<span class="sourceLineNo">513</span> increment.setAttribute("visibility", Bytes.toBytes("tag2"));<a name="line.513"></a>
-<span class="sourceLineNo">514</span> table.increment(increment);<a name="line.514"></a>
-<span class="sourceLineNo">515</span> TestCoprocessorForTags.checkTagPresence = true;<a name="line.515"></a>
-<span class="sourceLineNo">516</span> scanner = table.getScanner(new Scan().withStartRow(row2));<a name="line.516"></a>
-<span class="sourceLineNo">517</span> result = scanner.next();<a name="line.517"></a>
-<span class="sourceLineNo">518</span> kv = KeyValueUtil.ensureKeyValue(result.getColumnLatestCell(f, q));<a name="line.518"></a>
-<span class="sourceLineNo">519</span> tags = TestCoprocessorForTags.tags;<a name="line.519"></a>
-<span class="sourceLineNo">520</span> assertEquals(4L, Bytes.toLong(kv.getValueArray(), kv.getValueOffset(), kv.getValueLength()));<a name="line.520"></a>
-<span class="sourceLineNo">521</span> assertEquals(1, tags.size());<a name="line.521"></a>
-<span class="sourceLineNo">522</span> assertEquals("tag2", Bytes.toString(Tag.cloneValue(tags.get(0))));<a name="line.522"></a>
-<span class="sourceLineNo">523</span> TestCoprocessorForTags.checkTagPresence = false;<a name="line.523"></a>
-<span class="sourceLineNo">524</span> TestCoprocessorForTags.tags = null;<a name="line.524"></a>
-<span class="sourceLineNo">525</span><a name="line.525"></a>
-<span class="sourceLineNo">526</span> // Test Append<a name="line.526"></a>
-<span class="sourceLineNo">527</span> byte[] row3 = Bytes.toBytes("r3");<a name="line.527"></a>
-<span class="sourceLineNo">528</span> put = new Put(row3);<a name="line.528"></a>
-<span class="sourceLineNo">529</span> put.addColumn(f, q, Bytes.toBytes("a"));<a name="line.529"></a>
-<span class="sourceLineNo">530</span> put.setAttribute("visibility", Bytes.toBytes("tag1"));<a name="line.530"></a>
-<span class="sourceLineNo">531</span> table.put(put);<a name="line.531"></a>
-<span class="sourceLineNo">532</span> Append append = new Append(row3);<a name="line.532"></a>
-<span class="sourceLineNo">533</span> append.addColumn(f, q, Bytes.toBytes("b"));<a name="line.533"></a>
-<span class="sourceLineNo">534</span> table.append(append);<a name="line.534"></a>
-<span class="sourceLineNo">535</span> TestCoprocessorForTags.checkTagPresence = true;<a name="line.535"></a>
-<span class="sourceLineNo">536</span> scanner = table.getScanner(new Scan().withStartRow(row3));<a name="line.536"></a>
-<span class="sourceLineNo">537</span> result = scanner.next();<a name="line.537"></a>
-<span class="sourceLineNo">538</span> kv = KeyValueUtil.ensureKeyValue(result.getColumnLatestCell(f, q));<a name="line.538"></a>
-<span class="sourceLineNo">539</span> tags = TestCoprocessorForTags.tags;<a name="line.539"></a>
-<span class="sourceLineNo">540</span> assertEquals(1, tags.size());<a name="line.540"></a>
-<span class="sourceLineNo">541</span> assertEquals("tag1", Bytes.toString(Tag.cloneValue(tags.get(0))));<a name="line.541"></a>
-<span class="sourceLineNo">542</span> TestCoprocessorForTags.checkTagPresence = false;<a name="line.542"></a>
-<span class="sourceLineNo">543</span> TestCoprocessorForTags.tags = null;<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span> append = new Append(row3);<a name="line.545"></a>
-<span class="sourceLineNo">546</span> append.add(new KeyValue(row3, f, q, 1234L, v));<a name="line.546"></a>
-<span class="sourceLineNo">547</span> append.setAttribute("visibility", Bytes.toBytes("tag2"));<a name="line.547"></a>
+<span class="sourceLineNo">293</span> Put put1 = new Put(row1);<a name="line.293"></a>
+<span class="sourceLineNo">294</span> byte[] value1 = Bytes.toBytes("1000dfsdf");<a name="line.294"></a>
+<span class="sourceLineNo">295</span> put1.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, value1);<a name="line.295"></a>
+<span class="sourceLineNo">296</span> table.put(put1);<a name="line.296"></a>
+<span class="sourceLineNo">297</span> admin.flush(tableName);<a name="line.297"></a>
+<span class="sourceLineNo">298</span> Thread.sleep(1000);<a name="line.298"></a>
+<span class="sourceLineNo">299</span><a name="line.299"></a>
+<span class="sourceLineNo">300</span> Put put2 = new Put(row2);<a name="line.300"></a>
+<span class="sourceLineNo">301</span> byte[] value2 = Bytes.toBytes("1000dfsdf");<a name="line.301"></a>
+<span class="sourceLineNo">302</span> put2.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, value2);<a name="line.302"></a>
+<span class="sourceLineNo">303</span> table.put(put2);<a name="line.303"></a>
+<span class="sourceLineNo">304</span> admin.flush(tableName);<a name="line.304"></a>
+<span class="sourceLineNo">305</span> Thread.sleep(1000);<a name="line.305"></a>
+<span class="sourceLineNo">306</span><a name="line.306"></a>
+<span class="sourceLineNo">307</span> Scan s = new Scan().withStartRow(row);<a name="line.307"></a>
+<span class="sourceLineNo">308</span> ResultScanner scanner = table.getScanner(s);<a name="line.308"></a>
+<span class="sourceLineNo">309</span> try {<a name="line.309"></a>
+<span class="sourceLineNo">310</span> Result[] next = scanner.next(3);<a name="line.310"></a>
+<span class="sourceLineNo">311</span> for (Result result : next) {<a name="line.311"></a>
+<span class="sourceLineNo">312</span> CellScanner cellScanner = result.cellScanner();<a name="line.312"></a>
+<span class="sourceLineNo">313</span> cellScanner.advance();<a name="line.313"></a>
+<span class="sourceLineNo">314</span> Cell current = cellScanner.current();<a name="line.314"></a>
+<span class="sourceLineNo">315</span> assertEquals(0, current.getTagsLength());<a name="line.315"></a>
+<span class="sourceLineNo">316</span> }<a name="line.316"></a>
+<span class="sourceLineNo">317</span> } finally {<a name="line.317"></a>
+<span class="sourceLineNo">318</span> if (scanner != null) scanner.close();<a name="line.318"></a>
+<span class="sourceLineNo">319</span> }<a name="line.319"></a>
+<span class="sourceLineNo">320</span> admin.compact(tableName);<a name="line.320"></a>
+<span class="sourceLineNo">321</span> while (admin.getCompactionState(tableName) != CompactionState.NONE) {<a name="line.321"></a>
+<span class="sourceLineNo">322</span> Thread.sleep(10);<a name="line.322"></a>
+<span class="sourceLineNo">323</span> }<a name="line.323"></a>
+<span class="sourceLineNo">324</span> s = new Scan().withStartRow(row);<a name="line.324"></a>
+<span class="sourceLineNo">325</span> scanner = table.getScanner(s);<a name="line.325"></a>
+<span class="sourceLineNo">326</span> try {<a name="line.326"></a>
+<span class="sourceLineNo">327</span> Result[] next = scanner.next(3);<a name="line.327"></a>
+<span class="sourceLineNo">328</span> for (Result result : next) {<a name="line.328"></a>
+<span class="sourceLineNo">329</span> CellScanner cellScanner = result.cellScanner();<a name="line.329"></a>
+<span class="sourceLineNo">330</span> cellScanner.advance();<a name="line.330"></a>
+<span class="sourceLineNo">331</span> Cell current = cellScanner.current();<a name="line.331"></a>
+<span class="sourceLineNo">332</span> assertEquals(0, current.getTagsLength());<a name="line.332"></a>
+<span class="sourceLineNo">333</span> }<a name="line.333"></a>
+<span class="sourceLineNo">334</span> } finally {<a name="line.334"></a>
+<span class="sourceLineNo">335</span> if (scanner != null) {<a name="line.335"></a>
+<span class="sourceLineNo">336</span> scanner.close();<a name="line.336"></a>
+<span class="sourceLineNo">337</span> }<a name="line.337"></a>
+<span class="sourceLineNo">338</span> }<a name="line.338"></a>
+<span class="sourceLineNo">339</span> } finally {<a name="line.339"></a>
+<span class="sourceLineNo">340</span> if (table != null) {<a name="line.340"></a>
+<span class="sourceLineNo">341</span> table.close();<a name="line.341"></a>
+<span class="sourceLineNo">342</span> }<a name="line.342"></a>
+<span class="sourceLineNo">343</span> }<a name="line.343"></a>
+<span class="sourceLineNo">344</span> }<a name="line.344"></a>
+<span class="sourceLineNo">345</span><a name="line.345"></a>
+<span class="sourceLineNo">346</span> @Test<a name="line.346"></a>
+<span class="sourceLineNo">347</span> public void testFlushAndCompactionwithCombinations() throws Exception {<a name="line.347"></a>
+<span class="sourceLineNo">348</span> TableName tableName = TableName.valueOf(TEST_NAME.getMethodName());<a name="line.348"></a>
+<span class="sourceLineNo">349</span> byte[] fam = Bytes.toBytes("info");<a name="line.349"></a>
+<span class="sourceLineNo">350</span> byte[] row = Bytes.toBytes("rowa");<a name="line.350"></a>
+<span class="sourceLineNo">351</span> // column names<a name="line.351"></a>
+<span class="sourceLineNo">352</span> byte[] qual = Bytes.toBytes("qual");<a name="line.352"></a>
+<span class="sourceLineNo">353</span><a name="line.353"></a>
+<span class="sourceLineNo">354</span> byte[] row1 = Bytes.toBytes("rowb");<a name="line.354"></a>
+<span class="sourceLineNo">355</span><a name="line.355"></a>
+<span class="sourceLineNo">356</span> byte[] row2 = Bytes.toBytes("rowc");<a name="line.356"></a>
+<span class="sourceLineNo">357</span> byte[] rowd = Bytes.toBytes("rowd");<a name="line.357"></a>
+<span class="sourceLineNo">358</span> byte[] rowe = Bytes.toBytes("rowe");<a name="line.358"></a>
+<span class="sourceLineNo">359</span> Table table = null;<a name="line.359"></a>
+<span class="sourceLineNo">360</span> for (DataBlockEncoding encoding : DataBlockEncoding.values()) {<a name="line.360"></a>
+<span class="sourceLineNo">361</span> TableDescriptor tableDescriptor = TableDescriptorBuilder.newBuilder(tableName)<a name="line.361"></a>
+<span class="sourceLineNo">362</span> .setColumnFamily(ColumnFamilyDescriptorBuilder.newBuilder(fam).setBlockCacheEnabled(true)<a name="line.362"></a>
+<span class="sourceLineNo">363</span> .setDataBlockEncoding(encoding).build())<a name="line.363"></a>
+<span class="sourceLineNo">364</span> .build();<a name="line.364"></a>
+<span class="sourceLineNo">365</span> Admin admin = TEST_UTIL.getAdmin();<a name="line.365"></a>
+<span class="sourceLineNo">366</span> admin.createTable(tableDescriptor);<a name="line.366"></a>
+<span class="sourceLineNo">367</span> try {<a name="line.367"></a>
+<span class="sourceLineNo">368</span> table = TEST_UTIL.getConnection().getTable(tableName);<a name="line.368"></a>
+<span class="sourceLineNo">369</span> Put put = new Put(row);<a name="line.369"></a>
+<span class="sourceLineNo">370</span> byte[] value = Bytes.toBytes("value");<a name="line.370"></a>
+<span class="sourceLineNo">371</span> put.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, value);<a name="line.371"></a>
+<span class="sourceLineNo">372</span> int bigTagLen = Short.MAX_VALUE - 5;<a name="line.372"></a>
+<span class="sourceLineNo">373</span> put.setAttribute("visibility", new byte[bigTagLen]);<a name="line.373"></a>
+<span class="sourceLineNo">374</span> table.put(put);<a name="line.374"></a>
+<span class="sourceLineNo">375</span> Put put1 = new Put(row1);<a name="line.375"></a>
+<span class="sourceLineNo">376</span> byte[] value1 = Bytes.toBytes("1000dfsdf");<a name="line.376"></a>
+<span class="sourceLineNo">377</span> put1.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, value1);<a name="line.377"></a>
+<span class="sourceLineNo">378</span> table.put(put1);<a name="line.378"></a>
+<span class="sourceLineNo">379</span> admin.flush(tableName);<a name="line.379"></a>
+<span class="sourceLineNo">380</span> // We are lacking an API for confirming flush request compaction.<a name="line.380"></a>
+<span class="sourceLineNo">381</span> // Just sleep for a short time. We won't be able to confirm flush<a name="line.381"></a>
+<span class="sourceLineNo">382</span> // completion but the test won't hang now or in the future if<a name="line.382"></a>
+<span class="sourceLineNo">383</span> // default compaction policy causes compaction between flush and<a name="line.383"></a>
+<span class="sourceLineNo">384</span> // when we go to confirm it.<a name="line.384"></a>
+<span class="sourceLineNo">385</span> Thread.sleep(1000);<a name="line.385"></a>
+<span class="sourceLineNo">386</span><a name="line.386"></a>
+<span class="sourceLineNo">387</span> put1 = new Put(row2);<a name="line.387"></a>
+<span class="sourceLineNo">388</span> value1 = Bytes.toBytes("1000dfsdf");<a name="line.388"></a>
+<span class="sourceLineNo">389</span> put1.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, value1);<a name="line.389"></a>
+<span class="sourceLineNo">390</span> table.put(put1);<a name="line.390"></a>
+<span class="sourceLineNo">391</span> admin.flush(tableName);<a name="line.391"></a>
+<span class="sourceLineNo">392</span> Thread.sleep(1000);<a name="line.392"></a>
+<span class="sourceLineNo">393</span><a name="line.393"></a>
+<span class="sourceLineNo">394</span> Put put2 = new Put(rowd);<a name="line.394"></a>
+<span class="sourceLineNo">395</span> byte[] value2 = Bytes.toBytes("1000dfsdf");<a name="line.395"></a>
+<span class="sourceLineNo">396</span> put2.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, value2);<a name="line.396"></a>
+<span class="sourceLineNo">397</span> table.put(put2);<a name="line.397"></a>
+<span class="sourceLineNo">398</span> put2 = new Put(rowe);<a name="line.398"></a>
+<span class="sourceLineNo">399</span> value2 = Bytes.toBytes("1000dfsddfdf");<a name="line.399"></a>
+<span class="sourceLineNo">400</span> put2.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, value2);<a name="line.400"></a>
+<span class="sourceLineNo">401</span> put.setAttribute("visibility", Bytes.toBytes("ram"));<a name="line.401"></a>
+<span class="sourceLineNo">402</span> table.put(put2);<a name="line.402"></a>
+<span class="sourceLineNo">403</span> admin.flush(tableName);<a name="line.403"></a>
+<span class="sourceLineNo">404</span> Thread.sleep(1000);<a name="line.404"></a>
+<span class="sourceLineNo">405</span><a name="line.405"></a>
+<span class="sourceLineNo">406</span> TestCoprocessorForTags.checkTagPresence = true;<a name="line.406"></a>
+<span class="sourceLineNo">407</span> Scan s = new Scan().withStartRow(row);<a name="line.407"></a>
+<span class="sourceLineNo">408</span> s.setCaching(1);<a name="line.408"></a>
+<span class="sourceLineNo">409</span> ResultScanner scanner = table.getScanner(s);<a name="line.409"></a>
+<span class="sourceLineNo">410</span> try {<a name="line.410"></a>
+<span class="sourceLineNo">411</span> Result next = null;<a name="line.411"></a>
+<span class="sourceLineNo">412</span> while ((next = scanner.next()) != null) {<a name="line.412"></a>
+<span class="sourceLineNo">413</span> CellScanner cellScanner = next.cellScanner();<a name="line.413"></a>
+<span class="sourceLineNo">414</span> cellScanner.advance();<a name="line.414"></a>
+<span class="sourceLineNo">415</span> Cell current = cellScanner.current();<a name="line.415"></a>
+<span class="sourceLineNo">416</span> if (CellUtil.matchingRows(current, row)) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span> assertEquals(1, TestCoprocessorForTags.tags.size());<a name="line.417"></a>
+<span class="sourceLineNo">418</span> Tag tag = TestCoprocessorForTags.tags.get(0);<a name="line.418"></a>
+<span class="sourceLineNo">419</span> assertEquals(bigTagLen, tag.getValueLength());<a name="line.419"></a>
+<span class="sourceLineNo">420</span> } else {<a name="line.420"></a>
+<span class="sourceLineNo">421</span> assertEquals(0, TestCoprocessorForTags.tags.size());<a name="line.421"></a>
+<span class="sourceLineNo">422</span> }<a name="line.422"></a>
+<span class="sourceLineNo">423</span> }<a name="line.423"></a>
+<span class="sourceLineNo">424</span> } finally {<a name="line.424"></a>
+<span class="sourceLineNo">425</span> if (scanner != null) {<a name="line.425"></a>
+<span class="sourceLineNo">426</span> scanner.close();<a name="line.426"></a>
+<span class="sourceLineNo">427</span> }<a name="line.427"></a>
+<span class="sourceLineNo">428</span> TestCoprocessorForTags.checkTagPresence = false;<a name="line.428"></a>
+<span class="sourceLineNo">429</span> }<a name="line.429"></a>
+<span class="sourceLineNo">430</span> while (admin.getCompactionState(tableName) != CompactionState.NONE) {<a name="line.430"></a>
+<span class="sourceLineNo">431</span> Thread.sleep(10);<a name="line.431"></a>
+<span class="sourceLineNo">432</span> }<a name="line.432"></a>
+<span class="sourceLineNo">433</span> TestCoprocessorForTags.checkTagPresence = true;<a name="line.433"></a>
+<span class="sourceLineNo">434</span> scanner = table.getScanner(s);<a name="line.434"></a>
+<span class="sourceLineNo">435</span> try {<a name="line.435"></a>
+<span class="sourceLineNo">436</span> Result next = null;<a name="line.436"></a>
+<span class="sourceLineNo">437</span> while ((next = scanner.next()) != null) {<a name="line.437"></a>
+<span class="sourceLineNo">438</span> CellScanner cellScanner = next.cellScanner();<a name="line.438"></a>
+<span class="sourceLineNo">439</span> cellScanner.advance();<a name="line.439"></a>
+<span class="sourceLineNo">440</span> Cell current = cellScanner.current();<a name="line.440"></a>
+<span class="sourceLineNo">441</span> if (CellUtil.matchingRows(current, row)) {<a name="line.441"></a>
+<span class="sourceLineNo">442</span> assertEquals(1, TestCoprocessorForTags.tags.size());<a name="line.442"></a>
+<span class="sourceLineNo">443</span> Tag tag = TestCoprocessorForTags.tags.get(0);<a name="line.443"></a>
+<span class="sourceLineNo">444</span> assertEquals(bigTagLen, tag.getValueLength());<a name="line.444"></a>
+<span class="sourceLineNo">445</span> } else {<a name="line.445"></a>
+<span class="sourceLineNo">446</span> assertEquals(0, TestCoprocessorForTags.tags.size());<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> } finally {<a name="line.449"></a>
+<span class="sourceLineNo">450</span> if (scanner != null) {<a name="line.450"></a>
+<span class="sourceLineNo">451</span> scanner.close();<a name="line.451"></a>
+<span class="sourceLineNo">452</span> }<a name="line.452"></a>
+<span class="sourceLineNo">453</span> TestCoprocessorForTags.checkTagPresence = false;<a name="line.453"></a>
+<span class="sourceLineNo">454</span> }<a name="line.454"></a>
+<span class="sourceLineNo">455</span> } finally {<a name="line.455"></a>
+<span class="sourceLineNo">456</span> if (table != null) {<a name="line.456"></a>
+<span class="sourceLineNo">457</span> table.close();<a name="line.457"></a>
+<span class="sourceLineNo">458</span> }<a name="line.458"></a>
+<span class="sourceLineNo">459</span> // delete the table<a name="line.459"></a>
+<span class="sourceLineNo">460</span> admin.disableTable(tableName);<a name="line.460"></a>
+<span class="sourceLineNo">461</span> admin.deleteTable(tableName);<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><a name="line.465"></a>
+<span class="sourceLineNo">466</span> @Test<a name="line.466"></a>
+<span class="sourceLineNo">467</span> public void testTagsWithAppendAndIncrement() throws Exception {<a name="line.467"></a>
+<span class="sourceLineNo">468</span> TableName tableName = TableName.valueOf(TEST_NAME.getMethodName());<a name="line.468"></a>
+<span class="sourceLineNo">469</span> byte[] f = Bytes.toBytes("f");<a name="line.469"></a>
+<span class="sourceLineNo">470</span> byte[] q = Bytes.toBytes("q");<a name="line.470"></a>
+<span class="sourceLineNo">471</span> byte[] row1 = Bytes.toBytes("r1");<a name="line.471"></a>
+<span class="sourceLineNo">472</span> byte[] row2 = Bytes.toBytes("r2");<a name="line.472"></a>
+<span class="sourceLineNo">473</span><a name="line.473"></a>
+<span class="sourceLineNo">474</span> TableDescriptor tableDescriptor = TableDescriptorBuilder.newBuilder(tableName)<a name="line.474"></a>
+<span class="sourceLineNo">475</span> .setColumnFamily(ColumnFamilyDescriptorBuilder.of(f)).build();<a name="line.475"></a>
+<span class="sourceLineNo">476</span> TEST_UTIL.getAdmin().createTable(tableDescriptor);<a name="line.476"></a>
+<span class="sourceLineNo">477</span><a name="line.477"></a>
+<span class="sourceLineNo">478</span> Table table = null;<a name="line.478"></a>
+<span class="sourceLineNo">479</span> try {<a name="line.479"></a>
+<span class="sourceLineNo">480</span> table = TEST_UTIL.getConnection().getTable(tableName);<a name="line.480"></a>
+<span class="sourceLineNo">481</span> Put put = new Put(row1);<a name="line.481"></a>
+<span class="sourceLineNo">482</span> byte[] v = Bytes.toBytes(2L);<a name="line.482"></a>
+<span class="sourceLineNo">483</span> put.addColumn(f, q, v);<a name="line.483"></a>
+<span class="sourceLineNo">484</span> put.setAttribute("visibility", Bytes.toBytes("tag1"));<a name="line.484"></a>
+<span class="sourceLineNo">485</span> table.put(put);<a name="line.485"></a>
+<span class="sourceLineNo">486</span> Increment increment = new Increment(row1);<a name="line.486"></a>
+<span class="sourceLineNo">487</span> increment.addColumn(f, q, 1L);<a name="line.487"></a>
+<span class="sourceLineNo">488</span> table.increment(increment);<a name="line.488"></a>
+<span class="sourceLineNo">489</span> TestCoprocessorForTags.checkTagPresence = true;<a name="line.489"></a>
+<span class="sourceLineNo">490</span> ResultScanner scanner = table.getScanner(new Scan());<a name="line.490"></a>
+<span class="sourceLineNo">491</span> Result result = scanner.next();<a name="line.491"></a>
+<span class="sourceLineNo">492</span> KeyValue kv = KeyValueUtil.ensureKeyValue(result.getColumnLatestCell(f, q));<a name="line.492"></a>
+<span class="sourceLineNo">493</span> List<Tag> tags = TestCoprocessorForTags.tags;<a name="line.493"></a>
+<span class="sourceLineNo">494</span> assertEquals(3L, Bytes.toLong(kv.getValueArray(), kv.getValueOffset(), kv.getValueLength()));<a name="line.494"></a>
+<span class="sourceLineNo">495</span> assertEquals(1, tags.size());<a name="line.495"></a>
+<span class="sourceLineNo">496</span> assertEquals("tag1", Bytes.toString(Tag.cloneValue(tags.get(0))));<a name="line.496"></a>
+<span class="sourceLineNo">497</span> TestCoprocessorForTags.checkTagPresence = false;<a name="line.497"></a>
+<span class="sourceLineNo">498</span> TestCoprocessorForTags.tags = null;<a name="line.498"></a>
+<span class="sourceLineNo">499</span><a name="line.499"></a>
+<span class="sourceLineNo">500</span> increment = new Increment(row1);<a name="line.500"></a>
+<span class="sourceLineNo">501</span> increment.add(new KeyValue(row1, f, q, 1234L, v));<a name="line.501"></a>
+<span class="sourceLineNo">502</span> increment.setAttribute("visibility", Bytes.toBytes("tag2"));<a name="line.502"></a>
+<span class="sourceLineNo">503</span> table.increment(increment);<a name="line.503"></a>
+<span class="sourceLineNo">504</span> TestCoprocessorForTags.checkTagPresence = true;<a name="line.504"></a>
+<span class="sourceLineNo">505</span> scanner = table.getScanner(new Scan());<a name="line.505"></a>
+<span class="sourceLineNo">506</span> result = scanner.next();<a name="line.506"></a>
+<span class="sourceLineNo">507</span> kv = KeyValueUtil.ensureKeyValue(result.getColumnLatestCell(f, q));<a name="line.507"></a>
+<span class="sourceLineNo">508</span> tags = TestCoprocessorForTags.tags;<a name="line.508"></a>
+<span class="sourceLineNo">509</span> assertEquals(5L, Bytes.toLong(kv.getValueArray(), kv.getValueOffset(), kv.getValueLength()));<a name="line.509"></a>
+<span class="sourceLineNo">510</span> assertEquals(2, tags.size());<a name="line.510"></a>
+<span class="sourceLineNo">511</span> // We cannot assume the ordering of tags<a name="line.511"></a>
+<span class="sourceLineNo">512</span> List<String> tagValues = new ArrayList<>();<a name="line.512"></a>
+<span class="sourceLineNo">513</span> for (Tag tag : tags) {<a name="line.513"></a>
+<span class="sourceLineNo">514</span> tagValues.add(Bytes.toString(Tag.cloneValue(tag)));<a name="line.514"></a>
+<span class="sourceLineNo">515</span> }<a name="line.515"></a>
+<span class="sourceLineNo">516</span> assertTrue(tagValues.contains("tag1"));<a name="line.516"></a>
+<span class="sourceLineNo">517</span> assertTrue(tagValues.contains("tag2"));<a name="line.517"></a>
+<span class="sourceLineNo">518</span> TestCoprocessorForTags.checkTagPresence = false;<a name="line.518"></a>
+<span class="sourceLineNo">519</span> TestCoprocessorForTags.tags = null;<a name="line.519"></a>
+<span class="sourceLineNo">520</span><a name="line.520"></a>
+<span class="sourceLineNo">521</span> put = new Put(row2);<a name="line.521"></a>
+<span class="sourceLineNo">522</span> v = Bytes.toBytes(2L);<a name="line.522"></a>
+<span class="sourceLineNo">523</span> put.addColumn(f, q, v);<a name="line.523"></a>
+<span class="sourceLineNo">524</span> table.put(put);<a name="line.524"></a>
+<span class="sourceLineNo">525</span> increment = new Increment(row2);<a name="line.525"></a>
+<span class="sourceLineNo">526</span> increment.add(new KeyValue(row2, f, q, 1234L, v));<a name="line.526"></a>
+<span class="sourceLineNo">527</span> increment.setAttribute("visibility", Bytes.toBytes("tag2"));<a name="line.527"></a>
+<span class="sourceLineNo">528</span> table.increment(increment);<a name="line.528"></a>
+<span class="sourceLineNo">529</span> TestCoprocessorForTags.checkTagPresence = true;<a name="line.529"></a>
+<span class="sourceLineNo">530</span> scanner = table.getScanner(new Scan().withStartRow(row2));<a name="line.530"></a>
+<span class="sourceLineNo">531</span> result = scanner.next();<a name="line.531"></a>
+<span class="sourceLineNo">532</span> kv = KeyValueUtil.ensureKeyValue(result.getColumnLatestCell(f, q));<a name="line.532"></a>
+<span class="sourceLineNo">533</span> tags = TestCoprocessorForTags.tags;<a name="line.533"></a>
+<span class="sourceLineNo">534</span> assertEquals(4L, Bytes.toLong(kv.getValueArray(), kv.getValueOffset(), kv.getValueLength()));<a name="line.534"></a>
+<span class="sourceLineNo">535</span> assertEquals(1, tags.size());<a name="line.535"></a>
+<span class="sourceLineNo">536</span> assertEquals("tag2", Bytes.toString(Tag.cloneValue(tags.get(0))));<a name="line.536"></a>
+<span class="sourceLineNo">537</span> TestCoprocessorForTags.checkTagPresence = false;<a name="line.537"></a>
+<span class="sourceLineNo">538</span> TestCoprocessorForTags.tags = null;<a name="line.538"></a>
+<span class="sourceLineNo">539</span><a name="line.539"></a>
+<span class="sourceLineNo">540</span> // Test Append<a name="line.540"></a>
+<span class="sourceLineNo">541</span> byte[] row3 = Bytes.toBytes("r3");<a name="line.541"></a>
+<span class="sourceLineNo">542</span> put = new Put(row3);<a name="line.542"></a>
+<span class="sourceLineNo">543</span> put.addColumn(f, q, Bytes.toBytes("a"));<a name="line.543"></a>
+<span class="sourceLineNo">544</span> put.setAttribute("visibility", Bytes.toBytes("tag1"));<a name="line.544"></a>
+<span class="sourceLineNo">545</span> table.put(put);<a name="line.545"></a>
+<span class="sourceLineNo">546</span> Append append = new Append(row3);<a name="line.546"></a>
+<span class="sourceLineNo">547</span> append.addColumn(f, q, Bytes.toBytes("b"));<a name="line.547"></a>
<span class="sourceLineNo">548</span> table.append(append);<a name="line.548"></a>
<span class="sourceLineNo">549</span> TestCoprocessorForTags.checkTagPresence = true;<a name="line.549"></a>
<span class="sourceLineNo">550</span> scanner = table.getScanner(new Scan().withStartRow(row3));<a name="line.550"></a>
<span class="sourceLineNo">551</span> result = scanner.next();<a name="line.551"></a>
<span class="sourceLineNo">552</span> kv = KeyValueUtil.ensureKeyValue(result.getColumnLatestCell(f, q));<a name="line.552"></a>
<span class="sourceLineNo">553</span> tags = TestCoprocessorForTags.tags;<a name="line.553"></a>
-<span class="sourceLineNo">554</span> assertEquals(2, tags.size());<a name="line.554"></a>
-<span class="sourceLineNo">555</span> // We cannot assume the ordering of tags<a name="line.555"></a>
-<span class="sourceLineNo">556</span> tagValues.clear();<a name="line.556"></a>
-<span class="sourceLineNo">557</span> for (Tag tag : tags) {<a name="line.557"></a>
-<span class="sourceLineNo">558</span> tagValues.add(Bytes.toString(Tag.cloneValue(tag)));<a name="line.558"></a>
-<span class="sourceLineNo">559</span> }<a name="line.559"></a>
-<span class="sourceLineNo">560</span> assertTrue(tagValues.contains("tag1"));<a name="line.560"></a>
-<span class="sourceLineNo">561</span> assertTrue(tagValues.contains("tag2"));<a name="line.561"></a>
-<span class="sourceLineNo">562</span> TestCoprocessorForTags.checkTagPresence = false;<a name="line.562"></a>
-<span class="sourceLineNo">563</span> TestCoprocessorForTags.tags = null;<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span> byte[] row4 = Bytes.toBytes("r4");<a name="line.565"></a>
-<span class="sourceLineNo">566</span> put = new Put(row4);<a name="line.566"></a>
-<span class="sourceLineNo">567</span> put.addColumn(f, q, Bytes.toBytes("a"));<a name="line.567"></a>
-<span class="sourceLineNo">568</span> table.put(put);<a name="line.568"></a>
-<span class="sourceLineNo">569</span> append = new Append(row4);<a name="line.569"></a>
-<span class="sourceLineNo">570</span> append.add(new KeyValue(row4, f, q, 1234L, v));<a name="line.570"></a>
-<span class="sourceLineNo">571</span> append.setAttribute("visibility", Bytes.toBytes("tag2"));<a name="line.571"></a>
-<span class="sourceLineNo">572</span> table.append(append);<a name="line.572"></a>
-<span class="sourceLineNo">573</span> TestCoprocessorForTags.checkTagPresence = true;<a name="line.573"></a>
-<span class="sourceLineNo">574</span> scanner = table.getScanner(new Scan().withStartRow(row4));<a name="line.574"></a>
-<span class="sourceLineNo">575</span> result = scanner.next();<a name="line.575"></a>
-<span class="sourceLineNo">576</span> kv = KeyValueUtil.ensureKeyValue(result.getColumnLatestCell(f, q));<a name="line.576"></a>
-<span class="sourceLineNo">577</span> tags = TestCoprocessorForTags.tags;<a name="line.577"></a>
-<span class="sourceLineNo">578</span> assertEquals(1, tags.size());<a name="line.578"></a>
-<span class="sourceLineNo">579</span> assertEquals("tag2", Bytes.toString(Tag.cloneValue(tags.get(0))));<a name="line.579"></a>
-<span class="sourceLineNo">580</span> } finally {<a name="line.580"></a>
-<span class="sourceLineNo">581</span> TestCoprocessorForTags.checkTagPresence = false;<a name="line.581"></a>
-<span class="sourceLineNo">582</span> TestCoprocessorForTags.tags = null;<a name="line.582"></a>
-<span class="sourceLineNo">583</span> if (table != null) {<a name="line.583"></a>
-<span class="sourceLineNo">584</span> table.close();<a name="line.584"></a>
-<span class="sourceLineNo">585</span> }<a name="line.585"></a>
-<span class="sourceLineNo">586</span> }<a name="line.586"></a>
-<span class="sourceLineNo">587</span> }<a name="line.587"></a>
-<span class="sourceLineNo">588</span><a name="line.588"></a>
-<span class="sourceLineNo">589</span> private void result(byte[] fam, byte[] row, byte[] qual, byte[] row2, Table table, byte[] value,<a name="line.589"></a>
-<span class="sourceLineNo">590</span> byte[] value2, byte[] row1, byte[] value1) throws IOException {<a name="line.590"></a>
-<span class="sourceLineNo">591</span> Scan s = new Scan().withStartRow(row);<a name="line.591"></a>
-<span class="sourceLineNo">592</span> // If filters are used this attribute can be specifically check for in<a name="line.592"></a>
-<span class="sourceLineNo">593</span> // filterKV method and<a name="line.593"></a>
-<span class="sourceLineNo">594</span> // kvs can be filtered out if the tags of interest is not found in that kv<a name="line.594"></a>
-<span class="sourceLineNo">595</span> s.setAttribute("visibility", Bytes.toBytes("myTag"));<a name="line.595"></a>
-<span class="sourceLineNo">596</span> ResultScanner scanner = null;<a name="line.596"></a>
-<span class="sourceLineNo">597</span> try {<a name="line.597"></a>
-<span class="sourceLineNo">598</span> scanner = table.getScanner(s);<a name="line.598"></a>
-<span class="sourceLineNo">599</span> Result next = scanner.next();<a name="line.599"></a>
-<span class="sourceLineNo">600</span><a name="line.600"></a>
-<span class="sourceLineNo">601</span> assertTrue(Bytes.equals(next.getRow(), row));<a name="line.601"></a>
-<span class="sourceLineNo">602</span> assertTrue(Bytes.equals(next.getValue(fam, qual), value));<a name="line.602"></a>
-<span class="sourceLineNo">603</span><a name="line.603"></a>
-<span class="sourceLineNo">604</span> Result next2 = scanner.next();<a name="line.604"></a>
-<span class="sourceLineNo">605</span> assertTrue(next2 != null);<a name="line.605"></a>
-<span class="sourceLineNo">606</span> assertTrue(Bytes.equals(next2.getRow(), row1));<a name="line.606"></a>
-<span class="sourceLineNo">607</span> assertTrue(Bytes.equals(next2.getValue(fam, qual), value1));<a name="line.607"></a>
-<span class="sourceLineNo">608</span><a name="line.608"></a>
-<span class="sourceLineNo">609</span> next2 = scanner.next();<a name="line.609"></a>
-<span class="sourceLineNo">610</span> assertTrue(next2 != null);<a name="line.610"></a>
-<span class="sourceLineNo">611</span> assertTrue(Bytes.equals(next2.getRow(), row2));<a name="line.611"></a>
-<span class="sourceLineNo">612</span> assertTrue(Bytes.equals(next2.getValue(fam, qual), value2));<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span> } finally {<a name="line.614"></a>
-<span class="sourceLineNo">615</span> if (scanner != null) scanner.close();<a name="line.615"></a>
-<span class="sourceLineNo">616</span> }<a name="line.616"></a>
-<span class="sourceLineNo">617</span> }<a name="line.617"></a>
-<span class="sourceLineNo">618</span><a name="line.618"></a>
-<span class="sourceLineNo">619</span> public static class TestCoprocessorForTags implements RegionCoprocessor, RegionObserver {<a name="line.619"></a>
-<span class="sourceLineNo">620</span><a name="line.620"></a>
-<span class="sourceLineNo">621</span> public static volatile boolean checkTagPresence = false;<a name="line.621"></a>
-<span class="sourceLineNo">622</span> public static List<Tag> tags = null;<a name="line.622"></a>
-<span class="sourceLineNo">623</span><a name="line.623"></a>
-<span class="sourceLineNo">624</span> @Override<a name="line.624"></a>
-<span class="sourceLineNo">625</span> public Optional<RegionObserver> getRegionObserver() {<a name="line.625"></a>
-<span class="sourceLineNo">626</span> return Optional.of(this);<a name="line.626"></a>
-<span class="sourceLineNo">627</span> }<a name="line.627"></a>
-<span class="sourceLineNo">628</span><a name="line.628"></a>
-<span class="sourceLineNo">629</span> @Override<a name="line.629"></a>
-<span class="sourceLineNo">630</span> public void prePut(final ObserverContext<RegionCoprocessorEnvironment> e, final Put put,<a name="line.630"></a>
-<span class="sourceLineNo">631</span> final WALEdit edit, final Durability durability) throws IOException {<a name="line.631"></a>
-<span class="sourceLineNo">632</span> updateMutationAddingTags(put);<a name="line.632"></a>
-<span class="sourceLineNo">633</span> }<a name="line.633"></a>
+<span class="sourceLineNo">554</span> assertEquals(1, tags.size());<a name="line.554"></a>
+<span class="sourceLineNo">555</span> assertEquals("tag1", Bytes.toString(Tag.cloneValue(tags.get(0))));<a name="line.555"></a>
+<span class="sourceLineNo">556</span> TestCoprocessorForTags.checkTagPresence = false;<a name="line.556"></a>
+<span class="sourceLineNo">557</span> TestCoprocessorForTags.tags = null;<a name="line.557"></a>
+<span class="sourceLineNo">558</span><a name="line.558"></a>
+<span class="sourceLineNo">559</span> append = new Append(row3);<a name="line.559"></a>
+<span class="sourceLineNo">560</span> append.add(new KeyValue(row3, f, q, 1234L, v));<a name="line.560"></a>
+<span class="sourceLineNo">561</span> append.setAttribute("visibility", Bytes.toBytes("tag2"));<a name="line.561"></a>
+<span class="sourceLineNo">562</span> table.append(append);<a name="line.562"></a>
+<span class="sourceLineNo">563</span> TestCoprocessorForTags.checkTagPresence = true;<a name="line.563"></a>
+<span class="sourceLineNo">564</span> scanner = table.getScanner(new Scan().withStartRow(row3));<a name="line.564"></a>
+<span class="sourceLineNo">565</span> result = scanner.next();<a name="line.565"></a>
+<span class="sourceLineNo">566</span> kv = KeyValueUtil.ensureKeyValue(result.getColumnLatestCell(f, q));<a name="line.566"></a>
+<span class="sourceLineNo">567</span> tags = TestCoprocessorForTags.tags;<a name="line.567"></a>
+<span class="sourceLineNo">568</span> assertEquals(2, tags.size());<a name="line.568"></a>
+<span class="sourceLineNo">569</span> // We cannot assume the ordering of tags<a name="line.569"></a>
+<span class="sourceLineNo">570</span> tagValues.clear();<a name="line.570"></a>
+<span class="sourceLineNo">571</span> for (Tag tag : tags) {<a name="line.571"></a>
+<span class="sourceLineNo">572</span> tagValues.add(Bytes.toString(Tag.cloneValue(tag)));<a name="line.572"></a>
+<span class="sourceLineNo">573</span> }<a name="line.573"></a>
+<span class="sourceLineNo">574</span> assertTrue(tagValues.contains("tag1"));<a name="line.574"></a>
+<span class="sourceLineNo">575</span> assertTrue(tagValues.contains("tag2"));<a name="line.575"></a>
+<span class="sourceLineNo">576</span> TestCoprocessorForTags.checkTagPresence = false;<a name="line.576"></a>
+<span class="sourceLineNo">577</span> TestCoprocessorForTags.tags = null;<a name="line.577"></a>
+<span class="sourceLineNo">578</span><a name="line.578"></a>
+<span class="sourceLineNo">579</span> byte[] row4 = Bytes.toBytes("r4");<a name="line.579"></a>
+<span class="sourceLineNo">580</span> put = new Put(row4);<a name="line.580"></a>
+<span class="sourceLineNo">581</span> put.addColumn(f, q, Bytes.toBytes("a"));<a name="line.581"></a>
+<span class="sourceLineNo">582</span> table.put(put);<a name="line.582"></a>
+<span class="sourceLineNo">583</span> append = new Append(row4);<a name="line.583"></a>
+<span class="sourceLineNo">584</span> append.add(new KeyValue(row4, f, q, 1234L, v));<a name="line.584"></a>
+<span class="sourceLineNo">585</span> append.setAttribute("visibility", Bytes.toBytes("tag2"));<a name="line.585"></a>
+<span class="sourceLineNo">586</span> table.append(append);<a name="line.586"></a>
+<span class="sourceLineNo">587</span> TestCoprocessorForTags.checkTagPresence = true;<a name="line.587"></a>
+<span class="sourceLineNo">588</span> scanner = table.getScanner(new Scan().withStartRow(row4));<a name="line.588"></a>
+<span class="sourceLineNo">589</span> result = scanner.next();<a name="line.589"></a>
+<span class="sourceLineNo">590</span> kv = KeyValueUtil.ensureKeyValue(result.getColumnLatestCell(f, q));<a name="line.590"></a>
+<span class="sourceLineNo">591</span> tags = TestCoprocessorForTags.tags;<a name="line.591"></a>
+<span class="sourceLineNo">592</span> assertEquals(1, tags.size());<a name="line.592"></a>
+<span class="sourceLineNo">593</span> assertEquals("tag2", Bytes.toString(Tag.cloneValue(tags.get(0))));<a name="line.593"></a>
+<span class="sourceLineNo">594</span> } finally {<a name="line.594"></a>
+<span class="sourceLineNo">595</span> TestCoprocessorForTags.checkTagPresence = false;<a name="line.595"></a>
+<span class="sourceLineNo">596</span> TestCoprocessorForTags.tags = null;<a name="line.596"></a>
+<span class="sourceLineNo">597</span> if (table != null) {<a name="line.597"></a>
+<span class="sourceLineNo">598</span> table.close();<a name="line.598"></a>
+<span class="sourceLineNo">599</span> }<a name="line.599"></a>
+<span class="sourceLineNo">600</span> }<a name="line.600"></a>
+<span class="sourceLineNo">601</span> }<a name="line.601"></a>
+<span class="sourceLineNo">602</span><a name="line.602"></a>
+<span class="sourceLineNo">603</span> private void result(byte[] fam, byte[] row, byte[] qual, byte[] row2, Table table, byte[] value,<a name="line.603"></a>
+<span class="sourceLineNo">604</span> byte[] value2, byte[] row1, byte[] value1) throws IOException {<a name="line.604"></a>
+<span class="sourceLineNo">605</span> Scan s = new Scan().withStartRow(row);<a name="line.605"></a>
+<span class="sourceLineNo">606</span> // If filters are used this attribute can be specifically check for in<a name="line.606"></a>
+<span class="sourceLineNo">607</span> // filterKV method and<a name="line.607"></a>
+<span class="sourceLineNo">608</span> // kvs can be filtered out if the tags of interest is not found in that kv<a name="line.608"></a>
+<span class="sourceLineNo">609</span> s.setAttribute("visibility", Bytes.toBytes("myTag"));<a name="line.609"></a>
+<span class="sourceLineNo">610</span> ResultScanner scanner = null;<a name="line.610"></a>
+<span class="sourceLineNo">611</span> try {<a name="line.611"></a>
+<span class="sourceLineNo">612</span> scanner = table.getScanner(s);<a name="line.612"></a>
+<span class="sourceLineNo">613</span> Result next = scanner.next();<a name="line.613"></a>
+<span class="sourceLineNo">614</span><a name="line.614"></a>
+<span class="sourceLineNo">615</span> assertTrue(Bytes.equals(next.getRow(), row));<a name="line.615"></a>
+<span class="sourceLineNo">616</span> assertTrue(Bytes.equals(next.getValue(fam, qual), value));<a name="line.616"></a>
+<span class="sourceLineNo">617</span><a name="line.617"></a>
+<span class="sourceLineNo">618</span> Result next2 = scanner.next();<a name="line.618"></a>
+<span class="sourceLineNo">619</span> assertTrue(next2 != null);<a name="line.619"></a>
+<span class="sourceLineNo">620</span> assertTrue(Bytes.equals(next2.getRow(), row1));<a name="line.620"></a>
+<span class="sourceLineNo">621</span> assertTrue(Bytes.equals(next2.getValue(fam, qual), value1));<a name="line.621"></a>
+<span class="sourceLineNo">622</span><a name="line.622"></a>
+<span class="sourceLineNo">623</span> next2 = scanner.next();<a name="line.623"></a>
+<span class="sourceLineNo">624</span> assertTrue(next2 != null);<a name="line.624"></a>
+<span class="sourceLineNo">625</span> assertTrue(Bytes.equals(next2.getRow(), row2));<a name="line.625"></a>
+<span class="sourceLineNo">626</span> assertTrue(Bytes.equals(next2.getValue(fam, qual), value2));<a name="line.626"></a>
+<span class="sourceLineNo">627</span><a name="line.627"></a>
+<span class="sourceLineNo">628</span> } finally {<a name="line.628"></a>
+<span class="sourceLineNo">629</span> if (scanner != null) scanner.close();<a name="line.629"></a>
+<span class="sourceLineNo">630</span> }<a name="line.630"></a>
+<span class="sourceLineNo">631</span> }<a name="line.631"></a>
+<span class="sourceLineNo">632</span><a name="line.632"></a>
+<span class="sourceLineNo">633</span> public static class TestCoprocessorForTags implements RegionCoprocessor, RegionObserver {<a name="line.633"></a>
<span class="sourceLineNo">634</span><a name="line.634"></a>
-<span class="sourceLineNo">635</span> private void updateMutationAddingTags(final Mutation m) {<a name="line.635"></a>
-<span class="sourceLineNo">636</span> byte[] attribute = m.getAttribute("visibility");<a name="line.636"></a>
-<span class="sourceLineNo">637</span> byte[] cf = null;<a name="line.637"></a>
-<span class="sourceLineNo">638</span> List<Cell> updatedCells = new ArrayList<>();<a name="line.638"></a>
-<span class="sourceLineNo">639</span> if (attribute != null) {<a name="line.639"></a>
-<span class="sourceLineNo">640</span> for (List<? extends Cell> edits : m.getFamilyCellMap().values()) {<a name="line.640"></a>
-<span class="sourceLineNo">641</span> for (Cell cell : edits) {<a name="line.641"></a>
-<span class="sourceLineNo">642</span> KeyValue kv = KeyValueUtil.ensureKeyValue(cell);<a name="line.642"></a>
-<span class="sourceLineNo">643</span> if (cf == null) {<a name="line.643"></a>
-<span class="sourceLineNo">644</span> cf = CellUtil.cloneFamily(kv);<a name="line.644"></a>
-<span class="sourceLineNo">645</span> }<a name="line.645"></a>
-<span class="sourceLineNo">646</span> Tag tag = new ArrayBackedTag((byte) 1, attribute);<a name="line.646"></a>
-<span class="sourceLineNo">647</span> List<Tag> tagList = new ArrayList<>();<a name="line.647"></a>
-<span class="sourceLineNo">648</span> tagList.add(tag);<a name="line.648"></a>
-<span class="sourceLineNo">649</span><a name="line.649"></a>
-<span class="sourceLineNo">650</span> KeyValue newKV =<a name="line.650"></a>
-<span class="sourceLineNo">651</span> new KeyValue(CellUtil.cloneRow(kv), 0, kv.getRowLength(), CellUtil.cloneFamily(kv), 0,<a name="line.651"></a>
-<span class="sourceLineNo">652</span> kv.getFamilyLength(), CellUtil.cloneQualifier(kv), 0, kv.getQualifierLength(),<a name="line.652"></a>
-<span class="sourceLineNo">653</span> kv.getTimestamp(), KeyValue.Type.codeToType(kv.getTypeByte()),<a name="line.653"></a>
-<span class="sourceLineNo">654</span> CellUtil.cloneValue(kv), 0, kv.getValueLength(), tagList);<a name="line.654"></a>
-<span class="sourceLineNo">655</span> ((List<Cell>) updatedCells).add(newKV);<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> m.getFamilyCellMap().remove(cf);<a name="line.658"></a>
-<span class="sourceLineNo">659</span> // Update the family map<a name="line.659"></a>
-<span class="sourceLineNo">660</span> m.getFamilyCellMap().put(cf, updatedCells);<a name="line.660"></a>
-<span class="sourceLineNo">661</span> }<a name="line.661"></a>
-<span class="sourceLineNo">662</span> }<a name="line.662"></a>
+<span class="sourceLineNo">635</span> public static volatile boolean checkTagPresence = false;<a name="line.635"></a>
+<span class="sourceLineNo">636</span> public static List<Tag> tags = null;<a name="line.636"></a>
+<span class="sourceLineNo">637</span><a name="line.637"></a>
+<span class="sourceLineNo">638</span> @Override<a name="line.638"></a>
+<span class="sourceLineNo">639</span> public Optional<RegionObserver> getRegionObserver() {<a name="line.639"></a>
+<span class="sourceLineNo">640</span> return Optional.of(this);<a name="line.640"></a>
+<span class="sourceLineNo">641</span> }<a name="line.641"></a>
+<span class="sourceLineNo">642</span><a name="line.642"></a>
+<span class="sourceLineNo">643</span> @Override<a name="line.643"></a>
+<span class="sourceLineNo">644</span> public void prePut(final ObserverContext<RegionCoprocessorEnvironment> e, final Put put,<a name="line.644"></a>
+<span class="sourceLineNo">645</span> final WALEdit edit, final Durability durability) throws IOException {<a name="line.645"></a>
+<span class="sourceLineNo">646</span> updateMutationAddingTags(put);<a name="line.646"></a>
+<span class="sourceLineNo">647</span> }<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span> private void updateMutationAddingTags(final Mutation m) {<a name="line.649"></a>
+<span class="sourceLineNo">650</span> byte[] attribute = m.getAttribute("visibility");<a name="line.650"></a>
+<span class="sourceLineNo">651</span> byte[] cf = null;<a name="line.651"></a>
+<span class="sourceLineNo">652</span> List<Cell> updatedCells = new ArrayList<>();<a name="line.652"></a>
+<span class="sourceLineNo">653</span> if (attribute != null) {<a name="line.653"></a>
+<span class="sourceLineNo">654</span> for (List<? extends Cell> edits : m.getFamilyCellMap().values()) {<a name="line.654"></a>
+<span class="sourceLineNo">655</span> for (Cell cell : edits) {<a name="line.655"></a>
+<span class="sourceLineNo">656</span> KeyValue kv = KeyValueUtil.ensureKeyValue(cell);<a name="line.656"></a>
+<span class="sourceLineNo">657</span> if (cf == null) {<a name="line.657"></a>
+<span class="sourceLineNo">658</span> cf = CellUtil.cloneFamily(kv);<a name="line.658"></a>
+<span class="sourceLineNo">659</span> }<a name="line.659"></a>
+<span class="sourceLineNo">660</span> Tag tag = new ArrayBackedTag((byte) 1, attribute);<a name="line.660"></a>
+<span class="sourceLineNo">661</span> List<Tag> tagList = new ArrayList<>();<a name="line.661"></a>
+<span class="sourceLineNo">662</span> tagList.add(tag);<a name="line.662"></a>
<span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span> @Override<a name="line.664"></a>
-<span class="sourceLineNo">665</span> public Result preIncrement(ObserverContext<RegionCoprocessorEnvironment> e, Increment increment)<a name="line.665"></a>
-<span class="sourceLineNo">666</span> throws IOException {<a name="line.666"></a>
-<span class="sourceLineNo">667</span> updateMutationAddingTags(increment);<a name="line.667"></a>
-<span class="sourceLineNo">668</span> return null;<a name="line.668"></a>
-<span class="sourceLineNo">669</span> }<a name="line.669"></a>
-<span class="sourceLineNo">670</span><a name="line.670"></a>
-<span class="sourceLineNo">671</span> @Override<a name="line.671"></a>
-<span class="sourceLineNo">672</span> public Result preAppend(ObserverContext<RegionCoprocessorEnvironment> e, Append append)<a name="line.672"></a>
-<span class="sourceLineNo">673</span> throws IOException {<a name="line.673"></a>
-<span class="sourceLineNo">674</span> updateMutationAddingTags(append);<a name="line.674"></a>
-<span class="sourceLineNo">675</span> return null;<a name="line.675"></a>
+<span class="sourceLineNo">664</span> KeyValue newKV =<a name="line.664"></a>
+<span class="sourceLineNo">665</span> new KeyValue(CellUtil.cloneRow(kv), 0, kv.getRowLength(), CellUtil.cloneFamily(kv), 0,<a name="line.665"></a>
+<span class="sourceLineNo">666</span> kv.getFamilyLength(), CellUtil.cloneQualifier(kv), 0, kv.getQualifierLength(),<a name="line.666"></a>
+<span class="sourceLineNo">667</span> kv.getTimestamp(), KeyValue.Type.codeToType(kv.getTypeByte()),<a name="line.667"></a>
+<span class="sourceLineNo">668</span> CellUtil.cloneValue(kv), 0, kv.getValueLength(), tagList);<a name="line.668"></a>
+<span class="sourceLineNo">669</span> ((List<Cell>) updatedCells).add(newKV);<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> m.getFamilyCellMap().remove(cf);<a name="line.672"></a>
+<span class="sourceLineNo">673</span> // Update the family map<a name="line.673"></a>
+<span class="sourceLineNo">674</span> m.getFamilyCellMap().put(cf, updatedCells);<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><a name="line.677"></a>
<span class="sourceLineNo">678</span> @Override<a name="line.678"></a>
-<span class="sourceLineNo">679</span> public boolean postScannerNext(ObserverContext<RegionCoprocessorEnvironment> e,<a name="line.679"></a>
-<span class="sourceLineNo">680</span> InternalScanner s, List<Result> results, int limit, boolean hasMore) throws IOException {<a name="line.680"></a>
-<span class="sourceLineNo">681</span> if (checkTagPresence) {<a name="line.681"></a>
-<span class="sourceLineNo">682</span> if (results.size() > 0) {<a name="line.682"></a>
-<span class="sourceLineNo">683</span> // Check tag presence in the 1st cell in 1st Result<a name="line.683"></a>
-<span class="sourceLineNo">684</span> Result result = results.get(0);<a name="line.684"></a>
-<span class="sourceLineNo">685</span> CellScanner cellScanner = result.cellScanner();<a name="line.685"></a>
-<span class="sourceLineNo">686</span> if (cellScanner.advance()) {<a name="line.686"></a>
-<span class="sourceLineNo">687</span> Cell cell = cellScanner.current();<a name="line.687"></a>
-<span class="sourceLineNo">688</span> tags = PrivateCellUtil.getTags(cell);<a name="line.688"></a>
-<span class="sourceLineNo">689</span> }<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> return hasMore;<a name="line.692"></a>
-<span class="sourceLineNo">693</span> }<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">679</span> public Result preIncrement(ObserverContext<RegionCoprocessorEnvironment> e, Increment increment)<a name="line.679"></a>
+<span class="sourceLineNo">680</span> throws IOException {<a name="line.680"></a>
+<span class="sourceLineNo">681</span> updateMutationAddingTags(increment);<a name="line.681"></a>
+<span class="sourceLineNo">682</span> return null;<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> @Override<a name="line.685"></a>
+<span class="sourceLineNo">686</span> public Result preAppend(ObserverContext<RegionCoprocessorEnvironment> e, Append append)<a name="line.686"></a>
+<span class="sourceLineNo">687</span> throws IOException {<a name="line.687"></a>
+<span class="sourceLineNo">688</span> updateMutationAddingTags(append);<a name="line.688"></a>
+<span class="sourceLineNo">689</span> return null;<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> @Override<a name="line.692"></a>
+<span class="sourceLineNo">693</span> public boolean postScannerNext(ObserverContext<RegionCoprocessorEnvironment> e,<a name="line.693"></a>
+<span class="sourceLineNo">694</span> InternalScanner s, List<Result> results, int limit, boolean hasMore) throws IOException {<a name="line.694"></a>
+<span class="sourceLineNo">695</span> if (checkTagPresence) {<a name="line.695"></a>
+<span class="sourceLineNo">696</span> if (results.size() > 0) {<a name="line.696"></a>
+<span class="sourceLineNo">697</span> // Check tag presence in the 1st cell in 1st Result<a name="line.697"></a>
+<span class="sourceLineNo">698</span> Result result = results.get(0);<a name="line.698"></a>
+<span class="sourceLineNo">699</span> CellScanner cellScanner = result.cellScanner();<a name="line.699"></a>
+<span class="sourceLineNo">700</span> if (cellScanner.advance()) {<a name="line.700"></a>
+<span class="sourceLineNo">701</span> Cell cell = cellScanner.current();<a name="line.701"></a>
+<span class="sourceLineNo">702</span> tags = PrivateCellUtil.getTags(cell);<a name="line.702"></a>
+<span class="sourceLineNo">703</span> }<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> return hasMore;<a name="line.706"></a>
+<span class="sourceLineNo">707</span> }<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>
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestTags.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestTags.html
index 685ff579058..e92fcf93cb4 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestTags.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestTags.html
@@ -132,575 +132,589 @@
<span class="sourceLineNo">124</span><a name="line.124"></a>
<span class="sourceLineNo">125</span> try (Connection connection = ConnectionFactory.createConnection(conf)) {<a name="line.125"></a>
<span class="sourceLineNo">126</span> for (DataBlockEncoding encoding : DataBlockEncoding.values()) {<a name="line.126"></a>
-<span class="sourceLineNo">127</span> testReverseScanWithDBE(connection, encoding, family);<a name="line.127"></a>
+<span class="sourceLineNo">127</span> testReverseScanWithDBE(connection, encoding, family, HConstants.DEFAULT_BLOCKSIZE, 10);<a name="line.127"></a>
<span class="sourceLineNo">128</span> }<a name="line.128"></a>
<span class="sourceLineNo">129</span> }<a name="line.129"></a>
<span class="sourceLineNo">130</span> }<a name="line.130"></a>
<span class="sourceLineNo">131</span><a name="line.131"></a>
-<span class="sourceLineNo">132</span> private void testReverseScanWithDBE(Connection conn, DataBlockEncoding encoding, byte[] family)<a name="line.132"></a>
-<span class="sourceLineNo">133</span> throws IOException {<a name="line.133"></a>
-<span class="sourceLineNo">134</span> LOG.info("Running test with DBE={}", encoding);<a name="line.134"></a>
-<span class="sourceLineNo">135</span> TableName tableName = TableName.valueOf(TEST_NAME.getMethodName() + "-" + encoding);<a name="line.135"></a>
-<span class="sourceLineNo">136</span> TEST_UTIL.createTable(TableDescriptorBuilder.newBuilder(tableName)<a name="line.136"></a>
-<span class="sourceLineNo">137</span> .setColumnFamily(<a name="line.137"></a>
-<span class="sourceLineNo">138</span> ColumnFamilyDescriptorBuilder.newBuilder(family).setDataBlockEncoding(encoding).build())<a name="line.138"></a>
-<span class="sourceLineNo">139</span> .build(), null);<a name="line.139"></a>
-<span class="sourceLineNo">140</span><a name="line.140"></a>
-<span class="sourceLineNo">141</span> Table table = conn.getTable(tableName);<a name="line.141"></a>
+<span class="sourceLineNo">132</span> /**<a name="line.132"></a>
+<span class="sourceLineNo">133</span> * Test that we can do reverse scans when writing tags and using DataBlockEncoding. Fails with an<a name="line.133"></a>
+<span class="sourceLineNo">134</span> * exception for PREFIX, DIFF, and FAST_DIFF<a name="line.134"></a>
+<span class="sourceLineNo">135</span> */<a name="line.135"></a>
+<span class="sourceLineNo">136</span> @Test<a name="line.136"></a>
+<span class="sourceLineNo">137</span> public void testReverseScanWithDBEWhenCurrentBlockUpdates() throws IOException {<a name="line.137"></a>
+<span class="sourceLineNo">138</span> byte[] family = Bytes.toBytes("0");<a name="line.138"></a>
+<span class="sourceLineNo">139</span><a name="line.139"></a>
+<span class="sourceLineNo">140</span> Configuration conf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.140"></a>
+<span class="sourceLineNo">141</span> conf.setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, 1);<a name="line.141"></a>
<span class="sourceLineNo">142</span><a name="line.142"></a>
-<span class="sourceLineNo">143</span> int maxRows = 10;<a name="line.143"></a>
-<span class="sourceLineNo">144</span> byte[] val1 = new byte[10];<a name="line.144"></a>
-<span class="sourceLineNo">145</span> byte[] val2 = new byte[10];<a name="line.145"></a>
-<span class="sourceLineNo">146</span> Bytes.random(val1);<a name="line.146"></a>
-<span class="sourceLineNo">147</span> Bytes.random(val2);<a name="line.147"></a>
-<span class="sourceLineNo">148</span><a name="line.148"></a>
-<span class="sourceLineNo">149</span> for (int i = 0; i < maxRows; i++) {<a name="line.149"></a>
-<span class="sourceLineNo">150</span> if (i == maxRows / 2) {<a name="line.150"></a>
-<span class="sourceLineNo">151</span> TEST_UTIL.flush(tableName);<a name="line.151"></a>
-<span class="sourceLineNo">152</span> }<a name="line.152"></a>
-<span class="sourceLineNo">153</span> table.put(new Put(Bytes.toBytes(i)).addColumn(family, Bytes.toBytes(1), val1)<a name="line.153"></a>
-<span class="sourceLineNo">154</span> .addColumn(family, Bytes.toBytes(2), val2).setTTL(600_000));<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> TEST_UTIL.flush(table.getName());<a name="line.157"></a>
+<span class="sourceLineNo">143</span> try (Connection connection = ConnectionFactory.createConnection(conf)) {<a name="line.143"></a>
+<span class="sourceLineNo">144</span> for (DataBlockEncoding encoding : DataBlockEncoding.values()) {<a name="line.144"></a>
+<span class="sourceLineNo">145</span> testReverseScanWithDBE(connection, encoding, family, 1024, 30000);<a name="line.145"></a>
+<span class="sourceLineNo">146</span> }<a name="line.146"></a>
+<span class="sourceLineNo">147</span> }<a name="line.147"></a>
+<span class="sourceLineNo">148</span> }<a name="line.148"></a>
+<span class="sourceLineNo">149</span><a name="line.149"></a>
+<span class="sourceLineNo">150</span> private void testReverseScanWithDBE(Connection conn, DataBlockEncoding encoding, byte[] family,<a name="line.150"></a>
+<span class="sourceLineNo">151</span> int blockSize, int maxRows) throws IOException {<a name="line.151"></a>
+<span class="sourceLineNo">152</span> LOG.info("Running test with DBE={}", encoding);<a name="line.152"></a>
+<span class="sourceLineNo">153</span> TableName tableName = TableName.valueOf(TEST_NAME.getMethodName() + "-" + encoding);<a name="line.153"></a>
+<span class="sourceLineNo">154</span> TEST_UTIL.createTable(<a name="line.154"></a>
+<span class="sourceLineNo">155</span> TableDescriptorBuilder.newBuilder(tableName).setColumnFamily(ColumnFamilyDescriptorBuilder<a name="line.155"></a>
+<span class="sourceLineNo">156</span> .newBuilder(family).setDataBlockEncoding(encoding).setBlocksize(blockSize).build()).build(),<a name="line.156"></a>
+<span class="sourceLineNo">157</span> null);<a name="line.157"></a>
<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span> Scan scan = new Scan();<a name="line.159"></a>
-<span class="sourceLineNo">160</span> scan.setReversed(true);<a name="line.160"></a>
-<span class="sourceLineNo">161</span><a name="line.161"></a>
-<span class="sourceLineNo">162</span> try (ResultScanner scanner = table.getScanner(scan)) {<a name="line.162"></a>
-<span class="sourceLineNo">163</span> for (int i = maxRows - 1; i >= 0; i--) {<a name="line.163"></a>
-<span class="sourceLineNo">164</span> Result row = scanner.next();<a name="line.164"></a>
-<span class="sourceLineNo">165</span> assertEquals(2, row.size());<a name="line.165"></a>
-<span class="sourceLineNo">166</span><a name="line.166"></a>
-<span class="sourceLineNo">167</span> Cell cell1 = row.getColumnLatestCell(family, Bytes.toBytes(1));<a name="line.167"></a>
-<span class="sourceLineNo">168</span> assertTrue(CellUtil.matchingRows(cell1, Bytes.toBytes(i)));<a name="line.168"></a>
-<span class="sourceLineNo">169</span> assertTrue(CellUtil.matchingValue(cell1, val1));<a name="line.169"></a>
+<span class="sourceLineNo">159</span> Table table = conn.getTable(tableName);<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span> byte[] val1 = new byte[10];<a name="line.161"></a>
+<span class="sourceLineNo">162</span> byte[] val2 = new byte[10];<a name="line.162"></a>
+<span class="sourceLineNo">163</span> Bytes.random(val1);<a name="line.163"></a>
+<span class="sourceLineNo">164</span> Bytes.random(val2);<a name="line.164"></a>
+<span class="sourceLineNo">165</span><a name="line.165"></a>
+<span class="sourceLineNo">166</span> for (int i = 0; i < maxRows; i++) {<a name="line.166"></a>
+<span class="sourceLineNo">167</span> table.put(new Put(Bytes.toBytes(i)).addColumn(family, Bytes.toBytes(1), val1)<a name="line.167"></a>
+<span class="sourceLineNo">168</span> .addColumn(family, Bytes.toBytes(2), val2).setTTL(600_000));<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> Cell cell2 = row.getColumnLatestCell(family, Bytes.toBytes(2));<a name="line.171"></a>
-<span class="sourceLineNo">172</span> assertTrue(CellUtil.matchingRows(cell2, Bytes.toBytes(i)));<a name="line.172"></a>
-<span class="sourceLineNo">173</span> assertTrue(CellUtil.matchingValue(cell2, val2));<a name="line.173"></a>
-<span class="sourceLineNo">174</span> }<a name="line.174"></a>
-<span class="sourceLineNo">175</span> }<a name="line.175"></a>
-<span class="sourceLineNo">176</span><a name="line.176"></a>
-<span class="sourceLineNo">177</span> }<a name="line.177"></a>
-<span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span> @Test<a name="line.179"></a>
-<span class="sourceLineNo">180</span> public void testTags() throws Exception {<a name="line.180"></a>
-<span class="sourceLineNo">181</span> Table table = null;<a name="line.181"></a>
-<span class="sourceLineNo">182</span> try {<a name="line.182"></a>
-<span class="sourceLineNo">183</span> TableName tableName = TableName.valueOf(TEST_NAME.getMethodName());<a name="line.183"></a>
-<span class="sourceLineNo">184</span> byte[] fam = Bytes.toBytes("info");<a name="line.184"></a>
-<span class="sourceLineNo">185</span> byte[] row = Bytes.toBytes("rowa");<a name="line.185"></a>
-<span class="sourceLineNo">186</span> // column names<a name="line.186"></a>
-<span class="sourceLineNo">187</span> byte[] qual = Bytes.toBytes("qual");<a name="line.187"></a>
-<span class="sourceLineNo">188</span><a name="line.188"></a>
-<span class="sourceLineNo">189</span> byte[] row1 = Bytes.toBytes("rowb");<a name="line.189"></a>
+<span class="sourceLineNo">171</span> TEST_UTIL.flush(table.getName());<a name="line.171"></a>
+<span class="sourceLineNo">172</span><a name="line.172"></a>
+<span class="sourceLineNo">173</span> Scan scan = new Scan();<a name="line.173"></a>
+<span class="sourceLineNo">174</span> scan.setReversed(true);<a name="line.174"></a>
+<span class="sourceLineNo">175</span><a name="line.175"></a>
+<span class="sourceLineNo">176</span> try (ResultScanner scanner = table.getScanner(scan)) {<a name="line.176"></a>
+<span class="sourceLineNo">177</span> for (int i = maxRows - 1; i >= 0; i--) {<a name="line.177"></a>
+<span class="sourceLineNo">178</span> Result row = scanner.next();<a name="line.178"></a>
+<span class="sourceLineNo">179</span> assertEquals(2, row.size());<a name="line.179"></a>
+<span class="sourceLineNo">180</span><a name="line.180"></a>
+<span class="sourceLineNo">181</span> Cell cell1 = row.getColumnLatestCell(family, Bytes.toBytes(1));<a name="line.181"></a>
+<span class="sourceLineNo">182</span> assertTrue(CellUtil.matchingRows(cell1, Bytes.toBytes(i)));<a name="line.182"></a>
+<span class="sourceLineNo">183</span> assertTrue(CellUtil.matchingValue(cell1, val1));<a name="line.183"></a>
+<span class="sourceLineNo">184</span><a name="line.184"></a>
+<span class="sourceLineNo">185</span> Cell cell2 = row.getColumnLatestCell(family, Bytes.toBytes(2));<a name="line.185"></a>
+<span class="sourceLineNo">186</span> assertTrue(CellUtil.matchingRows(cell2, Bytes.toBytes(i)));<a name="line.186"></a>
+<span class="sourceLineNo">187</span> assertTrue(CellUtil.matchingValue(cell2, val2));<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> byte[] row2 = Bytes.toBytes("rowc");<a name="line.191"></a>
+<span class="sourceLineNo">191</span> }<a name="line.191"></a>
<span class="sourceLineNo">192</span><a name="line.192"></a>
-<span class="sourceLineNo">193</span> TableDescriptor tableDescriptor =<a name="line.193"></a>
-<span class="sourceLineNo">194</span> TableDescriptorBuilder<a name="line.194"></a>
-<span class="sourceLineNo">195</span> .newBuilder(tableName).setColumnFamily(ColumnFamilyDescriptorBuilder.newBuilder(fam)<a name="line.195"></a>
-<span class="sourceLineNo">196</span> .setBlockCacheEnabled(true).setDataBlockEncoding(DataBlockEncoding.NONE).build())<a name="line.196"></a>
-<span class="sourceLineNo">197</span> .build();<a name="line.197"></a>
-<span class="sourceLineNo">198</span> Admin admin = TEST_UTIL.getAdmin();<a name="line.198"></a>
-<span class="sourceLineNo">199</span> admin.createTable(tableDescriptor);<a name="line.199"></a>
-<span class="sourceLineNo">200</span> byte[] value = Bytes.toBytes("value");<a name="line.200"></a>
-<span class="sourceLineNo">201</span> table = TEST_UTIL.getConnection().getTable(tableName);<a name="line.201"></a>
-<span class="sourceLineNo">202</span> Put put = new Put(row);<a name="line.202"></a>
-<span class="sourceLineNo">203</span> put.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, value);<a name="line.203"></a>
-<span class="sourceLineNo">204</span> put.setAttribute("visibility", Bytes.toBytes("myTag"));<a name="line.204"></a>
-<span class="sourceLineNo">205</span> table.put(put);<a name="line.205"></a>
-<span class="sourceLineNo">206</span> admin.flush(tableName);<a name="line.206"></a>
-<span class="sourceLineNo">207</span> // We are lacking an API for confirming flush request compaction.<a name="line.207"></a>
-<span class="sourceLineNo">208</span> // Just sleep for a short time. We won't be able to confirm flush<a name="line.208"></a>
-<span class="sourceLineNo">209</span> // completion but the test won't hang now or in the future if<a name="line.209"></a>
-<span class="sourceLineNo">210</span> // default compaction policy causes compaction between flush and<a name="line.210"></a>
-<span class="sourceLineNo">211</span> // when we go to confirm it.<a name="line.211"></a>
-<span class="sourceLineNo">212</span> Thread.sleep(1000);<a name="line.212"></a>
-<span class="sourceLineNo">213</span><a name="line.213"></a>
-<span class="sourceLineNo">214</span> Put put1 = new Put(row1);<a name="line.214"></a>
-<span class="sourceLineNo">215</span> byte[] value1 = Bytes.toBytes("1000dfsdf");<a name="line.215"></a>
-<span class="sourceLineNo">216</span> put1.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, value1);<a name="line.216"></a>
-<span class="sourceLineNo">217</span> // put1.setAttribute("visibility", Bytes.toBytes("myTag3"));<a name="line.217"></a>
-<span class="sourceLineNo">218</span> table.put(put1);<a name="line.218"></a>
-<span class="sourceLineNo">219</span> admin.flush(tableName);<a name="line.219"></a>
-<span class="sourceLineNo">220</span> Thread.sleep(1000);<a name="line.220"></a>
-<span class="sourceLineNo">221</span><a name="line.221"></a>
-<span class="sourceLineNo">222</span> Put put2 = new Put(row2);<a name="line.222"></a>
-<span class="sourceLineNo">223</span> byte[] value2 = Bytes.toBytes("1000dfsdf");<a name="line.223"></a>
-<span class="sourceLineNo">224</span> put2.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, value2);<a name="line.224"></a>
-<span class="sourceLineNo">225</span> put2.setAttribute("visibility", Bytes.toBytes("myTag3"));<a name="line.225"></a>
-<span class="sourceLineNo">226</span> table.put(put2);<a name="line.226"></a>
-<span class="sourceLineNo">227</span> admin.flush(tableName);<a name="line.227"></a>
-<span class="sourceLineNo">228</span> Thread.sleep(1000);<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span> result(fam, row, qual, row2, table, value, value2, row1, value1);<a name="line.230"></a>
-<span class="sourceLineNo">231</span><a name="line.231"></a>
-<span class="sourceLineNo">232</span> admin.compact(tableName);<a name="line.232"></a>
-<span class="sourceLineNo">233</span> while (admin.getCompactionState(tableName) != CompactionState.NONE) {<a name="line.233"></a>
-<span class="sourceLineNo">234</span> Thread.sleep(10);<a name="line.234"></a>
-<span class="sourceLineNo">235</span> }<a name="line.235"></a>
-<span class="sourceLineNo">236</span> result(fam, row, qual, row2, table, value, value2, row1, value1);<a name="line.236"></a>
-<span class="sourceLineNo">237</span> } finally {<a name="line.237"></a>
-<span class="sourceLineNo">238</span> if (table != null) {<a name="line.238"></a>
-<span class="sourceLineNo">239</span> table.close();<a name="line.239"></a>
-<span class="sourceLineNo">240</span> }<a name="line.240"></a>
-<span class="sourceLineNo">241</span> }<a name="line.241"></a>
-<span class="sourceLineNo">242</span> }<a name="line.242"></a>
+<span class="sourceLineNo">193</span> @Test<a name="line.193"></a>
+<span class="sourceLineNo">194</span> public void testTags() throws Exception {<a name="line.194"></a>
+<span class="sourceLineNo">195</span> Table table = null;<a name="line.195"></a>
+<span class="sourceLineNo">196</span> try {<a name="line.196"></a>
+<span class="sourceLineNo">197</span> TableName tableName = TableName.valueOf(TEST_NAME.getMethodName());<a name="line.197"></a>
+<span class="sourceLineNo">198</span> byte[] fam = Bytes.toBytes("info");<a name="line.198"></a>
+<span class="sourceLineNo">199</span> byte[] row = Bytes.toBytes("rowa");<a name="line.199"></a>
+<span class="sourceLineNo">200</span> // column names<a name="line.200"></a>
+<span class="sourceLineNo">201</span> byte[] qual = Bytes.toBytes("qual");<a name="line.201"></a>
+<span class="sourceLineNo">202</span><a name="line.202"></a>
+<span class="sourceLineNo">203</span> byte[] row1 = Bytes.toBytes("rowb");<a name="line.203"></a>
+<span class="sourceLineNo">204</span><a name="line.204"></a>
+<span class="sourceLineNo">205</span> byte[] row2 = Bytes.toBytes("rowc");<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span> TableDescriptor tableDescriptor =<a name="line.207"></a>
+<span class="sourceLineNo">208</span> TableDescriptorBuilder<a name="line.208"></a>
+<span class="sourceLineNo">209</span> .newBuilder(tableName).setColumnFamily(ColumnFamilyDescriptorBuilder.newBuilder(fam)<a name="line.209"></a>
+<span class="sourceLineNo">210</span> .setBlockCacheEnabled(true).setDataBlockEncoding(DataBlockEncoding.NONE).build())<a name="line.210"></a>
+<span class="sourceLineNo">211</span> .build();<a name="line.211"></a>
+<span class="sourceLineNo">212</span> Admin admin = TEST_UTIL.getAdmin();<a name="line.212"></a>
+<span class="sourceLineNo">213</span> admin.createTable(tableDescriptor);<a name="line.213"></a>
+<span class="sourceLineNo">214</span> byte[] value = Bytes.toBytes("value");<a name="line.214"></a>
+<span class="sourceLineNo">215</span> table = TEST_UTIL.getConnection().getTable(tableName);<a name="line.215"></a>
+<span class="sourceLineNo">216</span> Put put = new Put(row);<a name="line.216"></a>
+<span class="sourceLineNo">217</span> put.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, value);<a name="line.217"></a>
+<span class="sourceLineNo">218</span> put.setAttribute("visibility", Bytes.toBytes("myTag"));<a name="line.218"></a>
+<span class="sourceLineNo">219</span> table.put(put);<a name="line.219"></a>
+<span class="sourceLineNo">220</span> admin.flush(tableName);<a name="line.220"></a>
+<span class="sourceLineNo">221</span> // We are lacking an API for confirming flush request compaction.<a name="line.221"></a>
+<span class="sourceLineNo">222</span> // Just sleep for a short time. We won't be able to confirm flush<a name="line.222"></a>
+<span class="sourceLineNo">223</span> // completion but the test won't hang now or in the future if<a name="line.223"></a>
+<span class="sourceLineNo">224</span> // default compaction policy causes compaction between flush and<a name="line.224"></a>
+<span class="sourceLineNo">225</span> // when we go to confirm it.<a name="line.225"></a>
+<span class="sourceLineNo">226</span> Thread.sleep(1000);<a name="line.226"></a>
+<span class="sourceLineNo">227</span><a name="line.227"></a>
+<span class="sourceLineNo">228</span> Put put1 = new Put(row1);<a name="line.228"></a>
+<span class="sourceLineNo">229</span> byte[] value1 = Bytes.toBytes("1000dfsdf");<a name="line.229"></a>
+<span class="sourceLineNo">230</span> put1.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, value1);<a name="line.230"></a>
+<span class="sourceLineNo">231</span> // put1.setAttribute("visibility", Bytes.toBytes("myTag3"));<a name="line.231"></a>
+<span class="sourceLineNo">232</span> table.put(put1);<a name="line.232"></a>
+<span class="sourceLineNo">233</span> admin.flush(tableName);<a name="line.233"></a>
+<span class="sourceLineNo">234</span> Thread.sleep(1000);<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span> Put put2 = new Put(row2);<a name="line.236"></a>
+<span class="sourceLineNo">237</span> byte[] value2 = Bytes.toBytes("1000dfsdf");<a name="line.237"></a>
+<span class="sourceLineNo">238</span> put2.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, value2);<a name="line.238"></a>
+<span class="sourceLineNo">239</span> put2.setAttribute("visibility", Bytes.toBytes("myTag3"));<a name="line.239"></a>
+<span class="sourceLineNo">240</span> table.put(put2);<a name="line.240"></a>
+<span class="sourceLineNo">241</span> admin.flush(tableName);<a name="line.241"></a>
+<span class="sourceLineNo">242</span> Thread.sleep(1000);<a name="line.242"></a>
<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span> @Test<a name="line.244"></a>
-<span class="sourceLineNo">245</span> public void testFlushAndCompactionWithoutTags() throws Exception {<a name="line.245"></a>
-<span class="sourceLineNo">246</span> Table table = null;<a name="line.246"></a>
-<span class="sourceLineNo">247</span> try {<a name="line.247"></a>
-<span class="sourceLineNo">248</span> TableName tableName = TableName.valueOf(TEST_NAME.getMethodName());<a name="line.248"></a>
-<span class="sourceLineNo">249</span> byte[] fam = Bytes.toBytes("info");<a name="line.249"></a>
-<span class="sourceLineNo">250</span> byte[] row = Bytes.toBytes("rowa");<a name="line.250"></a>
-<span class="sourceLineNo">251</span> // column names<a name="line.251"></a>
-<span class="sourceLineNo">252</span> byte[] qual = Bytes.toBytes("qual");<a name="line.252"></a>
-<span class="sourceLineNo">253</span><a name="line.253"></a>
-<span class="sourceLineNo">254</span> byte[] row1 = Bytes.toBytes("rowb");<a name="line.254"></a>
-<span class="sourceLineNo">255</span><a name="line.255"></a>
-<span class="sourceLineNo">256</span> byte[] row2 = Bytes.toBytes("rowc");<a name="line.256"></a>
+<span class="sourceLineNo">244</span> result(fam, row, qual, row2, table, value, value2, row1, value1);<a name="line.244"></a>
+<span class="sourceLineNo">245</span><a name="line.245"></a>
+<span class="sourceLineNo">246</span> admin.compact(tableName);<a name="line.246"></a>
+<span class="sourceLineNo">247</span> while (admin.getCompactionState(tableName) != CompactionState.NONE) {<a name="line.247"></a>
+<span class="sourceLineNo">248</span> Thread.sleep(10);<a name="line.248"></a>
+<span class="sourceLineNo">249</span> }<a name="line.249"></a>
+<span class="sourceLineNo">250</span> result(fam, row, qual, row2, table, value, value2, row1, value1);<a name="line.250"></a>
+<span class="sourceLineNo">251</span> } finally {<a name="line.251"></a>
+<span class="sourceLineNo">252</span> if (table != null) {<a name="line.252"></a>
+<span class="sourceLineNo">253</span> table.close();<a name="line.253"></a>
+<span class="sourceLineNo">254</span> }<a name="line.254"></a>
+<span class="sourceLineNo">255</span> }<a name="line.255"></a>
+<span class="sourceLineNo">256</span> }<a name="line.256"></a>
<span class="sourceLineNo">257</span><a name="line.257"></a>
-<span class="sourceLineNo">258</span> TableDescriptor tableDescriptor =<a name="line.258"></a>
-<span class="sourceLineNo">259</span> TableDescriptorBuilder.newBuilder(tableName)<a name="line.259"></a>
-<span class="sourceLineNo">260</span> .setColumnFamily(<a name="line.260"></a>
-<span class="sourceLineNo">261</span> ColumnFamilyDescriptorBuilder.newBuilder(fam).setBlockCacheEnabled(true).build())<a name="line.261"></a>
-<span class="sourceLineNo">262</span> .build();<a name="line.262"></a>
-<span class="sourceLineNo">263</span> Admin admin = TEST_UTIL.getAdmin();<a name="line.263"></a>
-<span class="sourceLineNo">264</span> admin.createTable(tableDescriptor);<a name="line.264"></a>
-<span class="sourceLineNo">265</span><a name="line.265"></a>
-<span class="sourceLineNo">266</span> table = TEST_UTIL.getConnection().getTable(tableName);<a name="line.266"></a>
-<span class="sourceLineNo">267</span> Put put = new Put(row);<a name="line.267"></a>
-<span class="sourceLineNo">268</span> byte[] value = Bytes.toBytes("value");<a name="line.268"></a>
-<span class="sourceLineNo">269</span> put.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, value);<a name="line.269"></a>
-<span class="sourceLineNo">270</span> table.put(put);<a name="line.270"></a>
-<span class="sourceLineNo">271</span> admin.flush(tableName);<a name="line.271"></a>
-<span class="sourceLineNo">272</span> // We are lacking an API for confirming flush request compaction.<a name="line.272"></a>
-<span class="sourceLineNo">273</span> // Just sleep for a short time. We won't be able to confirm flush<a name="line.273"></a>
-<span class="sourceLineNo">274</span> // completion but the test won't hang now or in the future if<a name="line.274"></a>
-<span class="sourceLineNo">275</span> // default compaction policy causes compaction between flush and<a name="line.275"></a>
-<span class="sourceLineNo">276</span> // when we go to confirm it.<a name="line.276"></a>
-<span class="sourceLineNo">277</span> Thread.sleep(1000);<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span> Put put1 = new Put(row1);<a name="line.279"></a>
-<span class="sourceLineNo">280</span> byte[] value1 = Bytes.toBytes("1000dfsdf");<a name="line.280"></a>
-<span class="sourceLineNo">281</span> put1.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, value1);<a name="line.281"></a>
-<span class="sourceLineNo">282</span> table.put(put1);<a name="line.282"></a>
-<span class="sourceLineNo">283</span> admin.flush(tableName);<a name="line.283"></a>
-<span class="sourceLineNo">284</span> Thread.sleep(1000);<a name="line.284"></a>
-<span class="sourceLineNo">285</span><a name="line.285"></a>
-<span class="sourceLineNo">286</span> Put put2 = new Put(row2);<a name="line.286"></a>
-<span class="sourceLineNo">287</span> byte[] value2 = Bytes.toBytes("1000dfsdf");<a name="line.287"></a>
-<span class="sourceLineNo">288</span> put2.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, value2);<a name="line.288"></a>
-<span class="sourceLineNo">289</span> table.put(put2);<a name="line.289"></a>
-<span class="sourceLineNo">290</span> admin.flush(tableName);<a name="line.290"></a>
+<span class="sourceLineNo">258</span> @Test<a name="line.258"></a>
+<span class="sourceLineNo">259</span> public void testFlushAndCompactionWithoutTags() throws Exception {<a name="line.259"></a>
+<span class="sourceLineNo">260</span> Table table = null;<a name="line.260"></a>
+<span class="sourceLineNo">261</span> try {<a name="line.261"></a>
+<span class="sourceLineNo">262</span> TableName tableName = TableName.valueOf(TEST_NAME.getMethodName());<a name="line.262"></a>
+<span class="sourceLineNo">263</span> byte[] fam = Bytes.toBytes("info");<a name="line.263"></a>
+<span class="sourceLineNo">264</span> byte[] row = Bytes.toBytes("rowa");<a name="line.264"></a>
+<span class="sourceLineNo">265</span> // column names<a name="line.265"></a>
+<span class="sourceLineNo">266</span> byte[] qual = Bytes.toBytes("qual");<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span> byte[] row1 = Bytes.toBytes("rowb");<a name="line.268"></a>
+<span class="sourceLineNo">269</span><a name="line.269"></a>
+<span class="sourceLineNo">270</span> byte[] row2 = Bytes.toBytes("rowc");<a name="line.270"></a>
+<span class="sourceLineNo">271</span><a name="line.271"></a>
+<span class="sourceLineNo">272</span> TableDescriptor tableDescriptor =<a name="line.272"></a>
+<span class="sourceLineNo">273</span> TableDescriptorBuilder.newBuilder(tableName)<a name="line.273"></a>
+<span class="sourceLineNo">274</span> .setColumnFamily(<a name="line.274"></a>
+<span class="sourceLineNo">275</span> ColumnFamilyDescriptorBuilder.newBuilder(fam).setBlockCacheEnabled(true).build())<a name="line.275"></a>
+<span class="sourceLineNo">276</span> .build();<a name="line.276"></a>
+<span class="sourceLineNo">277</span> Admin admin = TEST_UTIL.getAdmin();<a name="line.277"></a>
+<span class="sourceLineNo">278</span> admin.createTable(tableDescriptor);<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span> table = TEST_UTIL.getConnection().getTable(tableName);<a name="line.280"></a>
+<span class="sourceLineNo">281</span> Put put = new Put(row);<a name="line.281"></a>
+<span class="sourceLineNo">282</span> byte[] value = Bytes.toBytes("value");<a name="line.282"></a>
+<span class="sourceLineNo">283</span> put.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, value);<a name="line.283"></a>
+<span class="sourceLineNo">284</span> table.put(put);<a name="line.284"></a>
+<span class="sourceLineNo">285</span> admin.flush(tableName);<a name="line.285"></a>
+<span class="sourceLineNo">286</span> // We are lacking an API for confirming flush request compaction.<a name="line.286"></a>
+<span class="sourceLineNo">287</span> // Just sleep for a short time. We won't be able to confirm flush<a name="line.287"></a>
+<span class="sourceLineNo">288</span> // completion but the test won't hang now or in the future if<a name="line.288"></a>
+<span class="sourceLineNo">289</span> // default compaction policy causes compaction between flush and<a name="line.289"></a>
+<span class="sourceLineNo">290</span> // when we go to confirm it.<a name="line.290"></a>
<span class="sourceLineNo">291</span> Thread.sleep(1000);<a name="line.291"></a>
<span class="sourceLineNo">292</span><a name="line.292"></a>
-<span class="sourceLineNo">293</span> Scan s = new Scan().withStartRow(row);<a name="line.293"></a>
-<span class="sourceLineNo">294</span> ResultScanner scanner = table.getScanner(s);<a name="line.294"></a>
-<span class="sourceLineNo">295</span> try {<a name="line.295"></a>
-<span class="sourceLineNo">296</span> Result[] next = scanner.next(3);<a name="line.296"></a>
-<span class="sourceLineNo">297</span> for (Result result : next) {<a name="line.297"></a>
-<span class="sourceLineNo">298</span> CellScanner cellScanner = result.cellScanner();<a name="line.298"></a>
-<span class="sourceLineNo">299</span> cellScanner.advance();<a name="line.299"></a>
-<span class="sourceLineNo">300</span> Cell current = cellScanner.current();<a name="line.300"></a>
-<span class="sourceLineNo">301</span> assertEquals(0, current.getTagsLength());<a name="line.301"></a>
-<span class="sourceLineNo">302</span> }<a name="line.302"></a>
-<span class="sourceLineNo">303</span> } finally {<a name="line.303"></a>
-<span class="sourceLineNo">304</span> if (scanner != null) scanner.close();<a name="line.304"></a>
-<span class="sourceLineNo">305</span> }<a name="line.305"></a>
-<span class="sourceLineNo">306</span> admin.compact(tableName);<a name="line.306"></a>
-<span class="sourceLineNo">307</span> while (admin.getCompactionState(tableName) != CompactionState.NONE) {<a name="line.307"></a>
-<span class="sourceLineNo">308</span> Thread.sleep(10);<a name="line.308"></a>
-<span class="sourceLineNo">309</span> }<a name="line.309"></a>
-<span class="sourceLineNo">310</span> s = new Scan().withStartRow(row);<a name="line.310"></a>
-<span class="sourceLineNo">311</span> scanner = table.getScanner(s);<a name="line.311"></a>
-<span class="sourceLineNo">312</span> try {<a name="line.312"></a>
-<span class="sourceLineNo">313</span> Result[] next = scanner.next(3);<a name="line.313"></a>
-<span class="sourceLineNo">314</span> for (Result result : next) {<a name="line.314"></a>
-<span class="sourceLineNo">315</span> CellScanner cellScanner = result.cellScanner();<a name="line.315"></a>
-<span class="sourceLineNo">316</span> cellScanner.advance();<a name="line.316"></a>
-<span class="sourceLineNo">317</span> Cell current = cellScanner.current();<a name="line.317"></a>
-<span class="sourceLineNo">318</span> assertEquals(0, current.getTagsLength());<a name="line.318"></a>
-<span class="sourceLineNo">319</span> }<a name="line.319"></a>
-<span class="sourceLineNo">320</span> } finally {<a name="line.320"></a>
-<span class="sourceLineNo">321</span> if (scanner != null) {<a name="line.321"></a>
-<span class="sourceLineNo">322</span> scanner.close();<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> } finally {<a name="line.325"></a>
-<span class="sourceLineNo">326</span> if (table != null) {<a name="line.326"></a>
-<span class="sourceLineNo">327</span> table.close();<a name="line.327"></a>
-<span class="sourceLineNo">328</span> }<a name="line.328"></a>
-<span class="sourceLineNo">329</span> }<a name="line.329"></a>
-<span class="sourceLineNo">330</span> }<a name="line.330"></a>
-<span class="sourceLineNo">331</span><a name="line.331"></a>
-<span class="sourceLineNo">332</span> @Test<a name="line.332"></a>
-<span class="sourceLineNo">333</span> public void testFlushAndCompactionwithCombinations() throws Exception {<a name="line.333"></a>
-<span class="sourceLineNo">334</span> TableName tableName = TableName.valueOf(TEST_NAME.getMethodName());<a name="line.334"></a>
-<span class="sourceLineNo">335</span> byte[] fam = Bytes.toBytes("info");<a name="line.335"></a>
-<span class="sourceLineNo">336</span> byte[] row = Bytes.toBytes("rowa");<a name="line.336"></a>
-<span class="sourceLineNo">337</span> // column names<a name="line.337"></a>
-<span class="sourceLineNo">338</span> byte[] qual = Bytes.toBytes("qual");<a name="line.338"></a>
-<span class="sourceLineNo">339</span><a name="line.339"></a>
-<span class="sourceLineNo">340</span> byte[] row1 = Bytes.toBytes("rowb");<a name="line.340"></a>
-<span class="sourceLineNo">341</span><a name="line.341"></a>
-<span class="sourceLineNo">342</span> byte[] row2 = Bytes.toBytes("rowc");<a name="line.342"></a>
-<span class="sourceLineNo">343</span> byte[] rowd = Bytes.toBytes("rowd");<a name="line.343"></a>
-<span class="sourceLineNo">344</span> byte[] rowe = Bytes.toBytes("rowe");<a name="line.344"></a>
-<span class="sourceLineNo">345</span> Table table = null;<a name="line.345"></a>
-<span class="sourceLineNo">346</span> for (DataBlockEncoding encoding : DataBlockEncoding.values()) {<a name="line.346"></a>
-<span class="sourceLineNo">347</span> TableDescriptor tableDescriptor = TableDescriptorBuilder.newBuilder(tableName)<a name="line.347"></a>
-<span class="sourceLineNo">348</span> .setColumnFamily(ColumnFamilyDescriptorBuilder.newBuilder(fam).setBlockCacheEnabled(true)<a name="line.348"></a>
-<span class="sourceLineNo">349</span> .setDataBlockEncoding(encoding).build())<a name="line.349"></a>
-<span class="sourceLineNo">350</span> .build();<a name="line.350"></a>
-<span class="sourceLineNo">351</span> Admin admin = TEST_UTIL.getAdmin();<a name="line.351"></a>
-<span class="sourceLineNo">352</span> admin.createTable(tableDescriptor);<a name="line.352"></a>
-<span class="sourceLineNo">353</span> try {<a name="line.353"></a>
-<span class="sourceLineNo">354</span> table = TEST_UTIL.getConnection().getTable(tableName);<a name="line.354"></a>
-<span class="sourceLineNo">355</span> Put put = new Put(row);<a name="line.355"></a>
-<span class="sourceLineNo">356</span> byte[] value = Bytes.toBytes("value");<a name="line.356"></a>
-<span class="sourceLineNo">357</span> put.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, value);<a name="line.357"></a>
-<span class="sourceLineNo">358</span> int bigTagLen = Short.MAX_VALUE - 5;<a name="line.358"></a>
-<span class="sourceLineNo">359</span> put.setAttribute("visibility", new byte[bigTagLen]);<a name="line.359"></a>
-<span class="sourceLineNo">360</span> table.put(put);<a name="line.360"></a>
-<span class="sourceLineNo">361</span> Put put1 = new Put(row1);<a name="line.361"></a>
-<span class="sourceLineNo">362</span> byte[] value1 = Bytes.toBytes("1000dfsdf");<a name="line.362"></a>
-<span class="sourceLineNo">363</span> put1.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, value1);<a name="line.363"></a>
-<span class="sourceLineNo">364</span> table.put(put1);<a name="line.364"></a>
-<span class="sourceLineNo">365</span> admin.flush(tableName);<a name="line.365"></a>
-<span class="sourceLineNo">366</span> // We are lacking an API for confirming flush request compaction.<a name="line.366"></a>
-<span class="sourceLineNo">367</span> // Just sleep for a short time. We won't be able to confirm flush<a name="line.367"></a>
-<span class="sourceLineNo">368</span> // completion but the test won't hang now or in the future if<a name="line.368"></a>
-<span class="sourceLineNo">369</span> // default compaction policy causes compaction between flush and<a name="line.369"></a>
-<span class="sourceLineNo">370</span> // when we go to confirm it.<a name="line.370"></a>
-<span class="sourceLineNo">371</span> Thread.sleep(1000);<a name="line.371"></a>
-<span class="sourceLineNo">372</span><a name="line.372"></a>
-<span class="sourceLineNo">373</span> put1 = new Put(row2);<a name="line.373"></a>
-<span class="sourceLineNo">374</span> value1 = Bytes.toBytes("1000dfsdf");<a name="line.374"></a>
-<span class="sourceLineNo">375</span> put1.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, value1);<a name="line.375"></a>
-<span class="sourceLineNo">376</span> table.put(put1);<a name="line.376"></a>
-<span class="sourceLineNo">377</span> admin.flush(tableName);<a name="line.377"></a>
-<span class="sourceLineNo">378</span> Thread.sleep(1000);<a name="line.378"></a>
-<span class="sourceLineNo">379</span><a name="line.379"></a>
-<span class="sourceLineNo">380</span> Put put2 = new Put(rowd);<a name="line.380"></a>
-<span class="sourceLineNo">381</span> byte[] value2 = Bytes.toBytes("1000dfsdf");<a name="line.381"></a>
-<span class="sourceLineNo">382</span> put2.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, value2);<a name="line.382"></a>
-<span class="sourceLineNo">383</span> table.put(put2);<a name="line.383"></a>
-<span class="sourceLineNo">384</span> put2 = new Put(rowe);<a name="line.384"></a>
-<span class="sourceLineNo">385</span> value2 = Bytes.toBytes("1000dfsddfdf");<a name="line.385"></a>
-<span class="sourceLineNo">386</span> put2.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, value2);<a name="line.386"></a>
-<span class="sourceLineNo">387</span> put.setAttribute("visibility", Bytes.toBytes("ram"));<a name="line.387"></a>
-<span class="sourceLineNo">388</span> table.put(put2);<a name="line.388"></a>
-<span class="sourceLineNo">389</span> admin.flush(tableName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span> Thread.sleep(1000);<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span> TestCoprocessorForTags.checkTagPresence = true;<a name="line.392"></a>
-<span class="sourceLineNo">393</span> Scan s = new Scan().withStartRow(row);<a name="line.393"></a>
-<span class="sourceLineNo">394</span> s.setCaching(1);<a name="line.394"></a>
-<span class="sourceLineNo">395</span> ResultScanner scanner = table.getScanner(s);<a name="line.395"></a>
-<span class="sourceLineNo">396</span> try {<a name="line.396"></a>
-<span class="sourceLineNo">397</span> Result next = null;<a name="line.397"></a>
-<span class="sourceLineNo">398</span> while ((next = scanner.next()) != null) {<a name="line.398"></a>
-<span class="sourceLineNo">399</span> CellScanner cellScanner = next.cellScanner();<a name="line.399"></a>
-<span class="sourceLineNo">400</span> cellScanner.advance();<a name="line.400"></a>
-<span class="sourceLineNo">401</span> Cell current = cellScanner.current();<a name="line.401"></a>
-<span class="sourceLineNo">402</span> if (CellUtil.matchingRows(current, row)) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span> assertEquals(1, TestCoprocessorForTags.tags.size());<a name="line.403"></a>
-<span class="sourceLineNo">404</span> Tag tag = TestCoprocessorForTags.tags.get(0);<a name="line.404"></a>
-<span class="sourceLineNo">405</span> assertEquals(bigTagLen, tag.getValueLength());<a name="line.405"></a>
-<span class="sourceLineNo">406</span> } else {<a name="line.406"></a>
-<span class="sourceLineNo">407</span> assertEquals(0, TestCoprocessorForTags.tags.size());<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> } finally {<a name="line.410"></a>
-<span class="sourceLineNo">411</span> if (scanner != null) {<a name="line.411"></a>
-<span class="sourceLineNo">412</span> scanner.close();<a name="line.412"></a>
-<span class="sourceLineNo">413</span> }<a name="line.413"></a>
-<span class="sourceLineNo">414</span> TestCoprocessorForTags.checkTagPresence = false;<a name="line.414"></a>
-<span class="sourceLineNo">415</span> }<a name="line.415"></a>
-<span class="sourceLineNo">416</span> while (admin.getCompactionState(tableName) != CompactionState.NONE) {<a name="line.416"></a>
-<span class="sourceLineNo">417</span> Thread.sleep(10);<a name="line.417"></a>
-<span class="sourceLineNo">418</span> }<a name="line.418"></a>
-<span class="sourceLineNo">419</span> TestCoprocessorForTags.checkTagPresence = true;<a name="line.419"></a>
-<span class="sourceLineNo">420</span> scanner = table.getScanner(s);<a name="line.420"></a>
-<span class="sourceLineNo">421</span> try {<a name="line.421"></a>
-<span class="sourceLineNo">422</span> Result next = null;<a name="line.422"></a>
-<span class="sourceLineNo">423</span> while ((next = scanner.next()) != null) {<a name="line.423"></a>
-<span class="sourceLineNo">424</span> CellScanner cellScanner = next.cellScanner();<a name="line.424"></a>
-<span class="sourceLineNo">425</span> cellScanner.advance();<a name="line.425"></a>
-<span class="sourceLineNo">426</span> Cell current = cellScanner.current();<a name="line.426"></a>
-<span class="sourceLineNo">427</span> if (CellUtil.matchingRows(current, row)) {<a name="line.427"></a>
-<span class="sourceLineNo">428</span> assertEquals(1, TestCoprocessorForTags.tags.size());<a name="line.428"></a>
-<span class="sourceLineNo">429</span> Tag tag = TestCoprocessorForTags.tags.get(0);<a name="line.429"></a>
-<span class="sourceLineNo">430</span> assertEquals(bigTagLen, tag.getValueLength());<a name="line.430"></a>
-<span class="sourceLineNo">431</span> } else {<a name="line.431"></a>
-<span class="sourceLineNo">432</span> assertEquals(0, TestCoprocessorForTags.tags.size());<a name="line.432"></a>
-<span class="sourceLineNo">433</span> }<a name="line.433"></a>
-<span class="sourceLineNo">434</span> }<a name="line.434"></a>
-<span class="sourceLineNo">435</span> } finally {<a name="line.435"></a>
-<span class="sourceLineNo">436</span> if (scanner != null) {<a name="line.436"></a>
-<span class="sourceLineNo">437</span> scanner.close();<a name="line.437"></a>
-<span class="sourceLineNo">438</span> }<a name="line.438"></a>
-<span class="sourceLineNo">439</span> TestCoprocessorForTags.checkTagPresence = false;<a name="line.439"></a>
-<span class="sourceLineNo">440</span> }<a name="line.440"></a>
-<span class="sourceLineNo">441</span> } finally {<a name="line.441"></a>
-<span class="sourceLineNo">442</span> if (table != null) {<a name="line.442"></a>
-<span class="sourceLineNo">443</span> table.close();<a name="line.443"></a>
-<span class="sourceLineNo">444</span> }<a name="line.444"></a>
-<span class="sourceLineNo">445</span> // delete the table<a name="line.445"></a>
-<span class="sourceLineNo">446</span> admin.disableTable(tableName);<a name="line.446"></a>
-<span class="sourceLineNo">447</span> admin.deleteTable(tableName);<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> @Test<a name="line.452"></a>
-<span class="sourceLineNo">453</span> public void testTagsWithAppendAndIncrement() throws Exception {<a name="line.453"></a>
-<span class="sourceLineNo">454</span> TableName tableName = TableName.valueOf(TEST_NAME.getMethodName());<a name="line.454"></a>
-<span class="sourceLineNo">455</span> byte[] f = Bytes.toBytes("f");<a name="line.455"></a>
-<span class="sourceLineNo">456</span> byte[] q = Bytes.toBytes("q");<a name="line.456"></a>
-<span class="sourceLineNo">457</span> byte[] row1 = Bytes.toBytes("r1");<a name="line.457"></a>
-<span class="sourceLineNo">458</span> byte[] row2 = Bytes.toBytes("r2");<a name="line.458"></a>
-<span class="sourceLineNo">459</span><a name="line.459"></a>
-<span class="sourceLineNo">460</span> TableDescriptor tableDescriptor = TableDescriptorBuilder.newBuilder(tableName)<a name="line.460"></a>
-<span class="sourceLineNo">461</span> .setColumnFamily(ColumnFamilyDescriptorBuilder.of(f)).build();<a name="line.461"></a>
-<span class="sourceLineNo">462</span> TEST_UTIL.getAdmin().createTable(tableDescriptor);<a name="line.462"></a>
-<span class="sourceLineNo">463</span><a name="line.463"></a>
-<span class="sourceLineNo">464</span> Table table = null;<a name="line.464"></a>
-<span class="sourceLineNo">465</span> try {<a name="line.465"></a>
-<span class="sourceLineNo">466</span> table = TEST_UTIL.getConnection().getTable(tableName);<a name="line.466"></a>
-<span class="sourceLineNo">467</span> Put put = new Put(row1);<a name="line.467"></a>
-<span class="sourceLineNo">468</span> byte[] v = Bytes.toBytes(2L);<a name="line.468"></a>
-<span class="sourceLineNo">469</span> put.addColumn(f, q, v);<a name="line.469"></a>
-<span class="sourceLineNo">470</span> put.setAttribute("visibility", Bytes.toBytes("tag1"));<a name="line.470"></a>
-<span class="sourceLineNo">471</span> table.put(put);<a name="line.471"></a>
-<span class="sourceLineNo">472</span> Increment increment = new Increment(row1);<a name="line.472"></a>
-<span class="sourceLineNo">473</span> increment.addColumn(f, q, 1L);<a name="line.473"></a>
-<span class="sourceLineNo">474</span> table.increment(increment);<a name="line.474"></a>
-<span class="sourceLineNo">475</span> TestCoprocessorForTags.checkTagPresence = true;<a name="line.475"></a>
-<span class="sourceLineNo">476</span> ResultScanner scanner = table.getScanner(new Scan());<a name="line.476"></a>
-<span class="sourceLineNo">477</span> Result result = scanner.next();<a name="line.477"></a>
-<span class="sourceLineNo">478</span> KeyValue kv = KeyValueUtil.ensureKeyValue(result.getColumnLatestCell(f, q));<a name="line.478"></a>
-<span class="sourceLineNo">479</span> List<Tag> tags = TestCoprocessorForTags.tags;<a name="line.479"></a>
-<span class="sourceLineNo">480</span> assertEquals(3L, Bytes.toLong(kv.getValueArray(), kv.getValueOffset(), kv.getValueLength()));<a name="line.480"></a>
-<span class="sourceLineNo">481</span> assertEquals(1, tags.size());<a name="line.481"></a>
-<span class="sourceLineNo">482</span> assertEquals("tag1", Bytes.toString(Tag.cloneValue(tags.get(0))));<a name="line.482"></a>
-<span class="sourceLineNo">483</span> TestCoprocessorForTags.checkTagPresence = false;<a name="line.483"></a>
-<span class="sourceLineNo">484</span> TestCoprocessorForTags.tags = null;<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span> increment = new Increment(row1);<a name="line.486"></a>
-<span class="sourceLineNo">487</span> increment.add(new KeyValue(row1, f, q, 1234L, v));<a name="line.487"></a>
-<span class="sourceLineNo">488</span> increment.setAttribute("visibility", Bytes.toBytes("tag2"));<a name="line.488"></a>
-<span class="sourceLineNo">489</span> table.increment(increment);<a name="line.489"></a>
-<span class="sourceLineNo">490</span> TestCoprocessorForTags.checkTagPresence = true;<a name="line.490"></a>
-<span class="sourceLineNo">491</span> scanner = table.getScanner(new Scan());<a name="line.491"></a>
-<span class="sourceLineNo">492</span> result = scanner.next();<a name="line.492"></a>
-<span class="sourceLineNo">493</span> kv = KeyValueUtil.ensureKeyValue(result.getColumnLatestCell(f, q));<a name="line.493"></a>
-<span class="sourceLineNo">494</span> tags = TestCoprocessorForTags.tags;<a name="line.494"></a>
-<span class="sourceLineNo">495</span> assertEquals(5L, Bytes.toLong(kv.getValueArray(), kv.getValueOffset(), kv.getValueLength()));<a name="line.495"></a>
-<span class="sourceLineNo">496</span> assertEquals(2, tags.size());<a name="line.496"></a>
-<span class="sourceLineNo">497</span> // We cannot assume the ordering of tags<a name="line.497"></a>
-<span class="sourceLineNo">498</span> List<String> tagValues = new ArrayList<>();<a name="line.498"></a>
-<span class="sourceLineNo">499</span> for (Tag tag : tags) {<a name="line.499"></a>
-<span class="sourceLineNo">500</span> tagValues.add(Bytes.toString(Tag.cloneValue(tag)));<a name="line.500"></a>
-<span class="sourceLineNo">501</span> }<a name="line.501"></a>
-<span class="sourceLineNo">502</span> assertTrue(tagValues.contains("tag1"));<a name="line.502"></a>
-<span class="sourceLineNo">503</span> assertTrue(tagValues.contains("tag2"));<a name="line.503"></a>
-<span class="sourceLineNo">504</span> TestCoprocessorForTags.checkTagPresence = false;<a name="line.504"></a>
-<span class="sourceLineNo">505</span> TestCoprocessorForTags.tags = null;<a name="line.505"></a>
-<span class="sourceLineNo">506</span><a name="line.506"></a>
-<span class="sourceLineNo">507</span> put = new Put(row2);<a name="line.507"></a>
-<span class="sourceLineNo">508</span> v = Bytes.toBytes(2L);<a name="line.508"></a>
-<span class="sourceLineNo">509</span> put.addColumn(f, q, v);<a name="line.509"></a>
-<span class="sourceLineNo">510</span> table.put(put);<a name="line.510"></a>
-<span class="sourceLineNo">511</span> increment = new Increment(row2);<a name="line.511"></a>
-<span class="sourceLineNo">512</span> increment.add(new KeyValue(row2, f, q, 1234L, v));<a name="line.512"></a>
-<span class="sourceLineNo">513</span> increment.setAttribute("visibility", Bytes.toBytes("tag2"));<a name="line.513"></a>
-<span class="sourceLineNo">514</span> table.increment(increment);<a name="line.514"></a>
-<span class="sourceLineNo">515</span> TestCoprocessorForTags.checkTagPresence = true;<a name="line.515"></a>
-<span class="sourceLineNo">516</span> scanner = table.getScanner(new Scan().withStartRow(row2));<a name="line.516"></a>
-<span class="sourceLineNo">517</span> result = scanner.next();<a name="line.517"></a>
-<span class="sourceLineNo">518</span> kv = KeyValueUtil.ensureKeyValue(result.getColumnLatestCell(f, q));<a name="line.518"></a>
-<span class="sourceLineNo">519</span> tags = TestCoprocessorForTags.tags;<a name="line.519"></a>
-<span class="sourceLineNo">520</span> assertEquals(4L, Bytes.toLong(kv.getValueArray(), kv.getValueOffset(), kv.getValueLength()));<a name="line.520"></a>
-<span class="sourceLineNo">521</span> assertEquals(1, tags.size());<a name="line.521"></a>
-<span class="sourceLineNo">522</span> assertEquals("tag2", Bytes.toString(Tag.cloneValue(tags.get(0))));<a name="line.522"></a>
-<span class="sourceLineNo">523</span> TestCoprocessorForTags.checkTagPresence = false;<a name="line.523"></a>
-<span class="sourceLineNo">524</span> TestCoprocessorForTags.tags = null;<a name="line.524"></a>
-<span class="sourceLineNo">525</span><a name="line.525"></a>
-<span class="sourceLineNo">526</span> // Test Append<a name="line.526"></a>
-<span class="sourceLineNo">527</span> byte[] row3 = Bytes.toBytes("r3");<a name="line.527"></a>
-<span class="sourceLineNo">528</span> put = new Put(row3);<a name="line.528"></a>
-<span class="sourceLineNo">529</span> put.addColumn(f, q, Bytes.toBytes("a"));<a name="line.529"></a>
-<span class="sourceLineNo">530</span> put.setAttribute("visibility", Bytes.toBytes("tag1"));<a name="line.530"></a>
-<span class="sourceLineNo">531</span> table.put(put);<a name="line.531"></a>
-<span class="sourceLineNo">532</span> Append append = new Append(row3);<a name="line.532"></a>
-<span class="sourceLineNo">533</span> append.addColumn(f, q, Bytes.toBytes("b"));<a name="line.533"></a>
-<span class="sourceLineNo">534</span> table.append(append);<a name="line.534"></a>
-<span class="sourceLineNo">535</span> TestCoprocessorForTags.checkTagPresence = true;<a name="line.535"></a>
-<span class="sourceLineNo">536</span> scanner = table.getScanner(new Scan().withStartRow(row3));<a name="line.536"></a>
-<span class="sourceLineNo">537</span> result = scanner.next();<a name="line.537"></a>
-<span class="sourceLineNo">538</span> kv = KeyValueUtil.ensureKeyValue(result.getColumnLatestCell(f, q));<a name="line.538"></a>
-<span class="sourceLineNo">539</span> tags = TestCoprocessorForTags.tags;<a name="line.539"></a>
-<span class="sourceLineNo">540</span> assertEquals(1, tags.size());<a name="line.540"></a>
-<span class="sourceLineNo">541</span> assertEquals("tag1", Bytes.toString(Tag.cloneValue(tags.get(0))));<a name="line.541"></a>
-<span class="sourceLineNo">542</span> TestCoprocessorForTags.checkTagPresence = false;<a name="line.542"></a>
-<span class="sourceLineNo">543</span> TestCoprocessorForTags.tags = null;<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span> append = new Append(row3);<a name="line.545"></a>
-<span class="sourceLineNo">546</span> append.add(new KeyValue(row3, f, q, 1234L, v));<a name="line.546"></a>
-<span class="sourceLineNo">547</span> append.setAttribute("visibility", Bytes.toBytes("tag2"));<a name="line.547"></a>
+<span class="sourceLineNo">293</span> Put put1 = new Put(row1);<a name="line.293"></a>
+<span class="sourceLineNo">294</span> byte[] value1 = Bytes.toBytes("1000dfsdf");<a name="line.294"></a>
+<span class="sourceLineNo">295</span> put1.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, value1);<a name="line.295"></a>
+<span class="sourceLineNo">296</span> table.put(put1);<a name="line.296"></a>
+<span class="sourceLineNo">297</span> admin.flush(tableName);<a name="line.297"></a>
+<span class="sourceLineNo">298</span> Thread.sleep(1000);<a name="line.298"></a>
+<span class="sourceLineNo">299</span><a name="line.299"></a>
+<span class="sourceLineNo">300</span> Put put2 = new Put(row2);<a name="line.300"></a>
+<span class="sourceLineNo">301</span> byte[] value2 = Bytes.toBytes("1000dfsdf");<a name="line.301"></a>
+<span class="sourceLineNo">302</span> put2.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, value2);<a name="line.302"></a>
+<span class="sourceLineNo">303</span> table.put(put2);<a name="line.303"></a>
+<span class="sourceLineNo">304</span> admin.flush(tableName);<a name="line.304"></a>
+<span class="sourceLineNo">305</span> Thread.sleep(1000);<a name="line.305"></a>
+<span class="sourceLineNo">306</span><a name="line.306"></a>
+<span class="sourceLineNo">307</span> Scan s = new Scan().withStartRow(row);<a name="line.307"></a>
+<span class="sourceLineNo">308</span> ResultScanner scanner = table.getScanner(s);<a name="line.308"></a>
+<span class="sourceLineNo">309</span> try {<a name="line.309"></a>
+<span class="sourceLineNo">310</span> Result[] next = scanner.next(3);<a name="line.310"></a>
+<span class="sourceLineNo">311</span> for (Result result : next) {<a name="line.311"></a>
+<span class="sourceLineNo">312</span> CellScanner cellScanner = result.cellScanner();<a name="line.312"></a>
+<span class="sourceLineNo">313</span> cellScanner.advance();<a name="line.313"></a>
+<span class="sourceLineNo">314</span> Cell current = cellScanner.current();<a name="line.314"></a>
+<span class="sourceLineNo">315</span> assertEquals(0, current.getTagsLength());<a name="line.315"></a>
+<span class="sourceLineNo">316</span> }<a name="line.316"></a>
+<span class="sourceLineNo">317</span> } finally {<a name="line.317"></a>
+<span class="sourceLineNo">318</span> if (scanner != null) scanner.close();<a name="line.318"></a>
+<span class="sourceLineNo">319</span> }<a name="line.319"></a>
+<span class="sourceLineNo">320</span> admin.compact(tableName);<a name="line.320"></a>
+<span class="sourceLineNo">321</span> while (admin.getCompactionState(tableName) != CompactionState.NONE) {<a name="line.321"></a>
+<span class="sourceLineNo">322</span> Thread.sleep(10);<a name="line.322"></a>
+<span class="sourceLineNo">323</span> }<a name="line.323"></a>
+<span class="sourceLineNo">324</span> s = new Scan().withStartRow(row);<a name="line.324"></a>
+<span class="sourceLineNo">325</span> scanner = table.getScanner(s);<a name="line.325"></a>
+<span class="sourceLineNo">326</span> try {<a name="line.326"></a>
+<span class="sourceLineNo">327</span> Result[] next = scanner.next(3);<a name="line.327"></a>
+<span class="sourceLineNo">328</span> for (Result result : next) {<a name="line.328"></a>
+<span class="sourceLineNo">329</span> CellScanner cellScanner = result.cellScanner();<a name="line.329"></a>
+<span class="sourceLineNo">330</span> cellScanner.advance();<a name="line.330"></a>
+<span class="sourceLineNo">331</span> Cell current = cellScanner.current();<a name="line.331"></a>
+<span class="sourceLineNo">332</span> assertEquals(0, current.getTagsLength());<a name="line.332"></a>
+<span class="sourceLineNo">333</span> }<a name="line.333"></a>
+<span class="sourceLineNo">334</span> } finally {<a name="line.334"></a>
+<span class="sourceLineNo">335</span> if (scanner != null) {<a name="line.335"></a>
+<span class="sourceLineNo">336</span> scanner.close();<a name="line.336"></a>
+<span class="sourceLineNo">337</span> }<a name="line.337"></a>
+<span class="sourceLineNo">338</span> }<a name="line.338"></a>
+<span class="sourceLineNo">339</span> } finally {<a name="line.339"></a>
+<span class="sourceLineNo">340</span> if (table != null) {<a name="line.340"></a>
+<span class="sourceLineNo">341</span> table.close();<a name="line.341"></a>
+<span class="sourceLineNo">342</span> }<a name="line.342"></a>
+<span class="sourceLineNo">343</span> }<a name="line.343"></a>
+<span class="sourceLineNo">344</span> }<a name="line.344"></a>
+<span class="sourceLineNo">345</span><a name="line.345"></a>
... 504 lines suppressed ...