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 2019/03/06 14:53:51 UTC

[hbase-site] branch asf-site updated: Published site at 177d43d8db8ee90273db1d7c317725f0792a4cd0.

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 11eab4e  Published site at 177d43d8db8ee90273db1d7c317725f0792a4cd0.
11eab4e is described below

commit 11eab4e02b4803b2087ea6bde098bc0cb2486871
Author: jenkins <bu...@apache.org>
AuthorDate: Wed Mar 6 14:53:34 2019 +0000

    Published site at 177d43d8db8ee90273db1d7c317725f0792a4cd0.
---
 acid-semantics.html                                |    2 +-
 apache_hbase_reference_guide.pdf                   |    4 +-
 book.html                                          |    2 +-
 bulk-loads.html                                    |    2 +-
 checkstyle-aggregate.html                          |   48 +-
 coc.html                                           |    2 +-
 dependencies.html                                  |    2 +-
 dependency-convergence.html                        |    2 +-
 dependency-info.html                               |    2 +-
 dependency-management.html                         |    2 +-
 devapidocs/constant-values.html                    |    4 +-
 devapidocs/index-all.html                          |    2 +
 .../apache/hadoop/hbase/backup/package-tree.html   |    2 +-
 .../apache/hadoop/hbase/client/package-tree.html   |   22 +-
 .../apache/hadoop/hbase/filter/package-tree.html   |    8 +-
 .../apache/hadoop/hbase/io/hfile/package-tree.html |    6 +-
 .../org/apache/hadoop/hbase/ipc/package-tree.html  |    2 +-
 .../hadoop/hbase/mapreduce/package-tree.html       |    4 +-
 .../VerifyReplication.Verifier.Counters.html       |   16 +-
 .../replication/VerifyReplication.Verifier.html    |   30 +-
 .../mapreduce/replication/VerifyReplication.html   |   49 +-
 .../apache/hadoop/hbase/master/package-tree.html   |    4 +-
 .../hbase/master/procedure/package-tree.html       |    4 +-
 .../hadoop/hbase/monitoring/package-tree.html      |    2 +-
 .../org/apache/hadoop/hbase/package-tree.html      |   20 +-
 .../hadoop/hbase/procedure2/package-tree.html      |    4 +-
 .../apache/hadoop/hbase/quotas/package-tree.html   |    8 +-
 .../hadoop/hbase/regionserver/package-tree.html    |   18 +-
 .../hbase/regionserver/wal/package-tree.html       |    2 +-
 .../org/apache/hadoop/hbase/rest/RESTServer.html   |   32 +-
 .../hadoop/hbase/security/access/package-tree.html |    4 +-
 .../apache/hadoop/hbase/security/package-tree.html |    2 +-
 .../apache/hadoop/hbase/thrift/package-tree.html   |    2 +-
 .../org/apache/hadoop/hbase/util/package-tree.html |    8 +-
 .../src-html/org/apache/hadoop/hbase/Version.html  |    4 +-
 .../VerifyReplication.Verifier.Counters.html       | 1268 ++++++++++----------
 .../replication/VerifyReplication.Verifier.html    | 1268 ++++++++++----------
 .../mapreduce/replication/VerifyReplication.html   | 1268 ++++++++++----------
 .../org/apache/hadoop/hbase/rest/RESTServer.html   |  641 +++++-----
 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                      |   16 +
 .../hadoop/hbase/TestHBaseTestingUtility.html      |   12 +-
 .../apache/hadoop/hbase/backup/package-tree.html   |    2 +-
 .../TestReplicationAdminWithClusters.html          |    2 +-
 .../apache/hadoop/hbase/io/hfile/package-tree.html |    2 +-
 .../org/apache/hadoop/hbase/package-tree.html      |    8 +-
 .../hadoop/hbase/procedure2/package-tree.html      |    4 +-
 .../hadoop/hbase/regionserver/package-tree.html    |    6 +-
 .../replication/TestNamespaceReplication.html      |    2 +-
 .../hbase/replication/TestReplicationBase.html     |   58 +-
 .../TestReplicationChangingPeerRegionservers.html  |    2 +-
 .../TestReplicationDisableInactivePeer.html        |    2 +-
 .../replication/TestReplicationDroppedTables.html  |    2 +-
 .../TestReplicationEmptyWALRecovery.html           |    2 +-
 .../hbase/replication/TestReplicationEndpoint.html |    2 +-
 .../replication/TestReplicationKillMasterRS.html   |    2 +-
 .../TestReplicationKillMasterRSCompressed.html     |    2 +-
 ...ReplicationKillMasterRSWithSeparateOldWALs.html |    2 +-
 .../hbase/replication/TestReplicationKillRS.html   |    2 +-
 .../replication/TestReplicationKillSlaveRS.html    |    2 +-
 ...tReplicationKillSlaveRSWithSeparateOldWALs.html |    2 +-
 .../replication/TestReplicationMetricsforUI.html   |    2 +-
 .../replication/TestReplicationSmallTests.html     |    2 +-
 .../replication/TestReplicationSmallTestsSync.html |    2 +-
 .../hbase/replication/TestReplicationStatus.html   |    2 +-
 .../replication/TestReplicationSyncUpTool.html     |    2 +-
 ...estReplicationSyncUpToolWithBulkLoadedData.html |    2 +-
 .../hbase/replication/TestVerifyReplication.html   |  186 ++-
 ...estReplicationEndpointWithMultipleAsyncWAL.html |    2 +-
 .../TestReplicationEndpointWithMultipleWAL.html    |    2 +-
 ...KillMasterRSCompressedWithMultipleAsyncWAL.html |    2 +-
 ...ationKillMasterRSCompressedWithMultipleWAL.html |    2 +-
 ...tReplicationSyncUpToolWithMultipleAsyncWAL.html |    2 +-
 .../TestReplicationSyncUpToolWithMultipleWAL.html  |    2 +-
 .../replication/regionserver/TestReplicator.html   |    2 +-
 .../org/apache/hadoop/hbase/test/package-tree.html |    4 +-
 .../org/apache/hadoop/hbase/wal/package-tree.html  |    4 +-
 .../hadoop/hbase/TestHBaseTestingUtility.html      |  448 +++----
 .../hbase/replication/TestReplicationBase.html     |  362 +++---
 .../hbase/replication/TestVerifyReplication.html   | 1188 ++++++++++--------
 100 files changed, 3764 insertions(+), 3402 deletions(-)

diff --git a/acid-semantics.html b/acid-semantics.html
index d30fd6b..25765a3 100644
--- a/acid-semantics.html
+++ b/acid-semantics.html
@@ -457,7 +457,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-05</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-06</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 1c74830..f0d07f2 100644
--- a/apache_hbase_reference_guide.pdf
+++ b/apache_hbase_reference_guide.pdf
@@ -5,8 +5,8 @@
 /Author (Apache HBase Team)
 /Creator (Asciidoctor PDF 1.5.0.alpha.15, based on Prawn 2.2.2)
 /Producer (Apache HBase Team)
-/ModDate (D:20190305142937+00'00')
-/CreationDate (D:20190305145000+00'00')
+/ModDate (D:20190306142937+00'00')
+/CreationDate (D:20190306145005+00'00')
 >>
 endobj
 2 0 obj
diff --git a/book.html b/book.html
index 7621f08..d36d9d7 100644
--- a/book.html
+++ b/book.html
@@ -41465,7 +41465,7 @@ org/apache/hadoop/hbase/security/access/AccessControlClient.revoke:(Lorg/apache/
 <div id="footer">
 <div id="footer-text">
 Version 3.0.0-SNAPSHOT<br>
-Last updated 2019-03-05 14:29:37 UTC
+Last updated 2019-03-06 14:29:37 UTC
 </div>
 </div>
 </body>
diff --git a/bulk-loads.html b/bulk-loads.html
index 324d9d2..e42d0ae 100644
--- a/bulk-loads.html
+++ b/bulk-loads.html
@@ -162,7 +162,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-05</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-06</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 a5557ce..961bc9d 100644
--- a/checkstyle-aggregate.html
+++ b/checkstyle-aggregate.html
@@ -56411,49 +56411,49 @@
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
-<td>271</td></tr>
+<td>275</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method call' child has incorrect indentation level 14, expected level should be 16.</td>
-<td>272</td></tr>
+<td>276</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>385</td></tr>
+<td>389</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
-<td>Method length is 158 lines (max allowed is 150).</td>
-<td>511</td></tr>
+<td>Method length is 164 lines (max allowed is 150).</td>
+<td>520</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
-<td>659</td></tr>
+<td>674</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
-<td>700</td></tr>
+<td>715</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 119).</td>
-<td>716</td></tr>
+<td>732</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
-<td>722</td></tr></table></div>
+<td>738</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.AbstractTestDLS.java">org/apache/hadoop/hbase/master/AbstractTestDLS.java</h3>
 <table border="0" class="table table-striped">
@@ -84674,55 +84674,55 @@
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 26.</td>
-<td>392</td></tr>
+<td>415</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 26.</td>
-<td>397</td></tr>
+<td>420</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 26.</td>
-<td>398</td></tr>
+<td>421</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 35.</td>
-<td>439</td></tr>
+<td>462</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 35.</td>
-<td>440</td></tr>
+<td>463</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 35.</td>
-<td>441</td></tr>
+<td>464</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 26.</td>
-<td>468</td></tr>
+<td>491</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 26.</td>
-<td>469</td></tr>
+<td>492</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 26.</td>
-<td>470</td></tr></table></div>
+<td>493</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.replication.WALCellFilter.java">org/apache/hadoop/hbase/replication/WALCellFilter.java</h3>
 <table border="0" class="table table-striped">
@@ -85979,31 +85979,31 @@
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'conf' must be private and have accessor methods.</td>
-<td>106</td></tr>
+<td>109</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
-<td>220</td></tr>
+<td>223</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
-<td>258</td></tr>
+<td>261</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
-<td>260</td></tr>
+<td>263</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 110).</td>
-<td>335</td></tr></table></div>
+<td>338</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.rest.RESTServlet.java">org/apache/hadoop/hbase/rest/RESTServlet.java</h3>
 <table border="0" class="table table-striped">
@@ -110312,7 +110312,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-05</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-06</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 0fd335d..84e19cc 100644
--- a/coc.html
+++ b/coc.html
@@ -231,7 +231,7 @@ email to <a class="externalLink" href="mailto:private@hbase.apache.org">the priv
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-05</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-06</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 f3d0b3a..dfbe0b2 100644
--- a/dependencies.html
+++ b/dependencies.html
@@ -311,7 +311,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-05</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-06</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 ce25223..fc8483d 100644
--- a/dependency-convergence.html
+++ b/dependency-convergence.html
@@ -541,7 +541,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-05</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-06</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 223b603..91d3068 100644
--- a/dependency-info.html
+++ b/dependency-info.html
@@ -184,7 +184,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-05</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-06</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 d662fdf..f9a57b2 100644
--- a/dependency-management.html
+++ b/dependency-management.html
@@ -870,7 +870,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-05</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-06</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/devapidocs/constant-values.html b/devapidocs/constant-values.html
index f71c2c5..f61f3d8 100644
--- a/devapidocs/constant-values.html
+++ b/devapidocs/constant-values.html
@@ -3913,7 +3913,7 @@
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/Version.html#date">date</a></code></td>
-<td class="colLast"><code>"Tue Mar  5 14:34:30 UTC 2019"</code></td>
+<td class="colLast"><code>"Wed Mar  6 14:34:26 UTC 2019"</code></td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.revision">
@@ -3927,7 +3927,7 @@
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/Version.html#srcChecksum">srcChecksum</a></code></td>
-<td class="colLast"><code>"0d461d01d68fa5b007aa444e9f783a3b"</code></td>
+<td class="colLast"><code>"5a841dab93e365e2d1d2f6503246cc1b"</code></td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.url">
diff --git a/devapidocs/index-all.html b/devapidocs/index-all.html
index 772ee13..e065516 100644
--- a/devapidocs/index-all.html
+++ b/devapidocs/index-all.html
@@ -84121,6 +84121,8 @@ service.</div>
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/zookeeper/ZNodePaths.html#peersZNode">peersZNode</a></span> - Variable in class org.apache.hadoop.hbase.zookeeper.<a href="org/apache/hadoop/hbase/zookeeper/ZNodePaths.html" title="class in org.apache.hadoop.hbase.zookeeper">ZNodePaths</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.html#peerTableName">peerTableName</a></span> - Variable in class org.apache.hadoop.hbase.mapreduce.replication.<a href="org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.html" title="class in org.apache.hadoop.hbase.mapreduce.replication">VerifyReplication</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/zookeeper/PendingWatcher.html#pending">pending</a></span> - Variable in class org.apache.hadoop.hbase.zookeeper.<a href="org/apache/hadoop/hbase/zookeeper/PendingWatcher.html" title="class in org.apache.hadoop.hbase.zookeeper">PendingWatcher</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#pendingAssignQueue">pendingAssignQueue</a></span> - Variable in class org.apache.hadoop.hbase.master.assignment.<a href="org/apache/hadoop/hbase/master/assignment/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master.assignment">AssignmentManager</a></dt>
diff --git a/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html b/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
index 2389486..9c2af4f 100644
--- a/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
@@ -167,9 +167,9 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
+<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupRestoreConstants.BackupCommand.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupRestoreConstants.BackupCommand</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupInfo.BackupPhase.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupInfo.BackupPhase</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupType.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupRestoreConstants.BackupCommand.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupRestoreConstants.BackupCommand</span></a></li>
 <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>
 </ul>
 </li>
diff --git a/devapidocs/org/apache/hadoop/hbase/client/package-tree.html b/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
index 4321d15..a5d0d3b 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
@@ -551,24 +551,24 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AbstractResponse.ResponseType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AbstractResponse.ResponseType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/ScannerCallable.MoreResults.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">ScannerCallable.MoreResults</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/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/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/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/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/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/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/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/AsyncRequestFutureImpl.Retry.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncRequestFutureImpl.Retry</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/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/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/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/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/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/AsyncProcessTask.SubmittedRows.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncProcessTask.SubmittedRows</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/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/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/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/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/AsyncRequestFutureImpl.Retry.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncRequestFutureImpl.Retry</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/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/ScannerCallable.MoreResults.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">ScannerCallable.MoreResults</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Durability</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/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/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/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/TableState.State.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">TableState.State</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 2a1fe97..c253e47 100644
--- a/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
@@ -184,13 +184,13 @@
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
 <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/RegexStringComparator.EngineType.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">RegexStringComparator.EngineType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/CompareFilter.CompareOp.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">CompareFilter.CompareOp</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.SatisfiesCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FuzzyRowFilter.SatisfiesCode</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.Order.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FuzzyRowFilter.Order</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/RegexStringComparator.EngineType.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">RegexStringComparator.EngineType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/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/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/CompareFilter.CompareOp.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">CompareFilter.CompareOp</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/Filter.ReturnCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">Filter.ReturnCode</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/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>
 </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 cccace9..6d365f5 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
@@ -275,12 +275,12 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<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/BlockPriority.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockPriority</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.MemoryType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">Cacheable.MemoryType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/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/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/BlockType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.BlockCategory.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockType.BlockCategory</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/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/Cacheable.MemoryType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">Cacheable.MemoryType</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 cb4ea86..148fecd 100644
--- a/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
@@ -354,8 +354,8 @@
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
 <li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/BufferCallBeforeInitHandler.BufferCallAction.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">BufferCallBeforeInitHandler.BufferCallAction</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/CallEvent.Type.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">CallEvent.Type</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/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 248cd20..da3530a 100644
--- a/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
@@ -297,10 +297,10 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <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/SyncTable.SyncMapper.Counter.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">SyncTable.SyncMapper.Counter</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableSplit.Version.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">TableSplit.Version</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/SyncTable.SyncMapper.Counter.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">SyncTable.SyncMapper.Counter</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/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>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.Counters.html b/devapidocs/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.Counters.html
index b49cafa..eb04761 100644
--- a/devapidocs/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.Counters.html
+++ b/devapidocs/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.Counters.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static enum <a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.html#line.127">VerifyReplication.Verifier.Counters</a>
+<pre>public static enum <a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.html#line.129">VerifyReplication.Verifier.Counters</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang">Enum</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce.replication">VerifyReplication.Verifier.Counters</a>&gt;</pre>
 </li>
 </ul>
@@ -219,7 +219,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>GOODROWS</h4>
-<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce.replication">VerifyReplication.Verifier.Counters</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.Counters.html#line.128">GOODROWS</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce.replication">VerifyReplication.Verifier.Counters</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.Counters.html#line.130">GOODROWS</a></pre>
 </li>
 </ul>
 <a name="BADROWS">
@@ -228,7 +228,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>BADROWS</h4>
-<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce.replication">VerifyReplication.Verifier.Counters</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.Counters.html#line.128">BADROWS</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce.replication">VerifyReplication.Verifier.Counters</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.Counters.html#line.130">BADROWS</a></pre>
 </li>
 </ul>
 <a name="ONLY_IN_SOURCE_TABLE_ROWS">
@@ -237,7 +237,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>ONLY_IN_SOURCE_TABLE_ROWS</h4>
-<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce.replication">VerifyReplication.Verifier.Counters</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.Counters.html#line.128">ONLY_IN_SOURCE_TABLE_ROWS</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce.replication">VerifyReplication.Verifier.Counters</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.Counters.html#line.130">ONLY_IN_SOURCE_TABLE_ROWS</a></pre>
 </li>
 </ul>
 <a name="ONLY_IN_PEER_TABLE_ROWS">
@@ -246,7 +246,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>ONLY_IN_PEER_TABLE_ROWS</h4>
-<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce.replication">VerifyReplication.Verifier.Counters</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.Counters.html#line.128">ONLY_IN_PEER_TABLE_ROWS</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce.replication">VerifyReplication.Verifier.Counters</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.Counters.html#line.130">ONLY_IN_PEER_TABLE_ROWS</a></pre>
 </li>
 </ul>
 <a name="CONTENT_DIFFERENT_ROWS">
@@ -255,7 +255,7 @@ the order they are declared.</div>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>CONTENT_DIFFERENT_ROWS</h4>
-<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce.replication">VerifyReplication.Verifier.Counters</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.Counters.html#line.128">CONTENT_DIFFERENT_ROWS</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce.replication">VerifyReplication.Verifier.Counters</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.Counters.html#line.130">CONTENT_DIFFERENT_ROWS</a></pre>
 </li>
 </ul>
 </li>
@@ -272,7 +272,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>values</h4>
-<pre>public static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce.replication">VerifyReplication.Verifier.Counters</a>[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.Counters.html#line.127">values</a>()</pre>
+<pre>public static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce.replication">VerifyReplication.Verifier.Counters</a>[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.Counters.html#line.129">values</a>()</pre>
 <div class="block">Returns an array containing the constants of this enum type, in
 the order they are declared.  This method may be used to iterate
 over the constants as follows:
@@ -292,7 +292,7 @@ for (VerifyReplication.Verifier.Counters c : VerifyReplication.Verifier.Counters
 <ul class="blockListLast">
 <li class="blockList">
 <h4>valueOf</h4>
-<pre>public static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce.replication">VerifyReplication.Verifier.Counters</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.Counters.html#line.127">valueOf</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="cla [...]
+<pre>public static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce.replication">VerifyReplication.Verifier.Counters</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.Counters.html#line.129">valueOf</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="cla [...]
 <div class="block">Returns the enum constant of this type with the specified name.
 The string must match <i>exactly</i> an identifier used to declare an
 enum constant in this type.  (Extraneous whitespace characters are 
diff --git a/devapidocs/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.html b/devapidocs/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.html
index 6905c37..216d32e 100644
--- a/devapidocs/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.html
+++ b/devapidocs/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.html
@@ -123,7 +123,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.html#line.124">VerifyReplication.Verifier</a>
+<pre>public static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.html#line.126">VerifyReplication.Verifier</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/mapreduce/TableMapper.html" title="class in org.apache.hadoop.hbase.mapreduce">TableMapper</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/io/ImmutableBytesWritable.html" title="class in org.apache.hadoop.hbase.io">ImmutableBytesWritable</a>,<a href="../../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&gt;</pre>
 <div class="block">Map-only comparator for 2 tables</div>
 </li>
@@ -296,7 +296,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/mapreduce/TableMapper
 <ul class="blockList">
 <li class="blockList">
 <h4>sourceConnection</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.html#line.131">sourceConnection</a></pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.html#line.133">sourceConnection</a></pre>
 </li>
 </ul>
 <a name="sourceTable">
@@ -305,7 +305,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/mapreduce/TableMapper
 <ul class="blockList">
 <li class="blockList">
 <h4>sourceTable</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/client/Table.html" title="interface in org.apache.hadoop.hbase.client">Table</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.html#line.132">sourceTable</a></pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/client/Table.html" title="interface in org.apache.hadoop.hbase.client">Table</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.html#line.134">sourceTable</a></pre>
 </li>
 </ul>
 <a name="replicatedConnection">
@@ -314,7 +314,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/mapreduce/TableMapper
 <ul class="blockList">
 <li class="blockList">
 <h4>replicatedConnection</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.html#line.133">replicatedConnection</a></pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.html#line.135">replicatedConnection</a></pre>
 </li>
 </ul>
 <a name="replicatedTable">
@@ -323,7 +323,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/mapreduce/TableMapper
 <ul class="blockList">
 <li class="blockList">
 <h4>replicatedTable</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/client/Table.html" title="interface in org.apache.hadoop.hbase.client">Table</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.html#line.134">replicatedTable</a></pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/client/Table.html" title="interface in org.apache.hadoop.hbase.client">Table</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.html#line.136">replicatedTable</a></pre>
 </li>
 </ul>
 <a name="replicatedScanner">
@@ -332,7 +332,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/mapreduce/TableMapper
 <ul class="blockList">
 <li class="blockList">
 <h4>replicatedScanner</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/client/ResultScanner.html" title="interface in org.apache.hadoop.hbase.client">ResultScanner</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.html#line.135">replicatedScanner</a></pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/client/ResultScanner.html" title="interface in org.apache.hadoop.hbase.client">ResultScanner</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.html#line.137">replicatedScanner</a></pre>
 </li>
 </ul>
 <a name="currentCompareRowInPeerTable">
@@ -341,7 +341,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/mapreduce/TableMapper
 <ul class="blockList">
 <li class="blockList">
 <h4>currentCompareRowInPeerTable</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.html#line.136">currentCompareRowInPeerTable</a></pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.html#line.138">currentCompareRowInPeerTable</a></pre>
 </li>
 </ul>
 <a name="sleepMsBeforeReCompare">
@@ -350,7 +350,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/mapreduce/TableMapper
 <ul class="blockList">
 <li class="blockList">
 <h4>sleepMsBeforeReCompare</h4>
-<pre>private&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.html#line.137">sleepMsBeforeReCompare</a></pre>
+<pre>private&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.html#line.139">sleepMsBeforeReCompare</a></pre>
 </li>
 </ul>
 <a name="delimiter">
@@ -359,7 +359,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/mapreduce/TableMapper
 <ul class="blockList">
 <li class="blockList">
 <h4>delimiter</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.html#line.138">delimiter</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.html#line.140">delimiter</a></pre>
 </li>
 </ul>
 <a name="verbose">
@@ -368,7 +368,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/mapreduce/TableMapper
 <ul class="blockList">
 <li class="blockList">
 <h4>verbose</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.html#line.139">verbose</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.html#line.141">verbose</a></pre>
 </li>
 </ul>
 <a name="batch">
@@ -377,7 +377,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/mapreduce/TableMapper
 <ul class="blockListLast">
 <li class="blockList">
 <h4>batch</h4>
-<pre>private&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.html#line.140">batch</a></pre>
+<pre>private&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.html#line.142">batch</a></pre>
 </li>
 </ul>
 </li>
@@ -394,7 +394,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/mapreduce/TableMapper
 <ul class="blockListLast">
 <li class="blockList">
 <h4>Verifier</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.html#line.124">Verifier</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.html#line.126">Verifier</a>()</pre>
 </li>
 </ul>
 </li>
@@ -411,7 +411,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/mapreduce/TableMapper
 <ul class="blockList">
 <li class="blockList">
 <h4>map</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.html#line.151">map</a>(<a href="../../../../../../org/apache/hadoop/hbase/io/ImmutableBytesWritable.html" title="class in org.apache.hadoop.hbase.io">ImmutableBytesWritable</a>&nbsp;row,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.html#line.153">map</a>(<a href="../../../../../../org/apache/hadoop/hbase/io/ImmutableBytesWritable.html" title="class in org.apache.hadoop.hbase.io">ImmutableBytesWritable</a>&nbsp;row,
                 <a href="../../../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;value,
                 org.apache.hadoop.mapreduce.Mapper.Context&nbsp;context)
          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>
@@ -435,7 +435,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/mapreduce/TableMapper
 <ul class="blockList">
 <li class="blockList">
 <h4>logFailRowAndIncreaseCounter</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.html#line.261">logFailRowAndIncreaseCounter</a>(org.apache.hadoop.mapreduce.Mapper.Context&nbsp;context,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.html#line.265">logFailRowAndIncreaseCounter</a>(org.apache.hadoop.mapreduce.Mapper.Context&nbsp;context,
                                           <a href="../../../../../../org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce.replication">VerifyReplication.Verifier.Counters</a>&nbsp;counter,
                                           <a href="../../../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;row)</pre>
 </li>
@@ -446,7 +446,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/mapreduce/TableMapper
 <ul class="blockListLast">
 <li class="blockList">
 <h4>cleanup</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.html#line.288">cleanup</a>(org.apache.hadoop.mapreduce.Mapper.Context&nbsp;context)</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.html#line.292">cleanup</a>(org.apache.hadoop.mapreduce.Mapper.Context&nbsp;context)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code>cleanup</code>&nbsp;in class&nbsp;<code>org.apache.hadoop.mapreduce.Mapper&lt;<a href="../../../../../../org/apache/hadoop/hbase/io/ImmutableBytesWritable.html" title="class in org.apache.hadoop.hbase.io">ImmutableBytesWritable</a>,<a href="../../../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>,<a href="../../../../../../org/apache/hadoop/hbase/io/ImmutableBytesWritable.html" title="class in org.apache.hadoop.hba [...]
diff --git a/devapidocs/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.html b/devapidocs/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.html
index 2784603..25a135e 100644
--- a/devapidocs/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.html
+++ b/devapidocs/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.html
@@ -231,33 +231,37 @@ implements org.apache.hadoop.util.Tool</pre>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>(package private) <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.html#rowPrefixes">rowPrefixes</a></span></code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.html#peerTableName">peerTableName</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
+<td class="colFirst"><code>(package private) <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.html#rowPrefixes">rowPrefixes</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.html#sleepMsBeforeReCompare">sleepMsBeforeReCompare</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.html#sourceSnapshotName">sourceSnapshotName</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.html#sourceSnapshotTmpDir">sourceSnapshotTmpDir</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.html#startTime">startTime</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.html#tableName">tableName</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.html#verbose">verbose</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.html#versions">versions</a></span></code>&nbsp;</td>
 </tr>
@@ -585,13 +589,22 @@ implements org.apache.hadoop.util.Tool</pre>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.html#line.116">peerHBaseRootAddress</a></pre>
 </li>
 </ul>
+<a name="peerTableName">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>peerTableName</h4>
+<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.html#line.118">peerTableName</a></pre>
+</li>
+</ul>
 <a name="JOB_NAME_CONF_KEY">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>JOB_NAME_CONF_KEY</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.html#line.119">JOB_NAME_CONF_KEY</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.html#line.121">JOB_NAME_CONF_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.mapreduce.replication.VerifyReplication.JOB_NAME_CONF_KEY">Constant Field Values</a></dd>
@@ -629,7 +642,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>getPeerQuorumConfig</h4>
-<pre>private static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/replication/ReplicationPeerConfig.html" title="class in org.apache.hadoop.hbase.replication">ReplicationPeerConfig</a>,org.apache.hadoop.conf.Configuration&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.html#line.336">getPeerQuor [...]
+<pre>private static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/replication/ReplicationPeerConfig.html" title="class in org.apache.hadoop.hbase.replication">ReplicationPeerConfig</a>,org.apache.hadoop.conf.Configuration&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.html#line.340">getPeerQuor [...]
                                                                                                     <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;peerId)
                                                                                              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
@@ -644,7 +657,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>restoreSnapshotForPeerCluster</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.html#line.365">restoreSnapshotForPeerCluster</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.html#line.369">restoreSnapshotForPeerCluster</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                                            <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;peerQuorumAddress)
                                     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>
@@ -659,7 +672,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>createSubmittableJob</h4>
-<pre>public&nbsp;org.apache.hadoop.mapreduce.Job&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.html#line.384">createSubmittableJob</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>public&nbsp;org.apache.hadoop.mapreduce.Job&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.html#line.388">createSubmittableJob</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                                                             <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
                                                      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">Sets up the actual job.</div>
@@ -680,7 +693,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>setRowPrefixFilter</h4>
-<pre>private static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.html#line.488">setRowPrefixFilter</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan,
+<pre>private static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.html#line.497">setRowPrefixFilter</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan,
                                        <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;rowPrefixes)</pre>
 </li>
 </ul>
@@ -690,7 +703,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>setStartAndStopRows</h4>
-<pre>private static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.html#line.504">setStartAndStopRows</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan,
+<pre>private static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.html#line.513">setStartAndStopRows</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan,
                                         byte[]&nbsp;startPrefixRow,
                                         byte[]&nbsp;lastPrefixRow)</pre>
 </li>
@@ -701,7 +714,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>doCommandLine</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.html#line.512">doCommandLine</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.html#line.521">doCommandLine</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)</pre>
 </li>
 </ul>
 <a name="isPeerQuorumAddress-java.lang.String-">
@@ -710,7 +723,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>isPeerQuorumAddress</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.html#line.671">isPeerQuorumAddress</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;cmd)</pre>
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.html#line.686">isPeerQuorumAddress</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;cmd)</pre>
 </li>
 </ul>
 <a name="printUsage-java.lang.String-">
@@ -719,7 +732,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>printUsage</h4>
-<pre>private static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.html#line.684">printUsage</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;errorMsg)</pre>
+<pre>private static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.html#line.699">printUsage</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;errorMsg)</pre>
 </li>
 </ul>
 <a name="run-java.lang.String:A-">
@@ -728,7 +741,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>run</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.html#line.729">run</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
+<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.html#line.745">run</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
         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="overrideSpecifyLabel">Specified by:</span></dt>
@@ -744,7 +757,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>main</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.html#line.744">main</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.html#line.760">main</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
                  throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <div class="block">Main entry point.</div>
 <dl>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/package-tree.html b/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
index f341ee6..af260ec 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
@@ -355,11 +355,11 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
+<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/MasterRpcServices.BalanceSwitchMode.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">MasterRpcServices.BalanceSwitchMode</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.TerminationStatus.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">SplitLogManager.TerminationStatus</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">RegionState.State</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.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/MetricsMasterSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">MetricsMasterSourceFactoryImpl.FactoryStorage</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/MasterRpcServices.BalanceSwitchMode.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">MasterRpcServices.BalanceSwitchMode</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.ResubmitDirective.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">SplitLogManager.ResubmitDirective</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html b/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
index 11171cd..ffb7785 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
@@ -216,10 +216,10 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MetaProcedureInterface.MetaOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">MetaProcedureInterface.MetaOperationType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ServerProcedureInterface.ServerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">ServerProcedureInterface.ServerOperationType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/PeerProcedureInterface.PeerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">PeerProcedureInterface.PeerOperationType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/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/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>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/monitoring/package-tree.html b/devapidocs/org/apache/hadoop/hbase/monitoring/package-tree.html
index 7524d90..452eaee 100644
--- a/devapidocs/org/apache/hadoop/hbase/monitoring/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/monitoring/package-tree.html
@@ -127,8 +127,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.monitoring.<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html" title="enum in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">MonitoredTask.State</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.monitoring.<a href="../../../../../org/apache/hadoop/hbase/monitoring/TaskMonitor.TaskFilter.TaskType.html" title="enum in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">TaskMonitor.TaskFilter.TaskType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.monitoring.<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html" title="enum in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">MonitoredTask.State</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/package-tree.html b/devapidocs/org/apache/hadoop/hbase/package-tree.html
index 9d46df1..2faecb7 100644
--- a/devapidocs/org/apache/hadoop/hbase/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/package-tree.html
@@ -433,19 +433,19 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HConstants.OperationStatusCode.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HConstants.OperationStatusCode</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ClusterMetrics.Option.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ClusterMetrics.Option</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CompatibilitySingletonFactory.SingletonStorage.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompatibilitySingletonFactory.SingletonStorage</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MetaTableAccessor.QueryType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Cell.Type.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Cell.Type</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/KeyValue.Type.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeyValue.Type</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Coprocessor.State.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Coprocessor.State</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/KeepDeletedCells.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeepDeletedCells</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/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/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/CellBuilderType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CellBuilderType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CompareOperator.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompareOperator</span></a></li>
+<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/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/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MetaTableAccessor.QueryType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/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/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/HConstants.OperationStatusCode.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HConstants.OperationStatusCode</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CompatibilitySingletonFactory.SingletonStorage.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompatibilitySingletonFactory.SingletonStorage</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/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/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/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/KeyValue.Type.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeyValue.Type</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 c116168..91267b0 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
@@ -216,11 +216,11 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<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/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/RootProcedureState.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">RootProcedureState.State</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">StateMachineProcedure.Flow</span></a></li>
 <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/LockType.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">LockType</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 3763a20..3673229 100644
--- a/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
@@ -241,13 +241,13 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <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/ThrottlingException.Type.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">ThrottlingException.Type</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/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/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/ThrottleType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">ThrottleType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/SpaceViolationPolicy.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">SpaceViolationPolicy</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/RpcThrottlingException.Type.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">RpcThrottlingException.Type</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 eaa9b97..0af4e4e 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -716,20 +716,20 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<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/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/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/TimeRangeTracker.Type.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TimeRangeTracker.Type</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.Operation.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">Region.Operation</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/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/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/MetricsRegionServerSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MetricsRegionServerSourceFactoryImpl.FactoryStorage</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/BloomType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">BloomType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MemStoreCompactionStrategy.Action</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/CompactingMemStore.IndexType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">CompactingMemStore.IndexType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/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/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/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/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/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/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/ChunkCreator.ChunkType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ChunkCreator.ChunkType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.Operation.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">Region.Operation</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/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/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/DefaultHeapMemoryTuner.StepDirection.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">DefaultHeapMemoryTuner.StepDirection</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
index 399e94d..93a5847 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
@@ -248,8 +248,8 @@
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
 <li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/CompressionContext.DictionaryIndex.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">CompressionContext.DictionaryIndex</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/RingBufferTruck.Type.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">RingBufferTruck.Type</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/ProtobufLogReader.WALHdrResult.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">ProtobufLogReader.WALHdrResult</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/RingBufferTruck.Type.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">RingBufferTruck.Type</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/rest/RESTServer.html b/devapidocs/org/apache/hadoop/hbase/rest/RESTServer.html
index 2a9f231..6a7f7e8 100644
--- a/devapidocs/org/apache/hadoop/hbase/rest/RESTServer.html
+++ b/devapidocs/org/apache/hadoop/hbase/rest/RESTServer.html
@@ -486,7 +486,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/rest/Constants.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>conf</h4>
-<pre>public static&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../src-html/org/apache/hadoop/hbase/rest/RESTServer.html#line.106">conf</a></pre>
+<pre>public static&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../src-html/org/apache/hadoop/hbase/rest/RESTServer.html#line.109">conf</a></pre>
 </li>
 </ul>
 <a name="userProvider">
@@ -495,7 +495,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/rest/Constants.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>userProvider</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/security/UserProvider.html" title="class in org.apache.hadoop.hbase.security">UserProvider</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/rest/RESTServer.html#line.107">userProvider</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/security/UserProvider.html" title="class in org.apache.hadoop.hbase.security">UserProvider</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/rest/RESTServer.html#line.110">userProvider</a></pre>
 </li>
 </ul>
 <a name="server">
@@ -504,7 +504,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/rest/Constants.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>server</h4>
-<pre>private&nbsp;org.eclipse.jetty.server.Server <a href="../../../../../src-html/org/apache/hadoop/hbase/rest/RESTServer.html#line.108">server</a></pre>
+<pre>private&nbsp;org.eclipse.jetty.server.Server <a href="../../../../../src-html/org/apache/hadoop/hbase/rest/RESTServer.html#line.111">server</a></pre>
 </li>
 </ul>
 <a name="infoServer">
@@ -513,7 +513,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/rest/Constants.html"
 <ul class="blockListLast">
 <li class="blockList">
 <h4>infoServer</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/http/InfoServer.html" title="class in org.apache.hadoop.hbase.http">InfoServer</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/rest/RESTServer.html#line.109">infoServer</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/http/InfoServer.html" title="class in org.apache.hadoop.hbase.http">InfoServer</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/rest/RESTServer.html#line.112">infoServer</a></pre>
 </li>
 </ul>
 </li>
@@ -530,7 +530,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/rest/Constants.html"
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RESTServer</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/RESTServer.html#line.111">RESTServer</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/RESTServer.html#line.114">RESTServer</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 </li>
 </ul>
 </li>
@@ -547,7 +547,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/rest/Constants.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>printUsageAndExit</h4>
-<pre>private static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/RESTServer.html#line.116">printUsageAndExit</a>(org.apache.hbase.thirdparty.org.apache.commons.cli.Options&nbsp;options,
+<pre>private static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/RESTServer.html#line.119">printUsageAndExit</a>(org.apache.hbase.thirdparty.org.apache.commons.cli.Options&nbsp;options,
                                       int&nbsp;exitCode)</pre>
 </li>
 </ul>
@@ -557,7 +557,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/rest/Constants.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>addCSRFFilter</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/RESTServer.html#line.124">addCSRFFilter</a>(org.eclipse.jetty.servlet.ServletContextHandler&nbsp;ctxHandler,
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/RESTServer.html#line.127">addCSRFFilter</a>(org.eclipse.jetty.servlet.ServletContextHandler&nbsp;ctxHandler,
                    org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 </li>
 </ul>
@@ -567,7 +567,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/rest/Constants.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>loginServerPrincipal</h4>
-<pre>private static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;org.eclipse.jetty.servlet.FilterHolder,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends org.glassfish.jersey.servlet.ServletContainer&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/RESTServer.html#line.138">loginS [...]
+<pre>private static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;org.eclipse.jetty.servlet.FilterHolder,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends org.glassfish.jersey.servlet.ServletContainer&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/RESTServer.html#line.141">loginS [...]
                                                                                                                                                 org.apache.hadoop.conf.Configuration&nbsp;conf)
                                                                                                                                          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>
@@ -582,7 +582,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/rest/Constants.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>parseCommandLine</h4>
-<pre>private static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/RESTServer.html#line.166">parseCommandLine</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args,
+<pre>private static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/RESTServer.html#line.169">parseCommandLine</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args,
                                      org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 </li>
 </ul>
@@ -592,7 +592,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/rest/Constants.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>run</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/RESTServer.html#line.233">run</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/RESTServer.html#line.236">run</a>()
          throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <div class="block">Runs the REST server.</div>
 <dl>
@@ -607,7 +607,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/rest/Constants.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>join</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/RESTServer.html#line.370">join</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/RESTServer.html#line.373">join</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>
@@ -621,7 +621,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/rest/Constants.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>stop</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/RESTServer.html#line.377">stop</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/RESTServer.html#line.380">stop</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>
@@ -635,7 +635,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/rest/Constants.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>getPort</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/RESTServer.html#line.386">getPort</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/RESTServer.html#line.389">getPort</a>()</pre>
 </li>
 </ul>
 <a name="getInfoPort--">
@@ -644,7 +644,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/rest/Constants.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>getInfoPort</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/RESTServer.html#line.394">getInfoPort</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/RESTServer.html#line.397">getInfoPort</a>()</pre>
 </li>
 </ul>
 <a name="getConf--">
@@ -653,7 +653,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/rest/Constants.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>getConf</h4>
-<pre>public&nbsp;org.apache.hadoop.conf.Configuration&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/RESTServer.html#line.401">getConf</a>()</pre>
+<pre>public&nbsp;org.apache.hadoop.conf.Configuration&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/RESTServer.html#line.404">getConf</a>()</pre>
 </li>
 </ul>
 <a name="main-java.lang.String:A-">
@@ -662,7 +662,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/rest/Constants.html"
 <ul class="blockListLast">
 <li class="blockList">
 <h4>main</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/RESTServer.html#line.410">main</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/RESTServer.html#line.413">main</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
                  throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <div class="block">The main method for the HBase rest server.</div>
 <dl>
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 03348f4..009a61b 100644
--- a/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
@@ -137,10 +137,10 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<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/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">AccessController.OpType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessControlFilter.Strategy.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">AccessControlFilter.Strategy</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/Permission.Action.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">Permission.Action</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/security/package-tree.html b/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
index 4e8112b..c11e5b8 100644
--- a/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
@@ -192,8 +192,8 @@
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
 <li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslStatus.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">SaslStatus</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/AuthMethod.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">AuthMethod</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslUtil.QualityOfProtection.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">SaslUtil.QualityOfProtection</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/AuthMethod.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">AuthMethod</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html b/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
index 82c818f..47e3265 100644
--- a/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
@@ -207,9 +207,9 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <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/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/util/package-tree.html b/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
index 65ac4da..ed9598f 100644
--- a/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
@@ -545,14 +545,14 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<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/IdReadWriteLock.ReferenceType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">IdReadWriteLock.ReferenceType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/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/HBaseFsck.ErrorReporter.ERROR_CODE.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">HBaseFsck.ErrorReporter.ERROR_CODE</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.LexicographicalComparerHolder.PureJavaComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Bytes.LexicographicalComparerHolder.PureJavaComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/ChecksumType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">ChecksumType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/IdReadWriteLock.ReferenceType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">IdReadWriteLock.ReferenceType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PoolMap.PoolType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PoolMap.PoolType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/HBaseFsck.ErrorReporter.ERROR_CODE.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">HBaseFsck.ErrorReporter.ERROR_CODE</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.LexicographicalComparerHolder.UnsafeComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Bytes.LexicographicalComparerHolder.UnsafeComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/ChecksumType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">ChecksumType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/Version.html b/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
index 4346ec4..7b5e651 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
@@ -18,9 +18,9 @@
 <span class="sourceLineNo">010</span>  public static final String version = "3.0.0-SNAPSHOT";<a name="line.10"></a>
 <span class="sourceLineNo">011</span>  public static final String revision = "";<a name="line.11"></a>
 <span class="sourceLineNo">012</span>  public static final String user = "jenkins";<a name="line.12"></a>
-<span class="sourceLineNo">013</span>  public static final String date = "Tue Mar  5 14:34:30 UTC 2019";<a name="line.13"></a>
+<span class="sourceLineNo">013</span>  public static final String date = "Wed Mar  6 14:34:26 UTC 2019";<a name="line.13"></a>
 <span class="sourceLineNo">014</span>  public static final String url = "git://jenkins-websites1.apache.org/home/jenkins/jenkins-slave/workspace/hbase_generate_website/hbase";<a name="line.14"></a>
-<span class="sourceLineNo">015</span>  public static final String srcChecksum = "0d461d01d68fa5b007aa444e9f783a3b";<a name="line.15"></a>
+<span class="sourceLineNo">015</span>  public static final String srcChecksum = "5a841dab93e365e2d1d2f6503246cc1b";<a name="line.15"></a>
 <span class="sourceLineNo">016</span>}<a name="line.16"></a>
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.Counters.html b/devapidocs/src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.Counters.html
index 47325cd..b16e963 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.Counters.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.Counters.html
@@ -122,638 +122,654 @@
 <span class="sourceLineNo">114</span>  String peerFSAddress = null;<a name="line.114"></a>
 <span class="sourceLineNo">115</span>  //Peer cluster HBase root dir location<a name="line.115"></a>
 <span class="sourceLineNo">116</span>  String peerHBaseRootAddress = null;<a name="line.116"></a>
-<span class="sourceLineNo">117</span><a name="line.117"></a>
-<span class="sourceLineNo">118</span><a name="line.118"></a>
-<span class="sourceLineNo">119</span>  private final static String JOB_NAME_CONF_KEY = "mapreduce.job.name";<a name="line.119"></a>
+<span class="sourceLineNo">117</span>  //Peer Table Name<a name="line.117"></a>
+<span class="sourceLineNo">118</span>  String peerTableName = null;<a name="line.118"></a>
+<span class="sourceLineNo">119</span><a name="line.119"></a>
 <span class="sourceLineNo">120</span><a name="line.120"></a>
-<span class="sourceLineNo">121</span>  /**<a name="line.121"></a>
-<span class="sourceLineNo">122</span>   * Map-only comparator for 2 tables<a name="line.122"></a>
-<span class="sourceLineNo">123</span>   */<a name="line.123"></a>
-<span class="sourceLineNo">124</span>  public static class Verifier<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      extends TableMapper&lt;ImmutableBytesWritable, Put&gt; {<a name="line.125"></a>
-<span class="sourceLineNo">126</span><a name="line.126"></a>
-<span class="sourceLineNo">127</span>    public enum Counters {<a name="line.127"></a>
-<span class="sourceLineNo">128</span>      GOODROWS, BADROWS, ONLY_IN_SOURCE_TABLE_ROWS, ONLY_IN_PEER_TABLE_ROWS, CONTENT_DIFFERENT_ROWS<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    }<a name="line.129"></a>
-<span class="sourceLineNo">130</span><a name="line.130"></a>
-<span class="sourceLineNo">131</span>    private Connection sourceConnection;<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    private Table sourceTable;<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    private Connection replicatedConnection;<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    private Table replicatedTable;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    private ResultScanner replicatedScanner;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    private Result currentCompareRowInPeerTable;<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    private int sleepMsBeforeReCompare;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    private String delimiter = "";<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    private boolean verbose = false;<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    private int batch = -1;<a name="line.140"></a>
-<span class="sourceLineNo">141</span><a name="line.141"></a>
-<span class="sourceLineNo">142</span>    /**<a name="line.142"></a>
-<span class="sourceLineNo">143</span>     * Map method that compares every scanned row with the equivalent from<a name="line.143"></a>
-<span class="sourceLineNo">144</span>     * a distant cluster.<a name="line.144"></a>
-<span class="sourceLineNo">145</span>     * @param row  The current table row key.<a name="line.145"></a>
-<span class="sourceLineNo">146</span>     * @param value  The columns.<a name="line.146"></a>
-<span class="sourceLineNo">147</span>     * @param context  The current context.<a name="line.147"></a>
-<span class="sourceLineNo">148</span>     * @throws IOException When something is broken with the data.<a name="line.148"></a>
-<span class="sourceLineNo">149</span>     */<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    @Override<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    public void map(ImmutableBytesWritable row, final Result value,<a name="line.151"></a>
-<span class="sourceLineNo">152</span>                    Context context)<a name="line.152"></a>
-<span class="sourceLineNo">153</span>        throws IOException {<a name="line.153"></a>
-<span class="sourceLineNo">154</span>      if (replicatedScanner == null) {<a name="line.154"></a>
-<span class="sourceLineNo">155</span>        Configuration conf = context.getConfiguration();<a name="line.155"></a>
-<span class="sourceLineNo">156</span>        sleepMsBeforeReCompare = conf.getInt(NAME +".sleepMsBeforeReCompare", 0);<a name="line.156"></a>
-<span class="sourceLineNo">157</span>        delimiter = conf.get(NAME + ".delimiter", "");<a name="line.157"></a>
-<span class="sourceLineNo">158</span>        verbose = conf.getBoolean(NAME +".verbose", false);<a name="line.158"></a>
-<span class="sourceLineNo">159</span>        batch = conf.getInt(NAME + ".batch", -1);<a name="line.159"></a>
-<span class="sourceLineNo">160</span>        final Scan scan = new Scan();<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        if (batch &gt; 0) {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>          scan.setBatch(batch);<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        }<a name="line.163"></a>
-<span class="sourceLineNo">164</span>        scan.setCacheBlocks(false);<a name="line.164"></a>
-<span class="sourceLineNo">165</span>        scan.setCaching(conf.getInt(TableInputFormat.SCAN_CACHEDROWS, 1));<a name="line.165"></a>
-<span class="sourceLineNo">166</span>        long startTime = conf.getLong(NAME + ".startTime", 0);<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        long endTime = conf.getLong(NAME + ".endTime", Long.MAX_VALUE);<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        String families = conf.get(NAME + ".families", null);<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        if(families != null) {<a name="line.169"></a>
-<span class="sourceLineNo">170</span>          String[] fams = families.split(",");<a name="line.170"></a>
-<span class="sourceLineNo">171</span>          for(String fam : fams) {<a name="line.171"></a>
-<span class="sourceLineNo">172</span>            scan.addFamily(Bytes.toBytes(fam));<a name="line.172"></a>
-<span class="sourceLineNo">173</span>          }<a name="line.173"></a>
-<span class="sourceLineNo">174</span>        }<a name="line.174"></a>
-<span class="sourceLineNo">175</span>        boolean includeDeletedCells = conf.getBoolean(NAME + ".includeDeletedCells", false);<a name="line.175"></a>
-<span class="sourceLineNo">176</span>        scan.setRaw(includeDeletedCells);<a name="line.176"></a>
-<span class="sourceLineNo">177</span>        String rowPrefixes = conf.get(NAME + ".rowPrefixes", null);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>        setRowPrefixFilter(scan, rowPrefixes);<a name="line.178"></a>
-<span class="sourceLineNo">179</span>        scan.setTimeRange(startTime, endTime);<a name="line.179"></a>
-<span class="sourceLineNo">180</span>        int versions = conf.getInt(NAME+".versions", -1);<a name="line.180"></a>
-<span class="sourceLineNo">181</span>        LOG.info("Setting number of version inside map as: " + versions);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>        if (versions &gt;= 0) {<a name="line.182"></a>
-<span class="sourceLineNo">183</span>          scan.setMaxVersions(versions);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>        }<a name="line.184"></a>
-<span class="sourceLineNo">185</span>        TableName tableName = TableName.valueOf(conf.get(NAME + ".tableName"));<a name="line.185"></a>
-<span class="sourceLineNo">186</span>        sourceConnection = ConnectionFactory.createConnection(conf);<a name="line.186"></a>
-<span class="sourceLineNo">187</span>        sourceTable = sourceConnection.getTable(tableName);<a name="line.187"></a>
-<span class="sourceLineNo">188</span><a name="line.188"></a>
-<span class="sourceLineNo">189</span>        final InputSplit tableSplit = context.getInputSplit();<a name="line.189"></a>
+<span class="sourceLineNo">121</span>  private final static String JOB_NAME_CONF_KEY = "mapreduce.job.name";<a name="line.121"></a>
+<span class="sourceLineNo">122</span><a name="line.122"></a>
+<span class="sourceLineNo">123</span>  /**<a name="line.123"></a>
+<span class="sourceLineNo">124</span>   * Map-only comparator for 2 tables<a name="line.124"></a>
+<span class="sourceLineNo">125</span>   */<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  public static class Verifier<a name="line.126"></a>
+<span class="sourceLineNo">127</span>      extends TableMapper&lt;ImmutableBytesWritable, Put&gt; {<a name="line.127"></a>
+<span class="sourceLineNo">128</span><a name="line.128"></a>
+<span class="sourceLineNo">129</span>    public enum Counters {<a name="line.129"></a>
+<span class="sourceLineNo">130</span>      GOODROWS, BADROWS, ONLY_IN_SOURCE_TABLE_ROWS, ONLY_IN_PEER_TABLE_ROWS, CONTENT_DIFFERENT_ROWS<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    }<a name="line.131"></a>
+<span class="sourceLineNo">132</span><a name="line.132"></a>
+<span class="sourceLineNo">133</span>    private Connection sourceConnection;<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    private Table sourceTable;<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    private Connection replicatedConnection;<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    private Table replicatedTable;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    private ResultScanner replicatedScanner;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    private Result currentCompareRowInPeerTable;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    private int sleepMsBeforeReCompare;<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    private String delimiter = "";<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    private boolean verbose = false;<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    private int batch = -1;<a name="line.142"></a>
+<span class="sourceLineNo">143</span><a name="line.143"></a>
+<span class="sourceLineNo">144</span>    /**<a name="line.144"></a>
+<span class="sourceLineNo">145</span>     * Map method that compares every scanned row with the equivalent from<a name="line.145"></a>
+<span class="sourceLineNo">146</span>     * a distant cluster.<a name="line.146"></a>
+<span class="sourceLineNo">147</span>     * @param row  The current table row key.<a name="line.147"></a>
+<span class="sourceLineNo">148</span>     * @param value  The columns.<a name="line.148"></a>
+<span class="sourceLineNo">149</span>     * @param context  The current context.<a name="line.149"></a>
+<span class="sourceLineNo">150</span>     * @throws IOException When something is broken with the data.<a name="line.150"></a>
+<span class="sourceLineNo">151</span>     */<a name="line.151"></a>
+<span class="sourceLineNo">152</span>    @Override<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    public void map(ImmutableBytesWritable row, final Result value,<a name="line.153"></a>
+<span class="sourceLineNo">154</span>                    Context context)<a name="line.154"></a>
+<span class="sourceLineNo">155</span>        throws IOException {<a name="line.155"></a>
+<span class="sourceLineNo">156</span>      if (replicatedScanner == null) {<a name="line.156"></a>
+<span class="sourceLineNo">157</span>        Configuration conf = context.getConfiguration();<a name="line.157"></a>
+<span class="sourceLineNo">158</span>        sleepMsBeforeReCompare = conf.getInt(NAME +".sleepMsBeforeReCompare", 0);<a name="line.158"></a>
+<span class="sourceLineNo">159</span>        delimiter = conf.get(NAME + ".delimiter", "");<a name="line.159"></a>
+<span class="sourceLineNo">160</span>        verbose = conf.getBoolean(NAME +".verbose", false);<a name="line.160"></a>
+<span class="sourceLineNo">161</span>        batch = conf.getInt(NAME + ".batch", -1);<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        final Scan scan = new Scan();<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        if (batch &gt; 0) {<a name="line.163"></a>
+<span class="sourceLineNo">164</span>          scan.setBatch(batch);<a name="line.164"></a>
+<span class="sourceLineNo">165</span>        }<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        scan.setCacheBlocks(false);<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        scan.setCaching(conf.getInt(TableInputFormat.SCAN_CACHEDROWS, 1));<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        long startTime = conf.getLong(NAME + ".startTime", 0);<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        long endTime = conf.getLong(NAME + ".endTime", Long.MAX_VALUE);<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        String families = conf.get(NAME + ".families", null);<a name="line.170"></a>
+<span class="sourceLineNo">171</span>        if(families != null) {<a name="line.171"></a>
+<span class="sourceLineNo">172</span>          String[] fams = families.split(",");<a name="line.172"></a>
+<span class="sourceLineNo">173</span>          for(String fam : fams) {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>            scan.addFamily(Bytes.toBytes(fam));<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>        boolean includeDeletedCells = conf.getBoolean(NAME + ".includeDeletedCells", false);<a name="line.177"></a>
+<span class="sourceLineNo">178</span>        scan.setRaw(includeDeletedCells);<a name="line.178"></a>
+<span class="sourceLineNo">179</span>        String rowPrefixes = conf.get(NAME + ".rowPrefixes", null);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>        setRowPrefixFilter(scan, rowPrefixes);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>        scan.setTimeRange(startTime, endTime);<a name="line.181"></a>
+<span class="sourceLineNo">182</span>        int versions = conf.getInt(NAME+".versions", -1);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>        LOG.info("Setting number of version inside map as: " + versions);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>        if (versions &gt;= 0) {<a name="line.184"></a>
+<span class="sourceLineNo">185</span>          scan.setMaxVersions(versions);<a name="line.185"></a>
+<span class="sourceLineNo">186</span>        }<a name="line.186"></a>
+<span class="sourceLineNo">187</span>        TableName tableName = TableName.valueOf(conf.get(NAME + ".tableName"));<a name="line.187"></a>
+<span class="sourceLineNo">188</span>        sourceConnection = ConnectionFactory.createConnection(conf);<a name="line.188"></a>
+<span class="sourceLineNo">189</span>        sourceTable = sourceConnection.getTable(tableName);<a name="line.189"></a>
 <span class="sourceLineNo">190</span><a name="line.190"></a>
-<span class="sourceLineNo">191</span>        String zkClusterKey = conf.get(NAME + ".peerQuorumAddress");<a name="line.191"></a>
-<span class="sourceLineNo">192</span>        Configuration peerConf = HBaseConfiguration.createClusterConf(conf,<a name="line.192"></a>
-<span class="sourceLineNo">193</span>            zkClusterKey, PEER_CONFIG_PREFIX);<a name="line.193"></a>
-<span class="sourceLineNo">194</span><a name="line.194"></a>
-<span class="sourceLineNo">195</span>        replicatedConnection = ConnectionFactory.createConnection(peerConf);<a name="line.195"></a>
-<span class="sourceLineNo">196</span>        replicatedTable = replicatedConnection.getTable(tableName);<a name="line.196"></a>
-<span class="sourceLineNo">197</span>        scan.setStartRow(value.getRow());<a name="line.197"></a>
-<span class="sourceLineNo">198</span><a name="line.198"></a>
-<span class="sourceLineNo">199</span>        byte[] endRow = null;<a name="line.199"></a>
-<span class="sourceLineNo">200</span>        if (tableSplit instanceof TableSnapshotInputFormat.TableSnapshotRegionSplit) {<a name="line.200"></a>
-<span class="sourceLineNo">201</span>          endRow = ((TableSnapshotInputFormat.TableSnapshotRegionSplit) tableSplit).getRegionInfo()<a name="line.201"></a>
-<span class="sourceLineNo">202</span>              .getEndKey();<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        } else {<a name="line.203"></a>
-<span class="sourceLineNo">204</span>          endRow = ((TableSplit) tableSplit).getEndRow();<a name="line.204"></a>
-<span class="sourceLineNo">205</span>        }<a name="line.205"></a>
-<span class="sourceLineNo">206</span><a name="line.206"></a>
-<span class="sourceLineNo">207</span>        scan.setStopRow(endRow);<a name="line.207"></a>
-<span class="sourceLineNo">208</span><a name="line.208"></a>
-<span class="sourceLineNo">209</span>        String peerSnapshotName = conf.get(NAME + ".peerSnapshotName", null);<a name="line.209"></a>
-<span class="sourceLineNo">210</span>        if (peerSnapshotName != null) {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>          String peerSnapshotTmpDir = conf.get(NAME + ".peerSnapshotTmpDir", null);<a name="line.211"></a>
-<span class="sourceLineNo">212</span>          String peerFSAddress = conf.get(NAME + ".peerFSAddress", null);<a name="line.212"></a>
-<span class="sourceLineNo">213</span>          String peerHBaseRootAddress = conf.get(NAME + ".peerHBaseRootAddress", null);<a name="line.213"></a>
-<span class="sourceLineNo">214</span>          FileSystem.setDefaultUri(peerConf, peerFSAddress);<a name="line.214"></a>
-<span class="sourceLineNo">215</span>          FSUtils.setRootDir(peerConf, new Path(peerHBaseRootAddress));<a name="line.215"></a>
-<span class="sourceLineNo">216</span>          LOG.info("Using peer snapshot:" + peerSnapshotName + " with temp dir:"<a name="line.216"></a>
-<span class="sourceLineNo">217</span>              + peerSnapshotTmpDir + " peer root uri:" + FSUtils.getRootDir(peerConf)<a name="line.217"></a>
-<span class="sourceLineNo">218</span>              + " peerFSAddress:" + peerFSAddress);<a name="line.218"></a>
-<span class="sourceLineNo">219</span><a name="line.219"></a>
-<span class="sourceLineNo">220</span>          replicatedScanner = new TableSnapshotScanner(peerConf, FSUtils.getRootDir(peerConf),<a name="line.220"></a>
-<span class="sourceLineNo">221</span>              new Path(peerFSAddress, peerSnapshotTmpDir), peerSnapshotName, scan, true);<a name="line.221"></a>
-<span class="sourceLineNo">222</span>        } else {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>          replicatedScanner = replicatedTable.getScanner(scan);<a name="line.223"></a>
-<span class="sourceLineNo">224</span>        }<a name="line.224"></a>
-<span class="sourceLineNo">225</span>        currentCompareRowInPeerTable = replicatedScanner.next();<a name="line.225"></a>
-<span class="sourceLineNo">226</span>      }<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      while (true) {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>        if (currentCompareRowInPeerTable == null) {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>          // reach the region end of peer table, row only in source table<a name="line.229"></a>
-<span class="sourceLineNo">230</span>          logFailRowAndIncreaseCounter(context, Counters.ONLY_IN_SOURCE_TABLE_ROWS, value);<a name="line.230"></a>
-<span class="sourceLineNo">231</span>          break;<a name="line.231"></a>
-<span class="sourceLineNo">232</span>        }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>        int rowCmpRet = Bytes.compareTo(value.getRow(), currentCompareRowInPeerTable.getRow());<a name="line.233"></a>
-<span class="sourceLineNo">234</span>        if (rowCmpRet == 0) {<a name="line.234"></a>
-<span class="sourceLineNo">235</span>          // rowkey is same, need to compare the content of the row<a name="line.235"></a>
-<span class="sourceLineNo">236</span>          try {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>            Result.compareResults(value, currentCompareRowInPeerTable);<a name="line.237"></a>
-<span class="sourceLineNo">238</span>            context.getCounter(Counters.GOODROWS).increment(1);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>            if (verbose) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>              LOG.info("Good row key: " + delimiter<a name="line.240"></a>
-<span class="sourceLineNo">241</span>                  + Bytes.toStringBinary(value.getRow()) + delimiter);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>            }<a name="line.242"></a>
-<span class="sourceLineNo">243</span>          } catch (Exception e) {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>            logFailRowAndIncreaseCounter(context, Counters.CONTENT_DIFFERENT_ROWS, value);<a name="line.244"></a>
-<span class="sourceLineNo">245</span>          }<a name="line.245"></a>
-<span class="sourceLineNo">246</span>          currentCompareRowInPeerTable = replicatedScanner.next();<a name="line.246"></a>
-<span class="sourceLineNo">247</span>          break;<a name="line.247"></a>
-<span class="sourceLineNo">248</span>        } else if (rowCmpRet &lt; 0) {<a name="line.248"></a>
-<span class="sourceLineNo">249</span>          // row only exists in source table<a name="line.249"></a>
-<span class="sourceLineNo">250</span>          logFailRowAndIncreaseCounter(context, Counters.ONLY_IN_SOURCE_TABLE_ROWS, value);<a name="line.250"></a>
+<span class="sourceLineNo">191</span>        final InputSplit tableSplit = context.getInputSplit();<a name="line.191"></a>
+<span class="sourceLineNo">192</span><a name="line.192"></a>
+<span class="sourceLineNo">193</span>        String zkClusterKey = conf.get(NAME + ".peerQuorumAddress");<a name="line.193"></a>
+<span class="sourceLineNo">194</span>        Configuration peerConf = HBaseConfiguration.createClusterConf(conf,<a name="line.194"></a>
+<span class="sourceLineNo">195</span>            zkClusterKey, PEER_CONFIG_PREFIX);<a name="line.195"></a>
+<span class="sourceLineNo">196</span><a name="line.196"></a>
+<span class="sourceLineNo">197</span>        String peerName = peerConf.get(NAME + ".peerTableName", tableName.getNameAsString());<a name="line.197"></a>
+<span class="sourceLineNo">198</span>        TableName peerTableName = TableName.valueOf(peerName);<a name="line.198"></a>
+<span class="sourceLineNo">199</span>        replicatedConnection = ConnectionFactory.createConnection(peerConf);<a name="line.199"></a>
+<span class="sourceLineNo">200</span>        replicatedTable = replicatedConnection.getTable(peerTableName);<a name="line.200"></a>
+<span class="sourceLineNo">201</span>        scan.setStartRow(value.getRow());<a name="line.201"></a>
+<span class="sourceLineNo">202</span><a name="line.202"></a>
+<span class="sourceLineNo">203</span>        byte[] endRow = null;<a name="line.203"></a>
+<span class="sourceLineNo">204</span>        if (tableSplit instanceof TableSnapshotInputFormat.TableSnapshotRegionSplit) {<a name="line.204"></a>
+<span class="sourceLineNo">205</span>          endRow = ((TableSnapshotInputFormat.TableSnapshotRegionSplit) tableSplit).getRegionInfo()<a name="line.205"></a>
+<span class="sourceLineNo">206</span>              .getEndKey();<a name="line.206"></a>
+<span class="sourceLineNo">207</span>        } else {<a name="line.207"></a>
+<span class="sourceLineNo">208</span>          endRow = ((TableSplit) tableSplit).getEndRow();<a name="line.208"></a>
+<span class="sourceLineNo">209</span>        }<a name="line.209"></a>
+<span class="sourceLineNo">210</span><a name="line.210"></a>
+<span class="sourceLineNo">211</span>        scan.setStopRow(endRow);<a name="line.211"></a>
+<span class="sourceLineNo">212</span><a name="line.212"></a>
+<span class="sourceLineNo">213</span>        String peerSnapshotName = conf.get(NAME + ".peerSnapshotName", null);<a name="line.213"></a>
+<span class="sourceLineNo">214</span>        if (peerSnapshotName != null) {<a name="line.214"></a>
+<span class="sourceLineNo">215</span>          String peerSnapshotTmpDir = conf.get(NAME + ".peerSnapshotTmpDir", null);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>          String peerFSAddress = conf.get(NAME + ".peerFSAddress", null);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>          String peerHBaseRootAddress = conf.get(NAME + ".peerHBaseRootAddress", null);<a name="line.217"></a>
+<span class="sourceLineNo">218</span>          FileSystem.setDefaultUri(peerConf, peerFSAddress);<a name="line.218"></a>
+<span class="sourceLineNo">219</span>          FSUtils.setRootDir(peerConf, new Path(peerHBaseRootAddress));<a name="line.219"></a>
+<span class="sourceLineNo">220</span>          LOG.info("Using peer snapshot:" + peerSnapshotName + " with temp dir:"<a name="line.220"></a>
+<span class="sourceLineNo">221</span>              + peerSnapshotTmpDir + " peer root uri:" + FSUtils.getRootDir(peerConf)<a name="line.221"></a>
+<span class="sourceLineNo">222</span>              + " peerFSAddress:" + peerFSAddress);<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>          replicatedScanner = new TableSnapshotScanner(peerConf, FSUtils.getRootDir(peerConf),<a name="line.224"></a>
+<span class="sourceLineNo">225</span>              new Path(peerFSAddress, peerSnapshotTmpDir), peerSnapshotName, scan, true);<a name="line.225"></a>
+<span class="sourceLineNo">226</span>        } else {<a name="line.226"></a>
+<span class="sourceLineNo">227</span>          replicatedScanner = replicatedTable.getScanner(scan);<a name="line.227"></a>
+<span class="sourceLineNo">228</span>        }<a name="line.228"></a>
+<span class="sourceLineNo">229</span>        currentCompareRowInPeerTable = replicatedScanner.next();<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      }<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      while (true) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        if (currentCompareRowInPeerTable == null) {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>          // reach the region end of peer table, row only in source table<a name="line.233"></a>
+<span class="sourceLineNo">234</span>          logFailRowAndIncreaseCounter(context, Counters.ONLY_IN_SOURCE_TABLE_ROWS, value);<a name="line.234"></a>
+<span class="sourceLineNo">235</span>          break;<a name="line.235"></a>
+<span class="sourceLineNo">236</span>        }<a name="line.236"></a>
+<span class="sourceLineNo">237</span>        int rowCmpRet = Bytes.compareTo(value.getRow(), currentCompareRowInPeerTable.getRow());<a name="line.237"></a>
+<span class="sourceLineNo">238</span>        if (rowCmpRet == 0) {<a name="line.238"></a>
+<span class="sourceLineNo">239</span>          // rowkey is same, need to compare the content of the row<a name="line.239"></a>
+<span class="sourceLineNo">240</span>          try {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>            Result.compareResults(value, currentCompareRowInPeerTable);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>            context.getCounter(Counters.GOODROWS).increment(1);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>            if (verbose) {<a name="line.243"></a>
+<span class="sourceLineNo">244</span>              LOG.info("Good row key: " + delimiter<a name="line.244"></a>
+<span class="sourceLineNo">245</span>                  + Bytes.toStringBinary(value.getRow()) + delimiter);<a name="line.245"></a>
+<span class="sourceLineNo">246</span>            }<a name="line.246"></a>
+<span class="sourceLineNo">247</span>          } catch (Exception e) {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>            logFailRowAndIncreaseCounter(context, Counters.CONTENT_DIFFERENT_ROWS, value);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>          }<a name="line.249"></a>
+<span class="sourceLineNo">250</span>          currentCompareRowInPeerTable = replicatedScanner.next();<a name="line.250"></a>
 <span class="sourceLineNo">251</span>          break;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>        } else {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>          // row only exists in peer table<a name="line.253"></a>
-<span class="sourceLineNo">254</span>          logFailRowAndIncreaseCounter(context, Counters.ONLY_IN_PEER_TABLE_ROWS,<a name="line.254"></a>
-<span class="sourceLineNo">255</span>            currentCompareRowInPeerTable);<a name="line.255"></a>
-<span class="sourceLineNo">256</span>          currentCompareRowInPeerTable = replicatedScanner.next();<a name="line.256"></a>
-<span class="sourceLineNo">257</span>        }<a name="line.257"></a>
-<span class="sourceLineNo">258</span>      }<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    }<a name="line.259"></a>
-<span class="sourceLineNo">260</span><a name="line.260"></a>
-<span class="sourceLineNo">261</span>    private void logFailRowAndIncreaseCounter(Context context, Counters counter, Result row) {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>      if (sleepMsBeforeReCompare &gt; 0) {<a name="line.262"></a>
-<span class="sourceLineNo">263</span>        Threads.sleep(sleepMsBeforeReCompare);<a name="line.263"></a>
-<span class="sourceLineNo">264</span>        try {<a name="line.264"></a>
-<span class="sourceLineNo">265</span>          Result sourceResult = sourceTable.get(new Get(row.getRow()));<a name="line.265"></a>
-<span class="sourceLineNo">266</span>          Result replicatedResult = replicatedTable.get(new Get(row.getRow()));<a name="line.266"></a>
-<span class="sourceLineNo">267</span>          Result.compareResults(sourceResult, replicatedResult);<a name="line.267"></a>
-<span class="sourceLineNo">268</span>          if (!sourceResult.isEmpty()) {<a name="line.268"></a>
-<span class="sourceLineNo">269</span>            context.getCounter(Counters.GOODROWS).increment(1);<a name="line.269"></a>
-<span class="sourceLineNo">270</span>            if (verbose) {<a name="line.270"></a>
-<span class="sourceLineNo">271</span>              LOG.info("Good row key (with recompare): " + delimiter + Bytes.toStringBinary(row.getRow())<a name="line.271"></a>
-<span class="sourceLineNo">272</span>              + delimiter);<a name="line.272"></a>
-<span class="sourceLineNo">273</span>            }<a name="line.273"></a>
-<span class="sourceLineNo">274</span>          }<a name="line.274"></a>
-<span class="sourceLineNo">275</span>          return;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>        } catch (Exception e) {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>          LOG.error("recompare fail after sleep, rowkey=" + delimiter +<a name="line.277"></a>
-<span class="sourceLineNo">278</span>              Bytes.toStringBinary(row.getRow()) + delimiter);<a name="line.278"></a>
-<span class="sourceLineNo">279</span>        }<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      }<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      context.getCounter(counter).increment(1);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      context.getCounter(Counters.BADROWS).increment(1);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      LOG.error(counter.toString() + ", rowkey=" + delimiter + Bytes.toStringBinary(row.getRow()) +<a name="line.283"></a>
-<span class="sourceLineNo">284</span>          delimiter);<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    }<a name="line.285"></a>
-<span class="sourceLineNo">286</span><a name="line.286"></a>
-<span class="sourceLineNo">287</span>    @Override<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    protected void cleanup(Context context) {<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      if (replicatedScanner != null) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>        try {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>          while (currentCompareRowInPeerTable != null) {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>            logFailRowAndIncreaseCounter(context, Counters.ONLY_IN_PEER_TABLE_ROWS,<a name="line.292"></a>
-<span class="sourceLineNo">293</span>              currentCompareRowInPeerTable);<a name="line.293"></a>
-<span class="sourceLineNo">294</span>            currentCompareRowInPeerTable = replicatedScanner.next();<a name="line.294"></a>
-<span class="sourceLineNo">295</span>          }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>        } catch (Exception e) {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>          LOG.error("fail to scan peer table in cleanup", e);<a name="line.297"></a>
-<span class="sourceLineNo">298</span>        } finally {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>          replicatedScanner.close();<a name="line.299"></a>
-<span class="sourceLineNo">300</span>          replicatedScanner = null;<a name="line.300"></a>
-<span class="sourceLineNo">301</span>        }<a name="line.301"></a>
-<span class="sourceLineNo">302</span>      }<a name="line.302"></a>
-<span class="sourceLineNo">303</span><a name="line.303"></a>
-<span class="sourceLineNo">304</span>      if (sourceTable != null) {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>        try {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>          sourceTable.close();<a name="line.306"></a>
-<span class="sourceLineNo">307</span>        } catch (IOException e) {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>          LOG.error("fail to close source table in cleanup", e);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>        }<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      }<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      if(sourceConnection != null){<a name="line.311"></a>
-<span class="sourceLineNo">312</span>        try {<a name="line.312"></a>
-<span class="sourceLineNo">313</span>          sourceConnection.close();<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        } catch (Exception e) {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>          LOG.error("fail to close source connection in cleanup", e);<a name="line.315"></a>
-<span class="sourceLineNo">316</span>        }<a name="line.316"></a>
-<span class="sourceLineNo">317</span>      }<a name="line.317"></a>
-<span class="sourceLineNo">318</span><a name="line.318"></a>
-<span class="sourceLineNo">319</span>      if(replicatedTable != null){<a name="line.319"></a>
-<span class="sourceLineNo">320</span>        try{<a name="line.320"></a>
-<span class="sourceLineNo">321</span>          replicatedTable.close();<a name="line.321"></a>
-<span class="sourceLineNo">322</span>        } catch (Exception e) {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>          LOG.error("fail to close replicated table in cleanup", e);<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>      if(replicatedConnection != null){<a name="line.326"></a>
-<span class="sourceLineNo">327</span>        try {<a name="line.327"></a>
-<span class="sourceLineNo">328</span>          replicatedConnection.close();<a name="line.328"></a>
-<span class="sourceLineNo">329</span>        } catch (Exception e) {<a name="line.329"></a>
-<span class="sourceLineNo">330</span>          LOG.error("fail to close replicated connection in cleanup", e);<a name="line.330"></a>
-<span class="sourceLineNo">331</span>        }<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      }<a name="line.332"></a>
-<span class="sourceLineNo">333</span>    }<a name="line.333"></a>
-<span class="sourceLineNo">334</span>  }<a name="line.334"></a>
-<span class="sourceLineNo">335</span><a name="line.335"></a>
-<span class="sourceLineNo">336</span>  private static Pair&lt;ReplicationPeerConfig, Configuration&gt; getPeerQuorumConfig(<a name="line.336"></a>
-<span class="sourceLineNo">337</span>      final Configuration conf, String peerId) throws IOException {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    ZKWatcher localZKW = null;<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    try {<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      localZKW = new ZKWatcher(conf, "VerifyReplication", new Abortable() {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>        @Override<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        public void abort(String why, Throwable e) {<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">252</span>        } else if (rowCmpRet &lt; 0) {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>          // row only exists in source table<a name="line.253"></a>
+<span class="sourceLineNo">254</span>          logFailRowAndIncreaseCounter(context, Counters.ONLY_IN_SOURCE_TABLE_ROWS, value);<a name="line.254"></a>
+<span class="sourceLineNo">255</span>          break;<a name="line.255"></a>
+<span class="sourceLineNo">256</span>        } else {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>          // row only exists in peer table<a name="line.257"></a>
+<span class="sourceLineNo">258</span>          logFailRowAndIncreaseCounter(context, Counters.ONLY_IN_PEER_TABLE_ROWS,<a name="line.258"></a>
+<span class="sourceLineNo">259</span>            currentCompareRowInPeerTable);<a name="line.259"></a>
+<span class="sourceLineNo">260</span>          currentCompareRowInPeerTable = replicatedScanner.next();<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        }<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      }<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    }<a name="line.263"></a>
+<span class="sourceLineNo">264</span><a name="line.264"></a>
+<span class="sourceLineNo">265</span>    private void logFailRowAndIncreaseCounter(Context context, Counters counter, Result row) {<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      if (sleepMsBeforeReCompare &gt; 0) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>        Threads.sleep(sleepMsBeforeReCompare);<a name="line.267"></a>
+<span class="sourceLineNo">268</span>        try {<a name="line.268"></a>
+<span class="sourceLineNo">269</span>          Result sourceResult = sourceTable.get(new Get(row.getRow()));<a name="line.269"></a>
+<span class="sourceLineNo">270</span>          Result replicatedResult = replicatedTable.get(new Get(row.getRow()));<a name="line.270"></a>
+<span class="sourceLineNo">271</span>          Result.compareResults(sourceResult, replicatedResult);<a name="line.271"></a>
+<span class="sourceLineNo">272</span>          if (!sourceResult.isEmpty()) {<a name="line.272"></a>
+<span class="sourceLineNo">273</span>            context.getCounter(Counters.GOODROWS).increment(1);<a name="line.273"></a>
+<span class="sourceLineNo">274</span>            if (verbose) {<a name="line.274"></a>
+<span class="sourceLineNo">275</span>              LOG.info("Good row key (with recompare): " + delimiter + Bytes.toStringBinary(row.getRow())<a name="line.275"></a>
+<span class="sourceLineNo">276</span>              + delimiter);<a name="line.276"></a>
+<span class="sourceLineNo">277</span>            }<a name="line.277"></a>
+<span class="sourceLineNo">278</span>          }<a name="line.278"></a>
+<span class="sourceLineNo">279</span>          return;<a name="line.279"></a>
+<span class="sourceLineNo">280</span>        } catch (Exception e) {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>          LOG.error("recompare fail after sleep, rowkey=" + delimiter +<a name="line.281"></a>
+<span class="sourceLineNo">282</span>              Bytes.toStringBinary(row.getRow()) + delimiter);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>        }<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      }<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      context.getCounter(counter).increment(1);<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      context.getCounter(Counters.BADROWS).increment(1);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      LOG.error(counter.toString() + ", rowkey=" + delimiter + Bytes.toStringBinary(row.getRow()) +<a name="line.287"></a>
+<span class="sourceLineNo">288</span>          delimiter);<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>    @Override<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    protected void cleanup(Context context) {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      if (replicatedScanner != null) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        try {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>          while (currentCompareRowInPeerTable != null) {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>            logFailRowAndIncreaseCounter(context, Counters.ONLY_IN_PEER_TABLE_ROWS,<a name="line.296"></a>
+<span class="sourceLineNo">297</span>              currentCompareRowInPeerTable);<a name="line.297"></a>
+<span class="sourceLineNo">298</span>            currentCompareRowInPeerTable = replicatedScanner.next();<a name="line.298"></a>
+<span class="sourceLineNo">299</span>          }<a name="line.299"></a>
+<span class="sourceLineNo">300</span>        } catch (Exception e) {<a name="line.300"></a>
+<span class="sourceLineNo">301</span>          LOG.error("fail to scan peer table in cleanup", e);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>        } finally {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>          replicatedScanner.close();<a name="line.303"></a>
+<span class="sourceLineNo">304</span>          replicatedScanner = null;<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>      if (sourceTable != null) {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>        try {<a name="line.309"></a>
+<span class="sourceLineNo">310</span>          sourceTable.close();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>        } catch (IOException e) {<a name="line.311"></a>
+<span class="sourceLineNo">312</span>          LOG.error("fail to close source table in cleanup", e);<a name="line.312"></a>
+<span class="sourceLineNo">313</span>        }<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      }<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      if(sourceConnection != null){<a name="line.315"></a>
+<span class="sourceLineNo">316</span>        try {<a name="line.316"></a>
+<span class="sourceLineNo">317</span>          sourceConnection.close();<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        } catch (Exception e) {<a name="line.318"></a>
+<span class="sourceLineNo">319</span>          LOG.error("fail to close source connection in cleanup", e);<a name="line.319"></a>
+<span class="sourceLineNo">320</span>        }<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      }<a name="line.321"></a>
+<span class="sourceLineNo">322</span><a name="line.322"></a>
+<span class="sourceLineNo">323</span>      if(replicatedTable != null){<a name="line.323"></a>
+<span class="sourceLineNo">324</span>        try{<a name="line.324"></a>
+<span class="sourceLineNo">325</span>          replicatedTable.close();<a name="line.325"></a>
+<span class="sourceLineNo">326</span>        } catch (Exception e) {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>          LOG.error("fail to close replicated table in cleanup", e);<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>      if(replicatedConnection != null){<a name="line.330"></a>
+<span class="sourceLineNo">331</span>        try {<a name="line.331"></a>
+<span class="sourceLineNo">332</span>          replicatedConnection.close();<a name="line.332"></a>
+<span class="sourceLineNo">333</span>        } catch (Exception e) {<a name="line.333"></a>
+<span class="sourceLineNo">334</span>          LOG.error("fail to close replicated connection in cleanup", e);<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>  }<a name="line.338"></a>
+<span class="sourceLineNo">339</span><a name="line.339"></a>
+<span class="sourceLineNo">340</span>  private static Pair&lt;ReplicationPeerConfig, Configuration&gt; getPeerQuorumConfig(<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      final Configuration conf, String peerId) throws IOException {<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    ZKWatcher localZKW = null;<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    try {<a name="line.343"></a>
+<span class="sourceLineNo">344</span>      localZKW = new ZKWatcher(conf, "VerifyReplication", new Abortable() {<a name="line.344"></a>
 <span class="sourceLineNo">345</span>        @Override<a name="line.345"></a>
-<span class="sourceLineNo">346</span>        public boolean isAborted() {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>          return false;<a name="line.347"></a>
-<span class="sourceLineNo">348</span>        }<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      });<a name="line.349"></a>
-<span class="sourceLineNo">350</span>      ReplicationPeerStorage storage =<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        ReplicationStorageFactory.getReplicationPeerStorage(localZKW, conf);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      ReplicationPeerConfig peerConfig = storage.getPeerConfig(peerId);<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      return Pair.newPair(peerConfig,<a name="line.353"></a>
-<span class="sourceLineNo">354</span>        ReplicationUtils.getPeerClusterConfiguration(peerConfig, conf));<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    } catch (ReplicationException e) {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      throw new IOException("An error occurred while trying to connect to the remote peer cluster",<a name="line.356"></a>
-<span class="sourceLineNo">357</span>          e);<a name="line.357"></a>
-<span class="sourceLineNo">358</span>    } finally {<a name="line.358"></a>
-<span class="sourceLineNo">359</span>      if (localZKW != null) {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        localZKW.close();<a name="line.360"></a>
-<span class="sourceLineNo">361</span>      }<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    }<a name="line.362"></a>
-<span class="sourceLineNo">363</span>  }<a name="line.363"></a>
-<span class="sourceLineNo">364</span><a name="line.364"></a>
-<span class="sourceLineNo">365</span>  private void restoreSnapshotForPeerCluster(Configuration conf, String peerQuorumAddress)<a name="line.365"></a>
-<span class="sourceLineNo">366</span>      throws IOException {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    Configuration peerConf =<a name="line.367"></a>
-<span class="sourceLineNo">368</span>        HBaseConfiguration.createClusterConf(conf, peerQuorumAddress, PEER_CONFIG_PREFIX);<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    FileSystem.setDefaultUri(peerConf, peerFSAddress);<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    FSUtils.setRootDir(peerConf, new Path(peerFSAddress, peerHBaseRootAddress));<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    FileSystem fs = FileSystem.get(peerConf);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    RestoreSnapshotHelper.copySnapshotForScanner(peerConf, fs, FSUtils.getRootDir(peerConf),<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      new Path(peerFSAddress, peerSnapshotTmpDir), peerSnapshotName);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>  }<a name="line.374"></a>
-<span class="sourceLineNo">375</span><a name="line.375"></a>
-<span class="sourceLineNo">376</span>  /**<a name="line.376"></a>
-<span class="sourceLineNo">377</span>   * Sets up the actual job.<a name="line.377"></a>
-<span class="sourceLineNo">378</span>   *<a name="line.378"></a>
-<span class="sourceLineNo">379</span>   * @param conf  The current configuration.<a name="line.379"></a>
-<span class="sourceLineNo">380</span>   * @param args  The command line parameters.<a name="line.380"></a>
-<span class="sourceLineNo">381</span>   * @return The newly created job.<a name="line.381"></a>
-<span class="sourceLineNo">382</span>   * @throws java.io.IOException When setting up the job fails.<a name="line.382"></a>
-<span class="sourceLineNo">383</span>   */<a name="line.383"></a>
-<span class="sourceLineNo">384</span>  public Job createSubmittableJob(Configuration conf, String[] args)<a name="line.384"></a>
-<span class="sourceLineNo">385</span>  throws IOException {<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    if (!doCommandLine(args)) {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      return null;<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    }<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    conf.set(NAME+".tableName", tableName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    conf.setLong(NAME+".startTime", startTime);<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    conf.setLong(NAME+".endTime", endTime);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    conf.setInt(NAME +".sleepMsBeforeReCompare", sleepMsBeforeReCompare);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    conf.set(NAME + ".delimiter", delimiter);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    conf.setInt(NAME + ".batch", batch);<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    conf.setBoolean(NAME +".verbose", verbose);<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    conf.setBoolean(NAME +".includeDeletedCells", includeDeletedCells);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    if (families != null) {<a name="line.397"></a>
-<span class="sourceLineNo">398</span>      conf.set(NAME+".families", families);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    }<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    if (rowPrefixes != null){<a name="line.400"></a>
-<span class="sourceLineNo">401</span>      conf.set(NAME+".rowPrefixes", rowPrefixes);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    }<a name="line.402"></a>
-<span class="sourceLineNo">403</span><a name="line.403"></a>
-<span class="sourceLineNo">404</span>    String peerQuorumAddress;<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    Pair&lt;ReplicationPeerConfig, Configuration&gt; peerConfigPair = null;<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    if (peerId != null) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      peerConfigPair = getPeerQuorumConfig(conf, peerId);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      ReplicationPeerConfig peerConfig = peerConfigPair.getFirst();<a name="line.408"></a>
-<span class="sourceLineNo">409</span>      peerQuorumAddress = peerConfig.getClusterKey();<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      LOG.info("Peer Quorum Address: " + peerQuorumAddress + ", Peer Configuration: " +<a name="line.410"></a>
-<span class="sourceLineNo">411</span>        peerConfig.getConfiguration());<a name="line.411"></a>
-<span class="sourceLineNo">412</span>      conf.set(NAME + ".peerQuorumAddress", peerQuorumAddress);<a name="line.412"></a>
-<span class="sourceLineNo">413</span>      HBaseConfiguration.setWithPrefix(conf, PEER_CONFIG_PREFIX,<a name="line.413"></a>
-<span class="sourceLineNo">414</span>        peerConfig.getConfiguration().entrySet());<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    } else {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>      assert this.peerQuorumAddress != null;<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      peerQuorumAddress = this.peerQuorumAddress;<a name="line.417"></a>
-<span class="sourceLineNo">418</span>      LOG.info("Peer Quorum Address: " + peerQuorumAddress);<a name="line.418"></a>
-<span class="sourceLineNo">419</span>      conf.set(NAME + ".peerQuorumAddress", peerQuorumAddress);<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    }<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>    conf.setInt(NAME + ".versions", versions);<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    LOG.info("Number of version: " + versions);<a name="line.423"></a>
-<span class="sourceLineNo">424</span><a name="line.424"></a>
-<span class="sourceLineNo">425</span>    //Set Snapshot specific parameters<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    if (peerSnapshotName != null) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      conf.set(NAME + ".peerSnapshotName", peerSnapshotName);<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>      // for verifyRep by snapshot, choose a unique sub-directory under peerSnapshotTmpDir to<a name="line.429"></a>
-<span class="sourceLineNo">430</span>      // restore snapshot.<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      Path restoreDir = new Path(peerSnapshotTmpDir, UUID.randomUUID().toString());<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      peerSnapshotTmpDir = restoreDir.toString();<a name="line.432"></a>
-<span class="sourceLineNo">433</span>      conf.set(NAME + ".peerSnapshotTmpDir", peerSnapshotTmpDir);<a name="line.433"></a>
-<span class="sourceLineNo">434</span><a name="line.434"></a>
-<span class="sourceLineNo">435</span>      conf.set(NAME + ".peerFSAddress", peerFSAddress);<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      conf.set(NAME + ".peerHBaseRootAddress", peerHBaseRootAddress);<a name="line.436"></a>
+<span class="sourceLineNo">346</span>        public void abort(String why, Throwable e) {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>        }<a name="line.347"></a>
+<span class="sourceLineNo">348</span><a name="line.348"></a>
+<span class="sourceLineNo">349</span>        @Override<a name="line.349"></a>
+<span class="sourceLineNo">350</span>        public boolean isAborted() {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>          return false;<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>      ReplicationPeerStorage storage =<a name="line.354"></a>
+<span class="sourceLineNo">355</span>        ReplicationStorageFactory.getReplicationPeerStorage(localZKW, conf);<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      ReplicationPeerConfig peerConfig = storage.getPeerConfig(peerId);<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      return Pair.newPair(peerConfig,<a name="line.357"></a>
+<span class="sourceLineNo">358</span>        ReplicationUtils.getPeerClusterConfiguration(peerConfig, conf));<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    } catch (ReplicationException e) {<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      throw new IOException("An error occurred while trying to connect to the remote peer cluster",<a name="line.360"></a>
+<span class="sourceLineNo">361</span>          e);<a name="line.361"></a>
+<span class="sourceLineNo">362</span>    } finally {<a name="line.362"></a>
+<span class="sourceLineNo">363</span>      if (localZKW != null) {<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        localZKW.close();<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>  }<a name="line.367"></a>
+<span class="sourceLineNo">368</span><a name="line.368"></a>
+<span class="sourceLineNo">369</span>  private void restoreSnapshotForPeerCluster(Configuration conf, String peerQuorumAddress)<a name="line.369"></a>
+<span class="sourceLineNo">370</span>      throws IOException {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    Configuration peerConf =<a name="line.371"></a>
+<span class="sourceLineNo">372</span>        HBaseConfiguration.createClusterConf(conf, peerQuorumAddress, PEER_CONFIG_PREFIX);<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    FileSystem.setDefaultUri(peerConf, peerFSAddress);<a name="line.373"></a>
+<span class="sourceLineNo">374</span>    FSUtils.setRootDir(peerConf, new Path(peerFSAddress, peerHBaseRootAddress));<a name="line.374"></a>
+<span class="sourceLineNo">375</span>    FileSystem fs = FileSystem.get(peerConf);<a name="line.375"></a>
+<span class="sourceLineNo">376</span>    RestoreSnapshotHelper.copySnapshotForScanner(peerConf, fs, FSUtils.getRootDir(peerConf),<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      new Path(peerFSAddress, peerSnapshotTmpDir), peerSnapshotName);<a name="line.377"></a>
+<span class="sourceLineNo">378</span>  }<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>  /**<a name="line.380"></a>
+<span class="sourceLineNo">381</span>   * Sets up the actual job.<a name="line.381"></a>
+<span class="sourceLineNo">382</span>   *<a name="line.382"></a>
+<span class="sourceLineNo">383</span>   * @param conf  The current configuration.<a name="line.383"></a>
+<span class="sourceLineNo">384</span>   * @param args  The command line parameters.<a name="line.384"></a>
+<span class="sourceLineNo">385</span>   * @return The newly created job.<a name="line.385"></a>
+<span class="sourceLineNo">386</span>   * @throws java.io.IOException When setting up the job fails.<a name="line.386"></a>
+<span class="sourceLineNo">387</span>   */<a name="line.387"></a>
+<span class="sourceLineNo">388</span>  public Job createSubmittableJob(Configuration conf, String[] args)<a name="line.388"></a>
+<span class="sourceLineNo">389</span>  throws IOException {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    if (!doCommandLine(args)) {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      return null;<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    conf.set(NAME+".tableName", tableName);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>    conf.setLong(NAME+".startTime", startTime);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    conf.setLong(NAME+".endTime", endTime);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    conf.setInt(NAME +".sleepMsBeforeReCompare", sleepMsBeforeReCompare);<a name="line.396"></a>
+<span class="sourceLineNo">397</span>    conf.set(NAME + ".delimiter", delimiter);<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    conf.setInt(NAME + ".batch", batch);<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    conf.setBoolean(NAME +".verbose", verbose);<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    conf.setBoolean(NAME +".includeDeletedCells", includeDeletedCells);<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    if (families != null) {<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      conf.set(NAME+".families", families);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    if (rowPrefixes != null){<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      conf.set(NAME+".rowPrefixes", rowPrefixes);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    }<a name="line.406"></a>
+<span class="sourceLineNo">407</span><a name="line.407"></a>
+<span class="sourceLineNo">408</span>    String peerQuorumAddress;<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    Pair&lt;ReplicationPeerConfig, Configuration&gt; peerConfigPair = null;<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    if (peerId != null) {<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      peerConfigPair = getPeerQuorumConfig(conf, peerId);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      ReplicationPeerConfig peerConfig = peerConfigPair.getFirst();<a name="line.412"></a>
+<span class="sourceLineNo">413</span>      peerQuorumAddress = peerConfig.getClusterKey();<a name="line.413"></a>
+<span class="sourceLineNo">414</span>      LOG.info("Peer Quorum Address: " + peerQuorumAddress + ", Peer Configuration: " +<a name="line.414"></a>
+<span class="sourceLineNo">415</span>        peerConfig.getConfiguration());<a name="line.415"></a>
+<span class="sourceLineNo">416</span>      conf.set(NAME + ".peerQuorumAddress", peerQuorumAddress);<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      HBaseConfiguration.setWithPrefix(conf, PEER_CONFIG_PREFIX,<a name="line.417"></a>
+<span class="sourceLineNo">418</span>        peerConfig.getConfiguration().entrySet());<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    } else {<a name="line.419"></a>
+<span class="sourceLineNo">420</span>      assert this.peerQuorumAddress != null;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>      peerQuorumAddress = this.peerQuorumAddress;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>      LOG.info("Peer Quorum Address: " + peerQuorumAddress);<a name="line.422"></a>
+<span class="sourceLineNo">423</span>      conf.set(NAME + ".peerQuorumAddress", peerQuorumAddress);<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    }<a name="line.424"></a>
+<span class="sourceLineNo">425</span><a name="line.425"></a>
+<span class="sourceLineNo">426</span>    if (peerTableName != null) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>      LOG.info("Peer Table Name: " + peerTableName);<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      conf.set(NAME + ".peerTableName", peerTableName);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>    }<a name="line.429"></a>
+<span class="sourceLineNo">430</span><a name="line.430"></a>
+<span class="sourceLineNo">431</span>    conf.setInt(NAME + ".versions", versions);<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    LOG.info("Number of version: " + versions);<a name="line.432"></a>
+<span class="sourceLineNo">433</span><a name="line.433"></a>
+<span class="sourceLineNo">434</span>    //Set Snapshot specific parameters<a name="line.434"></a>
+<span class="sourceLineNo">435</span>    if (peerSnapshotName != null) {<a name="line.435"></a>
+<span class="sourceLineNo">436</span>      conf.set(NAME + ".peerSnapshotName", peerSnapshotName);<a name="line.436"></a>
 <span class="sourceLineNo">437</span><a name="line.437"></a>
-<span class="sourceLineNo">438</span>      // This is to create HDFS delegation token for peer cluster in case of secured<a name="line.438"></a>
-<span class="sourceLineNo">439</span>      conf.setStrings(MRJobConfig.JOB_NAMENODES, peerFSAddress, conf.get(HConstants.HBASE_DIR));<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    }<a name="line.440"></a>
-<span class="sourceLineNo">441</span><a name="line.441"></a>
-<span class="sourceLineNo">442</span>    Job job = Job.getInstance(conf, conf.get(JOB_NAME_CONF_KEY, NAME + "_" + tableName));<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    job.setJarByClass(VerifyReplication.class);<a name="line.443"></a>
-<span class="sourceLineNo">444</span><a name="line.444"></a>
-<span class="sourceLineNo">445</span>    Scan scan = new Scan();<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    scan.setTimeRange(startTime, endTime);<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    scan.setRaw(includeDeletedCells);<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    scan.setCacheBlocks(false);<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    if (batch &gt; 0) {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>      scan.setBatch(batch);<a name="line.450"></a>
-<span class="sourceLineNo">451</span>    }<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    if (versions &gt;= 0) {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      scan.setMaxVersions(versions);<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      LOG.info("Number of versions set to " + versions);<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    }<a name="line.455"></a>
-<span class="sourceLineNo">456</span>    if(families != null) {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      String[] fams = families.split(",");<a name="line.457"></a>
-<span class="sourceLineNo">458</span>      for(String fam : fams) {<a name="line.458"></a>
-<span class="sourceLineNo">459</span>        scan.addFamily(Bytes.toBytes(fam));<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><a name="line.462"></a>
-<span class="sourceLineNo">463</span>    setRowPrefixFilter(scan, rowPrefixes);<a name="line.463"></a>
-<span class="sourceLineNo">464</span><a name="line.464"></a>
-<span class="sourceLineNo">465</span>    if (sourceSnapshotName != null) {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      Path snapshotTempPath = new Path(sourceSnapshotTmpDir);<a name="line.466"></a>
-<span class="sourceLineNo">467</span>      LOG.info(<a name="line.467"></a>
-<span class="sourceLineNo">468</span>        "Using source snapshot-" + sourceSnapshotName + " with temp dir:" + sourceSnapshotTmpDir);<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      TableMapReduceUtil.initTableSnapshotMapperJob(sourceSnapshotName, scan, Verifier.class, null,<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        null, job, true, snapshotTempPath);<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      restoreSnapshotForPeerCluster(conf, peerQuorumAddress);<a name="line.471"></a>
-<span class="sourceLineNo">472</span>    } else {<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      TableMapReduceUtil.initTableMapperJob(tableName, scan, Verifier.class, null, null, job);<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
-<span class="sourceLineNo">475</span><a name="line.475"></a>
-<span class="sourceLineNo">476</span>    if (peerId != null) {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      assert peerConfigPair != null;<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      Configuration peerClusterConf = peerConfigPair.getSecond();<a name="line.478"></a>
-<span class="sourceLineNo">479</span>      // Obtain the auth token from peer cluster<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      TableMapReduceUtil.initCredentialsForCluster(job, peerClusterConf);<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
-<span class="sourceLineNo">482</span><a name="line.482"></a>
-<span class="sourceLineNo">483</span>    job.setOutputFormatClass(NullOutputFormat.class);<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    job.setNumReduceTasks(0);<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    return job;<a name="line.485"></a>
-<span class="sourceLineNo">486</span>  }<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>  private static void setRowPrefixFilter(Scan scan, String rowPrefixes) {<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    if (rowPrefixes != null &amp;&amp; !rowPrefixes.isEmpty()) {<a name="line.489"></a>
-<span class="sourceLineNo">490</span>      String[] rowPrefixArray = rowPrefixes.split(",");<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      Arrays.sort(rowPrefixArray);<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ONE);<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      for (String prefix : rowPrefixArray) {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        Filter filter = new PrefixFilter(Bytes.toBytes(prefix));<a name="line.494"></a>
-<span class="sourceLineNo">495</span>        filterList.addFilter(filter);<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      }<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      scan.setFilter(filterList);<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      byte[] startPrefixRow = Bytes.toBytes(rowPrefixArray[0]);<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      byte[] lastPrefixRow = Bytes.toBytes(rowPrefixArray[rowPrefixArray.length -1]);<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      setStartAndStopRows(scan, startPrefixRow, lastPrefixRow);<a name="line.500"></a>
-<span class="sourceLineNo">501</span>    }<a name="line.501"></a>
-<span class="sourceLineNo">502</span>  }<a name="line.502"></a>
-<span class="sourceLineNo">503</span><a name="line.503"></a>
-<span class="sourceLineNo">504</span>  private static void setStartAndStopRows(Scan scan, byte[] startPrefixRow, byte[] lastPrefixRow) {<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    scan.setStartRow(startPrefixRow);<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    byte[] stopRow = Bytes.add(Bytes.head(lastPrefixRow, lastPrefixRow.length - 1),<a name="line.506"></a>
-<span class="sourceLineNo">507</span>        new byte[]{(byte) (lastPrefixRow[lastPrefixRow.length - 1] + 1)});<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    scan.setStopRow(stopRow);<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>  @VisibleForTesting<a name="line.511"></a>
-<span class="sourceLineNo">512</span>  public boolean doCommandLine(final String[] args) {<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    if (args.length &lt; 2) {<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      printUsage(null);<a name="line.514"></a>
-<span class="sourceLineNo">515</span>      return false;<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    }<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    try {<a name="line.517"></a>
-<span class="sourceLineNo">518</span>      for (int i = 0; i &lt; args.length; i++) {<a name="line.518"></a>
-<span class="sourceLineNo">519</span>        String cmd = args[i];<a name="line.519"></a>
-<span class="sourceLineNo">520</span>        if (cmd.equals("-h") || cmd.startsWith("--h")) {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>          printUsage(null);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          return false;<a name="line.522"></a>
-<span class="sourceLineNo">523</span>        }<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>        final String startTimeArgKey = "--starttime=";<a name="line.525"></a>
-<span class="sourceLineNo">526</span>        if (cmd.startsWith(startTimeArgKey)) {<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          startTime = Long.parseLong(cmd.substring(startTimeArgKey.length()));<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          continue;<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>        final String endTimeArgKey = "--endtime=";<a name="line.531"></a>
-<span class="sourceLineNo">532</span>        if (cmd.startsWith(endTimeArgKey)) {<a name="line.532"></a>
-<span class="sourceLineNo">533</span>          endTime = Long.parseLong(cmd.substring(endTimeArgKey.length()));<a name="line.533"></a>
-<span class="sourceLineNo">534</span>          continue;<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>        final String includeDeletedCellsArgKey = "--raw";<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        if (cmd.equals(includeDeletedCellsArgKey)) {<a name="line.538"></a>
-<span class="sourceLineNo">539</span>          includeDeletedCells = true;<a name="line.539"></a>
-<span class="sourceLineNo">540</span>          continue;<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        }<a name="line.541"></a>
-<span class="sourceLineNo">542</span><a name="line.542"></a>
-<span class="sourceLineNo">543</span>        final String versionsArgKey = "--versions=";<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        if (cmd.startsWith(versionsArgKey)) {<a name="line.544"></a>
-<span class="sourceLineNo">545</span>          versions = Integer.parseInt(cmd.substring(versionsArgKey.length()));<a name="line.545"></a>
-<span class="sourceLineNo">546</span>          continue;<a name="line.546"></a>
-<span class="sourceLineNo">547</span>        }<a name="line.547"></a>
-<span class="sourceLineNo">548</span><a name="line.548"></a>
-<span class="sourceLineNo">549</span>        final String batchArgKey = "--batch=";<a name="line.549"></a>
-<span class="sourceLineNo">550</span>        if (cmd.startsWith(batchArgKey)) {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>          batch = Integer.parseInt(cmd.substring(batchArgKey.length()));<a name="line.551"></a>
-<span class="sourceLineNo">552</span>          continue;<a name="line.552"></a>
-<span class="sourceLineNo">553</span>        }<a name="line.553"></a>
-<span class="sourceLineNo">554</span><a name="line.554"></a>
-<span class="sourceLineNo">555</span>        final String familiesArgKey = "--families=";<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        if (cmd.startsWith(familiesArgKey)) {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>          families = cmd.substring(familiesArgKey.length());<a name="line.557"></a>
-<span class="sourceLineNo">558</span>          continue;<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>        final String rowPrefixesKey = "--row-prefixes=";<a name="line.561"></a>
-<span class="sourceLineNo">562</span>        if (cmd.startsWith(rowPrefixesKey)){<a name="line.562"></a>
-<span class="sourceLineNo">563</span>          rowPrefixes = cmd.substring(rowPrefixesKey.length());<a name="line.563"></a>
-<span class="sourceLineNo">564</span>          continue;<a name="line.564"></a>
-<span class="sourceLineNo">565</span>        }<a name="line.565"></a>
-<span class="sourceLineNo">566</span><a name="line.566"></a>
-<span class="sourceLineNo">567</span>        final String delimiterArgKey = "--delimiter=";<a name="line.567"></a>
-<span class="sourceLineNo">568</span>        if (cmd.startsWith(delimiterArgKey)) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>          delimiter = cmd.substring(delimiterArgKey.length());<a name="line.569"></a>
-<span class="sourceLineNo">570</span>          continue;<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>        final String sleepToReCompareKey = "--recomparesleep=";<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        if (cmd.startsWith(sleepToReCompareKey)) {<a name="line.574"></a>
-<span class="sourceLineNo">575</span>          sleepMsBeforeReCompare = Integer.parseInt(cmd.substring(sleepToReCompareKey.length()));<a name="line.575"></a>
-<span class="sourceLineNo">576</span>          continue;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        }<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        final String verboseKey = "--verbose";<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        if (cmd.startsWith(verboseKey)) {<a name="line.579"></a>
-<span class="sourceLineNo">580</span>          verbose = true;<a name="line.580"></a>
-<span class="sourceLineNo">581</span>          continue;<a name="line.581"></a>
-<span class="sourceLineNo">582</span>        }<a name="line.582"></a>
-<span class="sourceLineNo">583</span><a name="line.583"></a>
-<span class="sourceLineNo">584</span>        final String sourceSnapshotNameArgKey = "--sourceSnapshotName=";<a name="line.584"></a>
-<span class="sourceLineNo">585</span>        if (cmd.startsWith(sourceSnapshotNameArgKey)) {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>          sourceSnapshotName = cmd.substring(sourceSnapshotNameArgKey.length());<a name="line.586"></a>
-<span class="sourceLineNo">587</span>          continue;<a name="line.587"></a>
-<span class="sourceLineNo">588</span>        }<a name="line.588"></a>
-<span class="sourceLineNo">589</span><a name="line.589"></a>
-<span class="sourceLineNo">590</span>        final String sourceSnapshotTmpDirArgKey = "--sourceSnapshotTmpDir=";<a name="line.590"></a>
-<span class="sourceLineNo">591</span>        if (cmd.startsWith(sourceSnapshotTmpDirArgKey)) {<a name="line.591"></a>
-<span class="sourceLineNo">592</span>          sourceSnapshotTmpDir = cmd.substring(sourceSnapshotTmpDirArgKey.length());<a name="line.592"></a>
-<span class="sourceLineNo">593</span>          continue;<a name="line.593"></a>
-<span class="sourceLineNo">594</span>        }<a name="line.594"></a>
-<span class="sourceLineNo">595</span><a name="line.595"></a>
-<span class="sourceLineNo">596</span>        final String peerSnapshotNameArgKey = "--peerSnapshotName=";<a name="line.596"></a>
-<span class="sourceLineNo">597</span>        if (cmd.startsWith(peerSnapshotNameArgKey)) {<a name="line.597"></a>
-<span class="sourceLineNo">598</span>          peerSnapshotName = cmd.substring(peerSnapshotNameArgKey.length());<a name="line.598"></a>
-<span class="sourceLineNo">599</span>          continue;<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>        final String peerSnapshotTmpDirArgKey = "--peerSnapshotTmpDir=";<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        if (cmd.startsWith(peerSnapshotTmpDirArgKey)) {<a name="line.603"></a>
-<span class="sourceLineNo">604</span>          peerSnapshotTmpDir = cmd.substring(peerSnapshotTmpDirArgKey.length());<a name="line.604"></a>
-<span class="sourceLineNo">605</span>          continue;<a name="line.605"></a>
-<span class="sourceLineNo">606</span>        }<a name="line.606"></a>
-<span class="sourceLineNo">607</span><a name="line.607"></a>
-<span class="sourceLineNo">608</span>        final String peerFSAddressArgKey = "--peerFSAddress=";<a name="line.608"></a>
-<span class="sourceLineNo">609</span>        if (cmd.startsWith(peerFSAddressArgKey)) {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>          peerFSAddress = cmd.substring(peerFSAddressArgKey.length());<a name="line.610"></a>
-<span class="sourceLineNo">611</span>          continue;<a name="line.611"></a>
-<span class="sourceLineNo">612</span>        }<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>        final String peerHBaseRootAddressArgKey = "--peerHBaseRootAddress=";<a name="line.614"></a>
-<span class="sourceLineNo">615</span>        if (cmd.startsWith(peerHBaseRootAddressArgKey)) {<a name="line.615"></a>
-<span class="sourceLineNo">616</span>          peerHBaseRootAddress = cmd.substring(peerHBaseRootAddressArgKey.length());<a name="line.616"></a>
-<span class="sourceLineNo">617</span>          continue;<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>        if (cmd.startsWith("--")) {<a name="line.620"></a>
-<span class="sourceLineNo">621</span>          printUsage("Invalid argument '" + cmd + "'");<a name="line.621"></a>
-<span class="sourceLineNo">622</span>          return false;<a name="line.622"></a>
-<span class="sourceLineNo">623</span>        }<a name="line.623"></a>
-<span class="sourceLineNo">624</span><a name="line.624"></a>
-<span class="sourceLineNo">625</span>        if (i == args.length-2) {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>          if (isPeerQuorumAddress(cmd)) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>            peerQuorumAddress = cmd;<a name="line.627"></a>
-<span class="sourceLineNo">628</span>          } else {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>            peerId = cmd;<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>        if (i == args.length-1) {<a name="line.633"></a>
-<span class="sourceLineNo">634</span>          tableName = cmd;<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>      if ((sourceSnapshotName != null &amp;&amp; sourceSnapshotTmpDir == null)<a name="line.638"></a>
-<span class="sourceLineNo">639</span>          || (sourceSnapshotName == null &amp;&amp; sourceSnapshotTmpDir != null)) {<a name="line.639"></a>
-<span class="sourceLineNo">640</span>        printUsage("Source snapshot name and snapshot temp location should be provided"<a name="line.640"></a>
-<span class="sourceLineNo">641</span>            + " to use snapshots in source cluster");<a name="line.641"></a>
-<span class="sourceLineNo">642</span>        return false;<a name="line.642"></a>
-<span class="sourceLineNo">643</span>      }<a name="line.643"></a>
-<span class="sourceLineNo">644</span><a name="line.644"></a>
-<span class="sourceLineNo">645</span>      if (peerSnapshotName != null || peerSnapshotTmpDir != null || peerFSAddress != null<a name="line.645"></a>
-<span class="sourceLineNo">646</span>          || peerHBaseRootAddress != null) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>        if (peerSnapshotName == null || peerSnapshotTmpDir == null || peerFSAddress == null<a name="line.647"></a>
-<span class="sourceLineNo">648</span>            || peerHBaseRootAddress == null) {<a name="line.648"></a>
-<span class="sourceLineNo">649</span>          printUsage(<a name="line.649"></a>
-<span class="sourceLineNo">650</span>            "Peer snapshot name, peer snapshot temp location, Peer HBase root address and  "<a name="line.650"></a>
-<span class="sourceLineNo">651</span>                + "peer FSAddress should be provided to use snapshots in peer cluster");<a name="line.651"></a>
-<span class="sourceLineNo">652</span>          return false;<a name="line.652"></a>
-<span class="sourceLineNo">653</span>        }<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      }<a name="line.654"></a>
-<span class="sourceLineNo">655</span><a name="line.655"></a>
-<span class="sourceLineNo">656</span>      // This is to avoid making recompare calls to source/peer tables when snapshots are used<a name="line.656"></a>
-<span class="sourceLineNo">657</span>      if ((sourceSnapshotName != null || peerSnapshotName != null) &amp;&amp; sleepMsBeforeReCompare &gt; 0) {<a name="line.657"></a>
-<span class="sourceLineNo">658</span>        printUsage(<a name="line.658"></a>
-<span class="sourceLineNo">659</span>          "Using sleepMsBeforeReCompare along with snapshots is not allowed as snapshots are immutable");<a name="line.659"></a>
-<span class="sourceLineNo">660</span>        return false;<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>    } catch (Exception e) {<a name="line.663"></a>
-<span class="sourceLineNo">664</span>      LOG.error("Failed to parse commandLine arguments", e);<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      printUsage("Can't start because " + e.getMessage());<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      return false;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    }<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    return true;<a name="line.668"></a>
-<span class="sourceLineNo">669</span>  }<a name="line.669"></a>
+<span class="sourceLineNo">438</span>      // for verifyRep by snapshot, choose a unique sub-directory under peerSnapshotTmpDir to<a name="line.438"></a>
+<span class="sourceLineNo">439</span>      // restore snapshot.<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      Path restoreDir = new Path(peerSnapshotTmpDir, UUID.randomUUID().toString());<a name="line.440"></a>
+<span class="sourceLineNo">441</span>      peerSnapshotTmpDir = restoreDir.toString();<a name="line.441"></a>
+<span class="sourceLineNo">442</span>      conf.set(NAME + ".peerSnapshotTmpDir", peerSnapshotTmpDir);<a name="line.442"></a>
+<span class="sourceLineNo">443</span><a name="line.443"></a>
+<span class="sourceLineNo">444</span>      conf.set(NAME + ".peerFSAddress", peerFSAddress);<a name="line.444"></a>
+<span class="sourceLineNo">445</span>      conf.set(NAME + ".peerHBaseRootAddress", peerHBaseRootAddress);<a name="line.445"></a>
+<span class="sourceLineNo">446</span><a name="line.446"></a>
+<span class="sourceLineNo">447</span>      // This is to create HDFS delegation token for peer cluster in case of secured<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      conf.setStrings(MRJobConfig.JOB_NAMENODES, peerFSAddress, conf.get(HConstants.HBASE_DIR));<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>    Job job = Job.getInstance(conf, conf.get(JOB_NAME_CONF_KEY, NAME + "_" + tableName));<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    job.setJarByClass(VerifyReplication.class);<a name="line.452"></a>
+<span class="sourceLineNo">453</span><a name="line.453"></a>
+<span class="sourceLineNo">454</span>    Scan scan = new Scan();<a name="line.454"></a>
+<span class="sourceLineNo">455</span>    scan.setTimeRange(startTime, endTime);<a name="line.455"></a>
+<span class="sourceLineNo">456</span>    scan.setRaw(includeDeletedCells);<a name="line.456"></a>
+<span class="sourceLineNo">457</span>    scan.setCacheBlocks(false);<a name="line.457"></a>
+<span class="sourceLineNo">458</span>    if (batch &gt; 0) {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>      scan.setBatch(batch);<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    }<a name="line.460"></a>
+<span class="sourceLineNo">461</span>    if (versions &gt;= 0) {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      scan.setMaxVersions(versions);<a name="line.462"></a>
+<span class="sourceLineNo">463</span>      LOG.info("Number of versions set to " + versions);<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    }<a name="line.464"></a>
+<span class="sourceLineNo">465</span>    if(families != null) {<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      String[] fams = families.split(",");<a name="line.466"></a>
+<span class="sourceLineNo">467</span>      for(String fam : fams) {<a name="line.467"></a>
+<span class="sourceLineNo">468</span>        scan.addFamily(Bytes.toBytes(fam));<a name="line.468"></a>
+<span class="sourceLineNo">469</span>      }<a name="line.469"></a>
+<span class="sourceLineNo">470</span>    }<a name="line.470"></a>
+<span class="sourceLineNo">471</span><a name="line.471"></a>
+<span class="sourceLineNo">472</span>    setRowPrefixFilter(scan, rowPrefixes);<a name="line.472"></a>
+<span class="sourceLineNo">473</span><a name="line.473"></a>
+<span class="sourceLineNo">474</span>    if (sourceSnapshotName != null) {<a name="line.474"></a>
+<span class="sourceLineNo">475</span>      Path snapshotTempPath = new Path(sourceSnapshotTmpDir);<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      LOG.info(<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        "Using source snapshot-" + sourceSnapshotName + " with temp dir:" + sourceSnapshotTmpDir);<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      TableMapReduceUtil.initTableSnapshotMapperJob(sourceSnapshotName, scan, Verifier.class, null,<a name="line.478"></a>
+<span class="sourceLineNo">479</span>        null, job, true, snapshotTempPath);<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      restoreSnapshotForPeerCluster(conf, peerQuorumAddress);<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    } else {<a name="line.481"></a>
+<span class="sourceLineNo">482</span>      TableMapReduceUtil.initTableMapperJob(tableName, scan, Verifier.class, null, null, job);<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    }<a name="line.483"></a>
+<span class="sourceLineNo">484</span><a name="line.484"></a>
+<span class="sourceLineNo">485</span>    if (peerId != null) {<a name="line.485"></a>
+<span class="sourceLineNo">486</span>      assert peerConfigPair != null;<a name="line.486"></a>
+<span class="sourceLineNo">487</span>      Configuration peerClusterConf = peerConfigPair.getSecond();<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      // Obtain the auth token from peer cluster<a name="line.488"></a>
+<span class="sourceLineNo">489</span>      TableMapReduceUtil.initCredentialsForCluster(job, peerClusterConf);<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    }<a name="line.490"></a>
+<span class="sourceLineNo">491</span><a name="line.491"></a>
+<span class="sourceLineNo">492</span>    job.setOutputFormatClass(NullOutputFormat.class);<a name="line.492"></a>
+<span class="sourceLineNo">493</span>    job.setNumReduceTasks(0);<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    return job;<a name="line.494"></a>
+<span class="sourceLineNo">495</span>  }<a name="line.495"></a>
+<span class="sourceLineNo">496</span><a name="line.496"></a>
+<span class="sourceLineNo">497</span>  private static void setRowPrefixFilter(Scan scan, String rowPrefixes) {<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    if (rowPrefixes != null &amp;&amp; !rowPrefixes.isEmpty()) {<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      String[] rowPrefixArray = rowPrefixes.split(",");<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      Arrays.sort(rowPrefixArray);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ONE);<a name="line.501"></a>
+<span class="sourceLineNo">502</span>      for (String prefix : rowPrefixArray) {<a name="line.502"></a>
+<span class="sourceLineNo">503</span>        Filter filter = new PrefixFilter(Bytes.toBytes(prefix));<a name="line.503"></a>
+<span class="sourceLineNo">504</span>        filterList.addFilter(filter);<a name="line.504"></a>
+<span class="sourceLineNo">505</span>      }<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      scan.setFilter(filterList);<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      byte[] startPrefixRow = Bytes.toBytes(rowPrefixArray[0]);<a name="line.507"></a>
+<span class="sourceLineNo">508</span>      byte[] lastPrefixRow = Bytes.toBytes(rowPrefixArray[rowPrefixArray.length -1]);<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      setStartAndStopRows(scan, startPrefixRow, lastPrefixRow);<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    }<a name="line.510"></a>
+<span class="sourceLineNo">511</span>  }<a name="line.511"></a>
+<span class="sourceLineNo">512</span><a name="line.512"></a>
+<span class="sourceLineNo">513</span>  private static void setStartAndStopRows(Scan scan, byte[] startPrefixRow, byte[] lastPrefixRow) {<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    scan.setStartRow(startPrefixRow);<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    byte[] stopRow = Bytes.add(Bytes.head(lastPrefixRow, lastPrefixRow.length - 1),<a name="line.515"></a>
+<span class="sourceLineNo">516</span>        new byte[]{(byte) (lastPrefixRow[lastPrefixRow.length - 1] + 1)});<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    scan.setStopRow(stopRow);<a name="line.517"></a>
+<span class="sourceLineNo">518</span>  }<a name="line.518"></a>
+<span class="sourceLineNo">519</span><a name="line.519"></a>
+<span class="sourceLineNo">520</span>  @VisibleForTesting<a name="line.520"></a>
+<span class="sourceLineNo">521</span>  public boolean doCommandLine(final String[] args) {<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    if (args.length &lt; 2) {<a name="line.522"></a>
+<span class="sourceLineNo">523</span>      printUsage(null);<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      return false;<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    }<a name="line.525"></a>
+<span class="sourceLineNo">526</span>    try {<a name="line.526"></a>
+<span class="sourceLineNo">527</span>      for (int i = 0; i &lt; args.length; i++) {<a name="line.527"></a>
+<span class="sourceLineNo">528</span>        String cmd = args[i];<a name="line.528"></a>
+<span class="sourceLineNo">529</span>        if (cmd.equals("-h") || cmd.startsWith("--h")) {<a name="line.529"></a>
+<span class="sourceLineNo">530</span>          printUsage(null);<a name="line.530"></a>
+<span class="sourceLineNo">531</span>          return false;<a name="line.531"></a>
+<span class="sourceLineNo">532</span>        }<a name="line.532"></a>
+<span class="sourceLineNo">533</span><a name="line.533"></a>
+<span class="sourceLineNo">534</span>        final String startTimeArgKey = "--starttime=";<a name="line.534"></a>
+<span class="sourceLineNo">535</span>        if (cmd.startsWith(startTimeArgKey)) {<a name="line.535"></a>
+<span class="sourceLineNo">536</span>          startTime = Long.parseLong(cmd.substring(startTimeArgKey.length()));<a name="line.536"></a>
+<span class="sourceLineNo">537</span>          continue;<a name="line.537"></a>
+<span class="sourceLineNo">538</span>        }<a name="line.538"></a>
+<span class="sourceLineNo">539</span><a name="line.539"></a>
+<span class="sourceLineNo">540</span>        final String endTimeArgKey = "--endtime=";<a name="line.540"></a>
+<span class="sourceLineNo">541</span>        if (cmd.startsWith(endTimeArgKey)) {<a name="line.541"></a>
+<span class="sourceLineNo">542</span>          endTime = Long.parseLong(cmd.substring(endTimeArgKey.length()));<a name="line.542"></a>
+<span class="sourceLineNo">543</span>          continue;<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>        final String includeDeletedCellsArgKey = "--raw";<a name="line.546"></a>
+<span class="sourceLineNo">547</span>        if (cmd.equals(includeDeletedCellsArgKey)) {<a name="line.547"></a>
+<span class="sourceLineNo">548</span>          includeDeletedCells = true;<a name="line.548"></a>
+<span class="sourceLineNo">549</span>          continue;<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>        final String versionsArgKey = "--versions=";<a name="line.552"></a>
+<span class="sourceLineNo">553</span>        if (cmd.startsWith(versionsArgKey)) {<a name="line.553"></a>
+<span class="sourceLineNo">554</span>          versions = Integer.parseInt(cmd.substring(versionsArgKey.length()));<a name="line.554"></a>
+<span class="sourceLineNo">555</span>          continue;<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>        final String batchArgKey = "--batch=";<a name="line.558"></a>
+<span class="sourceLineNo">559</span>        if (cmd.startsWith(batchArgKey)) {<a name="line.559"></a>
+<span class="sourceLineNo">560</span>          batch = Integer.parseInt(cmd.substring(batchArgKey.length()));<a name="line.560"></a>
+<span class="sourceLineNo">561</span>          continue;<a name="line.561"></a>
+<span class="sourceLineNo">562</span>        }<a name="line.562"></a>
+<span class="sourceLineNo">563</span><a name="line.563"></a>
+<span class="sourceLineNo">564</span>        final String familiesArgKey = "--families=";<a name="line.564"></a>
+<span class="sourceLineNo">565</span>        if (cmd.startsWith(familiesArgKey)) {<a name="line.565"></a>
+<span class="sourceLineNo">566</span>          families = cmd.substring(familiesArgKey.length());<a name="line.566"></a>
+<span class="sourceLineNo">567</span>          continue;<a name="line.567"></a>
+<span class="sourceLineNo">568</span>        }<a name="line.568"></a>
+<span class="sourceLineNo">569</span><a name="line.569"></a>
+<span class="sourceLineNo">570</span>        final String rowPrefixesKey = "--row-prefixes=";<a name="line.570"></a>
+<span class="sourceLineNo">571</span>        if (cmd.startsWith(rowPrefixesKey)){<a name="line.571"></a>
+<span class="sourceLineNo">572</span>          rowPrefixes = cmd.substring(rowPrefixesKey.length());<a name="line.572"></a>
+<span class="sourceLineNo">573</span>          continue;<a name="line.573"></a>
+<span class="sourceLineNo">574</span>        }<a name="line.574"></a>
+<span class="sourceLineNo">575</span><a name="line.575"></a>
+<span class="sourceLineNo">576</span>        final String delimiterArgKey = "--delimiter=";<a name="line.576"></a>
+<span class="sourceLineNo">577</span>        if (cmd.startsWith(delimiterArgKey)) {<a name="line.577"></a>
+<span class="sourceLineNo">578</span>          delimiter = cmd.substring(delimiterArgKey.length());<a name="line.578"></a>
+<span class="sourceLineNo">579</span>          continue;<a name="line.579"></a>
+<span class="sourceLineNo">580</span>        }<a name="line.580"></a>
+<span class="sourceLineNo">581</span><a name="line.581"></a>
+<span class="sourceLineNo">582</span>        final String sleepToReCompareKey = "--recomparesleep=";<a name="line.582"></a>
+<span class="sourceLineNo">583</span>        if (cmd.startsWith(sleepToReCompareKey)) {<a name="line.583"></a>
+<span class="sourceLineNo">584</span>          sleepMsBeforeReCompare = Integer.parseInt(cmd.substring(sleepToReCompareKey.length()));<a name="line.584"></a>
+<span class="sourceLineNo">585</span>          continue;<a name="line.585"></a>
+<span class="sourceLineNo">586</span>        }<a name="line.586"></a>
+<span class="sourceLineNo">587</span>        final String verboseKey = "--verbose";<a name="line.587"></a>
+<span class="sourceLineNo">588</span>        if (cmd.startsWith(verboseKey)) {<a name="line.588"></a>
+<span class="sourceLineNo">589</span>          verbose = true;<a name="line.589"></a>
+<span class="sourceLineNo">590</span>          continue;<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>        final String sourceSnapshotNameArgKey = "--sourceSnapshotName=";<a name="line.593"></a>
+<span class="sourceLineNo">594</span>        if (cmd.startsWith(sourceSnapshotNameArgKey)) {<a name="line.594"></a>
+<span class="sourceLineNo">595</span>          sourceSnapshotName = cmd.substring(sourceSnapshotNameArgKey.length());<a name="line.595"></a>
+<span class="sourceLineNo">596</span>          continue;<a name="line.596"></a>
+<span class="sourceLineNo">597</span>        }<a name="line.597"></a>
+<span class="sourceLineNo">598</span><a name="line.598"></a>
+<span class="sourceLineNo">599</span>        final String sourceSnapshotTmpDirArgKey = "--sourceSnapshotTmpDir=";<a name="line.599"></a>
+<span class="sourceLineNo">600</span>        if (cmd.startsWith(sourceSnapshotTmpDirArgKey)) {<a name="line.600"></a>
+<span class="sourceLineNo">601</span>          sourceSnapshotTmpDir = cmd.substring(sourceSnapshotTmpDirArgKey.length());<a name="line.601"></a>
+<span class="sourceLineNo">602</span>          continue;<a name="line.602"></a>
+<span class="sourceLineNo">603</span>        }<a name="line.603"></a>
+<span class="sourceLineNo">604</span><a name="line.604"></a>
+<span class="sourceLineNo">605</span>        final String peerSnapshotNameArgKey = "--peerSnapshotName=";<a name="line.605"></a>
+<span class="sourceLineNo">606</span>        if (cmd.startsWith(peerSnapshotNameArgKey)) {<a name="line.606"></a>
+<span class="sourceLineNo">607</span>          peerSnapshotName = cmd.substring(peerSnapshotNameArgKey.length());<a name="line.607"></a>
+<span class="sourceLineNo">608</span>          continue;<a name="line.608"></a>
+<span class="sourceLineNo">609</span>        }<a name="line.609"></a>
+<span class="sourceLineNo">610</span><a name="line.610"></a>
+<span class="sourceLineNo">611</span>        final String peerSnapshotTmpDirArgKey = "--peerSnapshotTmpDir=";<a name="line.611"></a>
+<span class="sourceLineNo">612</span>        if (cmd.startsWith(peerSnapshotTmpDirArgKey)) {<a name="line.612"></a>
+<span class="sourceLineNo">613</span>          peerSnapshotTmpDir = cmd.substring(peerSnapshotTmpDirArgKey.length());<a name="line.613"></a>
+<span class="sourceLineNo">614</span>          continue;<a name="line.614"></a>
+<span class="sourceLineNo">615</span>        }<a name="line.615"></a>
+<span class="sourceLineNo">616</span><a name="line.616"></a>
+<span class="sourceLineNo">617</span>        final String peerFSAddressArgKey = "--peerFSAddress=";<a name="line.617"></a>
+<span class="sourceLineNo">618</span>        if (cmd.startsWith(peerFSAddressArgKey)) {<a name="line.618"></a>
+<span class="sourceLineNo">619</span>          peerFSAddress = cmd.substring(peerFSAddressArgKey.length());<a name="line.619"></a>
+<span class="sourceLineNo">620</span>          continue;<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>        final String peerHBaseRootAddressArgKey = "--peerHBaseRootAddress=";<a name="line.623"></a>
+<span class="sourceLineNo">624</span>        if (cmd.startsWith(peerHBaseRootAddressArgKey)) {<a name="line.624"></a>
+<span class="sourceLineNo">625</span>          peerHBaseRootAddress = cmd.substring(peerHBaseRootAddressArgKey.length());<a name="line.625"></a>
+<span class="sourceLineNo">626</span>          continue;<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>        final String peerTableNameArgKey = "--peerTableName=";<a name="line.629"></a>
+<span class="sourceLineNo">630</span>        if (cmd.startsWith(peerTableNameArgKey)) {<a name="line.630"></a>
+<span class="sourceLineNo">631</span>          peerTableName = cmd.substring(peerTableNameArgKey.length());<a name="line.631"></a>
+<span class="sourceLineNo">632</span>          continue;<a name="line.632"></a>
+<span class="sourceLineNo">633</span>        }<a name="line.633"></a>
+<span class="sourceLineNo">634</span><a name="line.634"></a>
+<span class="sourceLineNo">635</span>        if (cmd.startsWith("--")) {<a name="line.635"></a>
+<span class="sourceLineNo">636</span>          printUsage("Invalid argument '" + cmd + "'");<a name="line.636"></a>
+<span class="sourceLineNo">637</span>          return false;<a name="line.637"></a>
+<span class="sourceLineNo">638</span>        }<a name="line.638"></a>
+<span class="sourceLineNo">639</span><a name="line.639"></a>
+<span class="sourceLineNo">640</span>        if (i == args.length-2) {<a name="line.640"></a>
+<span class="sourceLineNo">641</span>          if (isPeerQuorumAddress(cmd)) {<a name="line.641"></a>
+<span class="sourceLineNo">642</span>            peerQuorumAddress = cmd;<a name="line.642"></a>
+<span class="sourceLineNo">643</span>          } else {<a name="line.643"></a>
+<span class="sourceLineNo">644</span>            peerId = cmd;<a name="line.644"></a>
+<span class="sourceLineNo">645</span>          }<a name="line.645"></a>
+<span class="sourceLineNo">646</span>        }<a name="line.646"></a>
+<span class="sourceLineNo">647</span><a name="line.647"></a>
+<span class="sourceLineNo">648</span>        if (i == args.length-1) {<a name="line.648"></a>
+<span class="sourceLineNo">649</span>          tableName = cmd;<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><a name="line.652"></a>
+<span class="sourceLineNo">653</span>      if ((sourceSnapshotName != null &amp;&amp; sourceSnapshotTmpDir == null)<a name="line.653"></a>
+<span class="sourceLineNo">654</span>          || (sourceSnapshotName == null &amp;&amp; sourceSnapshotTmpDir != null)) {<a name="line.654"></a>
+<span class="sourceLineNo">655</span>        printUsage("Source snapshot name and snapshot temp location should be provided"<a name="line.655"></a>
+<span class="sourceLineNo">656</span>            + " to use snapshots in source cluster");<a name="line.656"></a>
+<span class="sourceLineNo">657</span>        return false;<a name="line.657"></a>
+<span class="sourceLineNo">658</span>      }<a name="line.658"></a>
+<span class="sourceLineNo">659</span><a name="line.659"></a>
+<span class="sourceLineNo">660</span>      if (peerSnapshotName != null || peerSnapshotTmpDir != null || peerFSAddress != null<a name="line.660"></a>
+<span class="sourceLineNo">661</span>          || peerHBaseRootAddress != null) {<a name="line.661"></a>
+<span class="sourceLineNo">662</span>        if (peerSnapshotName == null || peerSnapshotTmpDir == null || peerFSAddress == null<a name="line.662"></a>
+<span class="sourceLineNo">663</span>            || peerHBaseRootAddress == null) {<a name="line.663"></a>
+<span class="sourceLineNo">664</span>          printUsage(<a name="line.664"></a>
+<span class="sourceLineNo">665</span>            "Peer snapshot name, peer snapshot temp location, Peer HBase root address and  "<a name="line.665"></a>
+<span class="sourceLineNo">666</span>                + "peer FSAddress should be provided to use snapshots in peer cluster");<a name="line.666"></a>
+<span class="sourceLineNo">667</span>          return false;<a name="line.667"></a>
+<span class="sourceLineNo">668</span>        }<a name="line.668"></a>
+<span class="sourceLineNo">669</span>      }<a name="line.669"></a>
 <span class="sourceLineNo">670</span><a name="line.670"></a>
-<span class="sourceLineNo">671</span>  private boolean isPeerQuorumAddress(String cmd) {<a name="line.671"></a>
-<span class="sourceLineNo">672</span>    try {<a name="line.672"></a>
-<span class="sourceLineNo">673</span>      ZKConfig.validateClusterKey(cmd);<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    } catch (IOException e) {<a name="line.674"></a>
-<span class="sourceLineNo">675</span>      // not a quorum address<a name="line.675"></a>
-<span class="sourceLineNo">676</span>      return false;<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    }<a name="line.677"></a>
-<span class="sourceLineNo">678</span>    return true;<a name="line.678"></a>
-<span class="sourceLineNo">679</span>  }<a name="line.679"></a>
-<span class="sourceLineNo">680</span><a name="line.680"></a>
-<span class="sourceLineNo">681</span>  /*<a name="line.681"></a>
-<span class="sourceLineNo">682</span>   * @param errorMsg Error message.  Can be null.<a name="line.682"></a>
-<span class="sourceLineNo">683</span>   */<a name="line.683"></a>
-<span class="sourceLineNo">684</span>  private static void printUsage(final String errorMsg) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>    if (errorMsg != null &amp;&amp; errorMsg.length() &gt; 0) {<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      System.err.println("ERROR: " + errorMsg);<a name="line.686"></a>
-<span class="sourceLineNo">687</span>    }<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    System.err.println("Usage: verifyrep [--starttime=X]" +<a name="line.688"></a>
-<span class="sourceLineNo">689</span>        " [--endtime=Y] [--families=A] [--row-prefixes=B] [--delimiter=] [--recomparesleep=] " +<a name="line.689"></a>
-<span class="sourceLineNo">690</span>        "[--batch=] [--verbose] [--sourceSnapshotName=P] [--sourceSnapshotTmpDir=Q] "<a name="line.690"></a>
-<span class="sourceLineNo">691</span>      + "[--peerSnapshotName=R] [--peerSnapshotTmpDir=S] [--peerFSAddress=T] "<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      + "[--peerHBaseRootAddress=U] &lt;peerid|peerQuorumAddress&gt; &lt;tablename&gt;");<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    System.err.println();<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    System.err.println("Options:");<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    System.err.println(" starttime    beginning of the time range");<a name="line.695"></a>
-<span class="sourceLineNo">696</span>    System.err.println("              without endtime means from starttime to forever");<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    System.err.println(" endtime      end of the time range");<a name="line.697"></a>
-<span class="sourceLineNo">698</span>    System.err.println(" versions     number of cell versions to verify");<a name="line.698"></a>
-<span class="sourceLineNo">699</span>    System.err.println(" batch        batch count for scan, " +<a name="line.699"></a>
-<span class="sourceLineNo">700</span>        "note that result row counts will no longer be actual number of rows when you use this option");<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    System.err.println(" raw          includes raw scan if given in options");<a name="line.701"></a>
-<span class="sourceLineNo">702</span>    System.err.println(" families     comma-separated list of families to copy");<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    System.err.println(" row-prefixes comma-separated list of row key prefixes to filter on ");<a name="line.703"></a>
-<span class="sourceLineNo">704</span>    System.err.println(" delimiter    the delimiter used in display around rowkey");<a name="line.704"></a>
-<span class="sourceLineNo">705</span>    System.err.println(" recomparesleep   milliseconds to sleep before recompare row, " +<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        "default value is 0 which disables the recompare.");<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    System.err.println(" verbose      logs row keys of good rows");<a name="line.707"></a>
-<span class="sourceLineNo">708</span>    System.err.println(" sourceSnapshotName  Source Snapshot Name");<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    System.err.println(" sourceSnapshotTmpDir Tmp location to restore source table snapshot");<a name="line.709"></a>
-<span class="sourceLineNo">710</span>    System.err.println(" peerSnapshotName  Peer Snapshot Name");<a name="line.710"></a>
-<span class="sourceLineNo">711</span>    System.err.println(" peerSnapshotTmpDir Tmp location to restore peer table snapshot");<a name="line.711"></a>
-<span class="sourceLineNo">712</span>    System.err.println(" peerFSAddress      Peer cluster Hadoop FS address");<a name="line.712"></a>
-<span class="sourceLineNo">713</span>    System.err.println(" peerHBaseRootAddress  Peer cluster HBase root location");<a name="line.713"></a>
-<span class="sourceLineNo">714</span>    System.err.println();<a name="line.714"></a>
-<span class="sourceLineNo">715</span>    System.err.println("Args:");<a name="line.715"></a>
-<span class="sourceLineNo">716</span>    System.err.println(" peerid       Id of the peer used for verification, must match the one given for replication");<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    System.err.println(" peerQuorumAddress   quorumAdress of the peer used for verification. The "<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      + "format is zk_quorum:zk_port:zk_hbase_path");<a name="line.718"></a>
-<span class="sourceLineNo">719</span>    System.err.println(" tablename    Name of the table to verify");<a name="line.719"></a>
-<span class="sourceLineNo">720</span>    System.err.println();<a name="line.720"></a>
-<span class="sourceLineNo">721</span>    System.err.println("Examples:");<a name="line.721"></a>
-<span class="sourceLineNo">722</span>    System.err.println(" To verify the data replicated from TestTable for a 1 hour window with peer #5 ");<a name="line.722"></a>
-<span class="sourceLineNo">723</span>    System.err.println(" $ hbase " +<a name="line.723"></a>
-<span class="sourceLineNo">724</span>        "org.apache.hadoop.hbase.mapreduce.replication.VerifyReplication" +<a name="line.724"></a>
-<span class="sourceLineNo">725</span>        " --starttime=1265875194289 --endtime=1265878794289 5 TestTable ");<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>  @Override<a name="line.728"></a>
-<span class="sourceLineNo">729</span>  public int run(String[] args) throws Exception {<a name="line.729"></a>
-<span class="sourceLineNo">730</span>    Configuration conf = this.getConf();<a name="line.730"></a>
-<span class="sourceLineNo">731</span>    Job job = createSubmittableJob(conf, args);<a name="line.731"></a>
-<span class="sourceLineNo">732</span>    if (job != null) {<a name="line.732"></a>
-<span class="sourceLineNo">733</span>      return job.waitForCompletion(true) ? 0 : 1;<a name="line.733"></a>
-<span class="sourceLineNo">734</span>    }<a name="line.734"></a>
-<span class="sourceLineNo">735</span>    return 1;<a name="line.735"></a>
-<span class="sourceLineNo">736</span>  }<a name="line.736"></a>
-<span class="sourceLineNo">737</span><a name="line.737"></a>
-<span class="sourceLineNo">738</span>  /**<a name="line.738"></a>
-<span class="sourceLineNo">739</span>   * Main entry point.<a name="line.739"></a>
-<span class="sourceLineNo">740</span>   *<a name="line.740"></a>
-<span class="sourceLineNo">741</span>   * @param args  The command line parameters.<a name="line.741"></a>
-<span class="sourceLineNo">742</span>   * @throws Exception When running the job fails.<a name="line.742"></a>
-<span class="sourceLineNo">743</span>   */<a name="line.743"></a>
-<span class="sourceLineNo">744</span>  public static void main(String[] args) throws Exception {<a name="line.744"></a>
-<span class="sourceLineNo">745</span>    int res = ToolRunner.run(HBaseConfiguration.create(), new VerifyReplication(), args);<a name="line.745"></a>
-<span class="sourceLineNo">746</span>    System.exit(res);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>  }<a name="line.747"></a>
-<span class="sourceLineNo">748</span>}<a name="line.748"></a>
+<span class="sourceLineNo">671</span>      // This is to avoid making recompare calls to source/peer tables when snapshots are used<a name="line.671"></a>
+<span class="sourceLineNo">672</span>      if ((sourceSnapshotName != null || peerSnapshotName != null) &amp;&amp; sleepMsBeforeReCompare &gt; 0) {<a name="line.672"></a>
+<span class="sourceLineNo">673</span>        printUsage(<a name="line.673"></a>
+<span class="sourceLineNo">674</span>          "Using sleepMsBeforeReCompare along with snapshots is not allowed as snapshots are immutable");<a name="line.674"></a>
+<span class="sourceLineNo">675</span>        return false;<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>    } catch (Exception e) {<a name="line.678"></a>
+<span class="sourceLineNo">679</span>      LOG.error("Failed to parse commandLine arguments", e);<a name="line.679"></a>
+<span class="sourceLineNo">680</span>      printUsage("Can't start because " + e.getMessage());<a name="line.680"></a>
+<span class="sourceLineNo">681</span>      return false;<a name="line.681"></a>
+<span class="sourceLineNo">682</span>    }<a name="line.682"></a>
+<span class="sourceLineNo">683</span>    return true;<a name="line.683"></a>
+<span class="sourceLineNo">684</span>  }<a name="line.684"></a>
+<span class="sourceLineNo">685</span><a name="line.685"></a>
+<span class="sourceLineNo">686</span>  private boolean isPeerQuorumAddress(String cmd) {<a name="line.686"></a>
+<span class="sourceLineNo">687</span>    try {<a name="line.687"></a>
+<span class="sourceLineNo">688</span>      ZKConfig.validateClusterKey(cmd);<a name="line.688"></a>
+<span class="sourceLineNo">689</span>    } catch (IOException e) {<a name="line.689"></a>
+<span class="sourceLineNo">690</span>      // not a quorum address<a name="line.690"></a>
+<span class="sourceLineNo">691</span>      return false;<a name="line.691"></a>
+<span class="sourceLineNo">692</span>    }<a name="line.692"></a>
+<span class="sourceLineNo">693</span>    return true;<a name="line.693"></a>
+<span class="sourceLineNo">694</span>  }<a name="line.694"></a>
+<span class="sourceLineNo">695</span><a name="line.695"></a>
+<span class="sourceLineNo">696</span>  /*<a name="line.696"></a>
+<span class="sourceLineNo">697</span>   * @param errorMsg Error message.  Can be null.<a name="line.697"></a>
+<span class="sourceLineNo">698</span>   */<a name="line.698"></a>
+<span class="sourceLineNo">699</span>  private static void printUsage(final String errorMsg) {<a name="line.699"></a>
+<span class="sourceLineNo">700</span>    if (errorMsg != null &amp;&amp; errorMsg.length() &gt; 0) {<a name="line.700"></a>
+<span class="sourceLineNo">701</span>      System.err.println("ERROR: " + errorMsg);<a name="line.701"></a>
+<span class="sourceLineNo">702</span>    }<a name="line.702"></a>
+<span class="sourceLineNo">703</span>    System.err.println("Usage: verifyrep [--starttime=X]"<a name="line.703"></a>
+<span class="sourceLineNo">704</span>        + " [--endtime=Y] [--families=A] [--row-prefixes=B] [--delimiter=] [--recomparesleep=] "<a name="line.704"></a>
+<span class="sourceLineNo">705</span>        + "[--batch=] [--verbose] [--peerTableName=] [--sourceSnapshotName=P] "<a name="line.705"></a>
+<span class="sourceLineNo">706</span>        + "[--sourceSnapshotTmpDir=Q] [--peerSnapshotName=R] [--peerSnapshotTmpDir=S] "<a name="line.706"></a>
+<span class="sourceLineNo">707</span>        + "[--peerFSAddress=T] [--peerHBaseRootAddress=U] &lt;peerid|peerQuorumAddress&gt; &lt;tablename&gt;");<a name="line.707"></a>
+<span class="sourceLineNo">708</span>    System.err.println();<a name="line.708"></a>
+<span class="sourceLineNo">709</span>    System.err.println("Options:");<a name="line.709"></a>
+<span class="sourceLineNo">710</span>    System.err.println(" starttime    beginning of the time range");<a name="line.710"></a>
+<span class="sourceLineNo">711</span>    System.err.println("              without endtime means from starttime to forever");<a name="line.711"></a>
+<span class="sourceLineNo">712</span>    System.err.println(" endtime      end of the time range");<a name="line.712"></a>
+<span class="sourceLineNo">713</span>    System.err.println(" versions     number of cell versions to verify");<a name="line.713"></a>
+<span class="sourceLineNo">714</span>    System.err.println(" batch        batch count for scan, " +<a name="line.714"></a>
+<span class="sourceLineNo">715</span>        "note that result row counts will no longer be actual number of rows when you use this option");<a name="line.715"></a>
+<span class="sourceLineNo">716</span>    System.err.println(" raw          includes raw scan if given in options");<a name="line.716"></a>
+<span class="sourceLineNo">717</span>    System.err.println(" families     comma-separated list of families to copy");<a name="line.717"></a>
+<span class="sourceLineNo">718</span>    System.err.println(" row-prefixes comma-separated list of row key prefixes to filter on ");<a name="line.718"></a>
+<span class="sourceLineNo">719</span>    System.err.println(" delimiter    the delimiter used in display around rowkey");<a name="line.719"></a>
+<span class="sourceLineNo">720</span>    System.err.println(" recomparesleep   milliseconds to sleep before recompare row, " +<a name="line.720"></a>
+<span class="sourceLineNo">721</span>        "default value is 0 which disables the recompare.");<a name="line.721"></a>
+<span class="sourceLineNo">722</span>    System.err.println(" verbose      logs row keys of good rows");<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    System.err.println(" peerTableName  Peer Table Name");<a name="line.723"></a>
+<span class="sourceLineNo">724</span>    System.err.println(" sourceSnapshotName  Source Snapshot Name");<a name="line.724"></a>
+<span class="sourceLineNo">725</span>    System.err.println(" sourceSnapshotTmpDir Tmp location to restore source table snapshot");<a name="line.725"></a>
+<span class="sourceLineNo">726</span>    System.err.println(" peerSnapshotName  Peer Snapshot Name");<a name="line.726"></a>
+<span class="sourceLineNo">727</span>    System.err.println(" peerSnapshotTmpDir Tmp location to restore peer table snapshot");<a name="line.727"></a>
+<span class="sourceLineNo">728</span>    System.err.println(" peerFSAddress      Peer cluster Hadoop FS address");<a name="line.728"></a>
+<span class="sourceLineNo">729</span>    System.err.println(" peerHBaseRootAddress  Peer cluster HBase root location");<a name="line.729"></a>
+<span class="sourceLineNo">730</span>    System.err.println();<a name="line.730"></a>
+<span class="sourceLineNo">731</span>    System.err.println("Args:");<a name="line.731"></a>
+<span class="sourceLineNo">732</span>    System.err.println(" peerid       Id of the peer used for verification, must match the one given for replication");<a name="line.732"></a>
+<span class="sourceLineNo">733</span>    System.err.println(" peerQuorumAddress   quorumAdress of the peer used for verification. The "<a name="line.733"></a>
+<span class="sourceLineNo">734</span>      + "format is zk_quorum:zk_port:zk_hbase_path");<a name="line.734"></a>
+<span class="sourceLineNo">735</span>    System.err.println(" tablename    Name of the table to verify");<a name="line.735"></a>
+<span class="sourceLineNo">736</span>    System.err.println();<a name="line.736"></a>
+<span class="sourceLineNo">737</span>    System.err.println("Examples:");<a name="line.737"></a>
+<span class="sourceLineNo">738</span>    System.err.println(" To verify the data replicated from TestTable for a 1 hour window with peer #5 ");<a name="line.738"></a>
+<span class="sourceLineNo">739</span>    System.err.println(" $ hbase " +<a name="line.739"></a>
+<span class="sourceLineNo">740</span>        "org.apache.hadoop.hbase.mapreduce.replication.VerifyReplication" +<a name="line.740"></a>
+<span class="sourceLineNo">741</span>        " --starttime=1265875194289 --endtime=1265878794289 5 TestTable ");<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>  @Override<a name="line.744"></a>
+<span class="sourceLineNo">745</span>  public int run(String[] args) throws Exception {<a name="line.745"></a>
+<span class="sourceLineNo">746</span>    Configuration conf = this.getConf();<a name="line.746"></a>
+<span class="sourceLineNo">747</span>    Job job = createSubmittableJob(conf, args);<a name="line.747"></a>
+<span class="sourceLineNo">748</span>    if (job != null) {<a name="line.748"></a>
+<span class="sourceLineNo">749</span>      return job.waitForCompletion(true) ? 0 : 1;<a name="line.749"></a>
+<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
+<span class="sourceLineNo">751</span>    return 1;<a name="line.751"></a>
+<span class="sourceLineNo">752</span>  }<a name="line.752"></a>
+<span class="sourceLineNo">753</span><a name="line.753"></a>
+<span class="sourceLineNo">754</span>  /**<a name="line.754"></a>
+<span class="sourceLineNo">755</span>   * Main entry point.<a name="line.755"></a>
+<span class="sourceLineNo">756</span>   *<a name="line.756"></a>
+<span class="sourceLineNo">757</span>   * @param args  The command line parameters.<a name="line.757"></a>
+<span class="sourceLineNo">758</span>   * @throws Exception When running the job fails.<a name="line.758"></a>
+<span class="sourceLineNo">759</span>   */<a name="line.759"></a>
+<span class="sourceLineNo">760</span>  public static void main(String[] args) throws Exception {<a name="line.760"></a>
+<span class="sourceLineNo">761</span>    int res = ToolRunner.run(HBaseConfiguration.create(), new VerifyReplication(), args);<a name="line.761"></a>
+<span class="sourceLineNo">762</span>    System.exit(res);<a name="line.762"></a>
+<span class="sourceLineNo">763</span>  }<a name="line.763"></a>
+<span class="sourceLineNo">764</span>}<a name="line.764"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.html b/devapidocs/src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.html
index 47325cd..b16e963 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.Verifier.html
@@ -122,638 +122,654 @@
 <span class="sourceLineNo">114</span>  String peerFSAddress = null;<a name="line.114"></a>
 <span class="sourceLineNo">115</span>  //Peer cluster HBase root dir location<a name="line.115"></a>
 <span class="sourceLineNo">116</span>  String peerHBaseRootAddress = null;<a name="line.116"></a>
-<span class="sourceLineNo">117</span><a name="line.117"></a>
-<span class="sourceLineNo">118</span><a name="line.118"></a>
-<span class="sourceLineNo">119</span>  private final static String JOB_NAME_CONF_KEY = "mapreduce.job.name";<a name="line.119"></a>
+<span class="sourceLineNo">117</span>  //Peer Table Name<a name="line.117"></a>
+<span class="sourceLineNo">118</span>  String peerTableName = null;<a name="line.118"></a>
+<span class="sourceLineNo">119</span><a name="line.119"></a>
 <span class="sourceLineNo">120</span><a name="line.120"></a>
-<span class="sourceLineNo">121</span>  /**<a name="line.121"></a>
-<span class="sourceLineNo">122</span>   * Map-only comparator for 2 tables<a name="line.122"></a>
-<span class="sourceLineNo">123</span>   */<a name="line.123"></a>
-<span class="sourceLineNo">124</span>  public static class Verifier<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      extends TableMapper&lt;ImmutableBytesWritable, Put&gt; {<a name="line.125"></a>
-<span class="sourceLineNo">126</span><a name="line.126"></a>
-<span class="sourceLineNo">127</span>    public enum Counters {<a name="line.127"></a>
-<span class="sourceLineNo">128</span>      GOODROWS, BADROWS, ONLY_IN_SOURCE_TABLE_ROWS, ONLY_IN_PEER_TABLE_ROWS, CONTENT_DIFFERENT_ROWS<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    }<a name="line.129"></a>
-<span class="sourceLineNo">130</span><a name="line.130"></a>
-<span class="sourceLineNo">131</span>    private Connection sourceConnection;<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    private Table sourceTable;<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    private Connection replicatedConnection;<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    private Table replicatedTable;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    private ResultScanner replicatedScanner;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    private Result currentCompareRowInPeerTable;<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    private int sleepMsBeforeReCompare;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    private String delimiter = "";<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    private boolean verbose = false;<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    private int batch = -1;<a name="line.140"></a>
-<span class="sourceLineNo">141</span><a name="line.141"></a>
-<span class="sourceLineNo">142</span>    /**<a name="line.142"></a>
-<span class="sourceLineNo">143</span>     * Map method that compares every scanned row with the equivalent from<a name="line.143"></a>
-<span class="sourceLineNo">144</span>     * a distant cluster.<a name="line.144"></a>
-<span class="sourceLineNo">145</span>     * @param row  The current table row key.<a name="line.145"></a>
-<span class="sourceLineNo">146</span>     * @param value  The columns.<a name="line.146"></a>
-<span class="sourceLineNo">147</span>     * @param context  The current context.<a name="line.147"></a>
-<span class="sourceLineNo">148</span>     * @throws IOException When something is broken with the data.<a name="line.148"></a>
-<span class="sourceLineNo">149</span>     */<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    @Override<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    public void map(ImmutableBytesWritable row, final Result value,<a name="line.151"></a>
-<span class="sourceLineNo">152</span>                    Context context)<a name="line.152"></a>
-<span class="sourceLineNo">153</span>        throws IOException {<a name="line.153"></a>
-<span class="sourceLineNo">154</span>      if (replicatedScanner == null) {<a name="line.154"></a>
-<span class="sourceLineNo">155</span>        Configuration conf = context.getConfiguration();<a name="line.155"></a>
-<span class="sourceLineNo">156</span>        sleepMsBeforeReCompare = conf.getInt(NAME +".sleepMsBeforeReCompare", 0);<a name="line.156"></a>
-<span class="sourceLineNo">157</span>        delimiter = conf.get(NAME + ".delimiter", "");<a name="line.157"></a>
-<span class="sourceLineNo">158</span>        verbose = conf.getBoolean(NAME +".verbose", false);<a name="line.158"></a>
-<span class="sourceLineNo">159</span>        batch = conf.getInt(NAME + ".batch", -1);<a name="line.159"></a>
-<span class="sourceLineNo">160</span>        final Scan scan = new Scan();<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        if (batch &gt; 0) {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>          scan.setBatch(batch);<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        }<a name="line.163"></a>
-<span class="sourceLineNo">164</span>        scan.setCacheBlocks(false);<a name="line.164"></a>
-<span class="sourceLineNo">165</span>        scan.setCaching(conf.getInt(TableInputFormat.SCAN_CACHEDROWS, 1));<a name="line.165"></a>
-<span class="sourceLineNo">166</span>        long startTime = conf.getLong(NAME + ".startTime", 0);<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        long endTime = conf.getLong(NAME + ".endTime", Long.MAX_VALUE);<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        String families = conf.get(NAME + ".families", null);<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        if(families != null) {<a name="line.169"></a>
-<span class="sourceLineNo">170</span>          String[] fams = families.split(",");<a name="line.170"></a>
-<span class="sourceLineNo">171</span>          for(String fam : fams) {<a name="line.171"></a>
-<span class="sourceLineNo">172</span>            scan.addFamily(Bytes.toBytes(fam));<a name="line.172"></a>
-<span class="sourceLineNo">173</span>          }<a name="line.173"></a>
-<span class="sourceLineNo">174</span>        }<a name="line.174"></a>
-<span class="sourceLineNo">175</span>        boolean includeDeletedCells = conf.getBoolean(NAME + ".includeDeletedCells", false);<a name="line.175"></a>
-<span class="sourceLineNo">176</span>        scan.setRaw(includeDeletedCells);<a name="line.176"></a>
-<span class="sourceLineNo">177</span>        String rowPrefixes = conf.get(NAME + ".rowPrefixes", null);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>        setRowPrefixFilter(scan, rowPrefixes);<a name="line.178"></a>
-<span class="sourceLineNo">179</span>        scan.setTimeRange(startTime, endTime);<a name="line.179"></a>
-<span class="sourceLineNo">180</span>        int versions = conf.getInt(NAME+".versions", -1);<a name="line.180"></a>
-<span class="sourceLineNo">181</span>        LOG.info("Setting number of version inside map as: " + versions);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>        if (versions &gt;= 0) {<a name="line.182"></a>
-<span class="sourceLineNo">183</span>          scan.setMaxVersions(versions);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>        }<a name="line.184"></a>
-<span class="sourceLineNo">185</span>        TableName tableName = TableName.valueOf(conf.get(NAME + ".tableName"));<a name="line.185"></a>
-<span class="sourceLineNo">186</span>        sourceConnection = ConnectionFactory.createConnection(conf);<a name="line.186"></a>
-<span class="sourceLineNo">187</span>        sourceTable = sourceConnection.getTable(tableName);<a name="line.187"></a>
-<span class="sourceLineNo">188</span><a name="line.188"></a>
-<span class="sourceLineNo">189</span>        final InputSplit tableSplit = context.getInputSplit();<a name="line.189"></a>
+<span class="sourceLineNo">121</span>  private final static String JOB_NAME_CONF_KEY = "mapreduce.job.name";<a name="line.121"></a>
+<span class="sourceLineNo">122</span><a name="line.122"></a>
+<span class="sourceLineNo">123</span>  /**<a name="line.123"></a>
+<span class="sourceLineNo">124</span>   * Map-only comparator for 2 tables<a name="line.124"></a>
+<span class="sourceLineNo">125</span>   */<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  public static class Verifier<a name="line.126"></a>
+<span class="sourceLineNo">127</span>      extends TableMapper&lt;ImmutableBytesWritable, Put&gt; {<a name="line.127"></a>
+<span class="sourceLineNo">128</span><a name="line.128"></a>
+<span class="sourceLineNo">129</span>    public enum Counters {<a name="line.129"></a>
+<span class="sourceLineNo">130</span>      GOODROWS, BADROWS, ONLY_IN_SOURCE_TABLE_ROWS, ONLY_IN_PEER_TABLE_ROWS, CONTENT_DIFFERENT_ROWS<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    }<a name="line.131"></a>
+<span class="sourceLineNo">132</span><a name="line.132"></a>
+<span class="sourceLineNo">133</span>    private Connection sourceConnection;<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    private Table sourceTable;<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    private Connection replicatedConnection;<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    private Table replicatedTable;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    private ResultScanner replicatedScanner;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    private Result currentCompareRowInPeerTable;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    private int sleepMsBeforeReCompare;<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    private String delimiter = "";<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    private boolean verbose = false;<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    private int batch = -1;<a name="line.142"></a>
+<span class="sourceLineNo">143</span><a name="line.143"></a>
+<span class="sourceLineNo">144</span>    /**<a name="line.144"></a>
+<span class="sourceLineNo">145</span>     * Map method that compares every scanned row with the equivalent from<a name="line.145"></a>
+<span class="sourceLineNo">146</span>     * a distant cluster.<a name="line.146"></a>
+<span class="sourceLineNo">147</span>     * @param row  The current table row key.<a name="line.147"></a>
+<span class="sourceLineNo">148</span>     * @param value  The columns.<a name="line.148"></a>
+<span class="sourceLineNo">149</span>     * @param context  The current context.<a name="line.149"></a>
+<span class="sourceLineNo">150</span>     * @throws IOException When something is broken with the data.<a name="line.150"></a>
+<span class="sourceLineNo">151</span>     */<a name="line.151"></a>
+<span class="sourceLineNo">152</span>    @Override<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    public void map(ImmutableBytesWritable row, final Result value,<a name="line.153"></a>
+<span class="sourceLineNo">154</span>                    Context context)<a name="line.154"></a>
+<span class="sourceLineNo">155</span>        throws IOException {<a name="line.155"></a>
+<span class="sourceLineNo">156</span>      if (replicatedScanner == null) {<a name="line.156"></a>
+<span class="sourceLineNo">157</span>        Configuration conf = context.getConfiguration();<a name="line.157"></a>
+<span class="sourceLineNo">158</span>        sleepMsBeforeReCompare = conf.getInt(NAME +".sleepMsBeforeReCompare", 0);<a name="line.158"></a>
+<span class="sourceLineNo">159</span>        delimiter = conf.get(NAME + ".delimiter", "");<a name="line.159"></a>
+<span class="sourceLineNo">160</span>        verbose = conf.getBoolean(NAME +".verbose", false);<a name="line.160"></a>
+<span class="sourceLineNo">161</span>        batch = conf.getInt(NAME + ".batch", -1);<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        final Scan scan = new Scan();<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        if (batch &gt; 0) {<a name="line.163"></a>
+<span class="sourceLineNo">164</span>          scan.setBatch(batch);<a name="line.164"></a>
+<span class="sourceLineNo">165</span>        }<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        scan.setCacheBlocks(false);<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        scan.setCaching(conf.getInt(TableInputFormat.SCAN_CACHEDROWS, 1));<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        long startTime = conf.getLong(NAME + ".startTime", 0);<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        long endTime = conf.getLong(NAME + ".endTime", Long.MAX_VALUE);<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        String families = conf.get(NAME + ".families", null);<a name="line.170"></a>
+<span class="sourceLineNo">171</span>        if(families != null) {<a name="line.171"></a>
+<span class="sourceLineNo">172</span>          String[] fams = families.split(",");<a name="line.172"></a>
+<span class="sourceLineNo">173</span>          for(String fam : fams) {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>            scan.addFamily(Bytes.toBytes(fam));<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>        boolean includeDeletedCells = conf.getBoolean(NAME + ".includeDeletedCells", false);<a name="line.177"></a>
+<span class="sourceLineNo">178</span>        scan.setRaw(includeDeletedCells);<a name="line.178"></a>
+<span class="sourceLineNo">179</span>        String rowPrefixes = conf.get(NAME + ".rowPrefixes", null);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>        setRowPrefixFilter(scan, rowPrefixes);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>        scan.setTimeRange(startTime, endTime);<a name="line.181"></a>
+<span class="sourceLineNo">182</span>        int versions = conf.getInt(NAME+".versions", -1);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>        LOG.info("Setting number of version inside map as: " + versions);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>        if (versions &gt;= 0) {<a name="line.184"></a>
+<span class="sourceLineNo">185</span>          scan.setMaxVersions(versions);<a name="line.185"></a>
+<span class="sourceLineNo">186</span>        }<a name="line.186"></a>
+<span class="sourceLineNo">187</span>        TableName tableName = TableName.valueOf(conf.get(NAME + ".tableName"));<a name="line.187"></a>
+<span class="sourceLineNo">188</span>        sourceConnection = ConnectionFactory.createConnection(conf);<a name="line.188"></a>
+<span class="sourceLineNo">189</span>        sourceTable = sourceConnection.getTable(tableName);<a name="line.189"></a>
 <span class="sourceLineNo">190</span><a name="line.190"></a>
-<span class="sourceLineNo">191</span>        String zkClusterKey = conf.get(NAME + ".peerQuorumAddress");<a name="line.191"></a>
-<span class="sourceLineNo">192</span>        Configuration peerConf = HBaseConfiguration.createClusterConf(conf,<a name="line.192"></a>
-<span class="sourceLineNo">193</span>            zkClusterKey, PEER_CONFIG_PREFIX);<a name="line.193"></a>
-<span class="sourceLineNo">194</span><a name="line.194"></a>
-<span class="sourceLineNo">195</span>        replicatedConnection = ConnectionFactory.createConnection(peerConf);<a name="line.195"></a>
-<span class="sourceLineNo">196</span>        replicatedTable = replicatedConnection.getTable(tableName);<a name="line.196"></a>
-<span class="sourceLineNo">197</span>        scan.setStartRow(value.getRow());<a name="line.197"></a>
-<span class="sourceLineNo">198</span><a name="line.198"></a>
-<span class="sourceLineNo">199</span>        byte[] endRow = null;<a name="line.199"></a>
-<span class="sourceLineNo">200</span>        if (tableSplit instanceof TableSnapshotInputFormat.TableSnapshotRegionSplit) {<a name="line.200"></a>
-<span class="sourceLineNo">201</span>          endRow = ((TableSnapshotInputFormat.TableSnapshotRegionSplit) tableSplit).getRegionInfo()<a name="line.201"></a>
-<span class="sourceLineNo">202</span>              .getEndKey();<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        } else {<a name="line.203"></a>
-<span class="sourceLineNo">204</span>          endRow = ((TableSplit) tableSplit).getEndRow();<a name="line.204"></a>
-<span class="sourceLineNo">205</span>        }<a name="line.205"></a>
-<span class="sourceLineNo">206</span><a name="line.206"></a>
-<span class="sourceLineNo">207</span>        scan.setStopRow(endRow);<a name="line.207"></a>
-<span class="sourceLineNo">208</span><a name="line.208"></a>
-<span class="sourceLineNo">209</span>        String peerSnapshotName = conf.get(NAME + ".peerSnapshotName", null);<a name="line.209"></a>
-<span class="sourceLineNo">210</span>        if (peerSnapshotName != null) {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>          String peerSnapshotTmpDir = conf.get(NAME + ".peerSnapshotTmpDir", null);<a name="line.211"></a>
-<span class="sourceLineNo">212</span>          String peerFSAddress = conf.get(NAME + ".peerFSAddress", null);<a name="line.212"></a>
-<span class="sourceLineNo">213</span>          String peerHBaseRootAddress = conf.get(NAME + ".peerHBaseRootAddress", null);<a name="line.213"></a>
-<span class="sourceLineNo">214</span>          FileSystem.setDefaultUri(peerConf, peerFSAddress);<a name="line.214"></a>
-<span class="sourceLineNo">215</span>          FSUtils.setRootDir(peerConf, new Path(peerHBaseRootAddress));<a name="line.215"></a>
-<span class="sourceLineNo">216</span>          LOG.info("Using peer snapshot:" + peerSnapshotName + " with temp dir:"<a name="line.216"></a>
-<span class="sourceLineNo">217</span>              + peerSnapshotTmpDir + " peer root uri:" + FSUtils.getRootDir(peerConf)<a name="line.217"></a>
-<span class="sourceLineNo">218</span>              + " peerFSAddress:" + peerFSAddress);<a name="line.218"></a>
-<span class="sourceLineNo">219</span><a name="line.219"></a>
-<span class="sourceLineNo">220</span>          replicatedScanner = new TableSnapshotScanner(peerConf, FSUtils.getRootDir(peerConf),<a name="line.220"></a>
-<span class="sourceLineNo">221</span>              new Path(peerFSAddress, peerSnapshotTmpDir), peerSnapshotName, scan, true);<a name="line.221"></a>
-<span class="sourceLineNo">222</span>        } else {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>          replicatedScanner = replicatedTable.getScanner(scan);<a name="line.223"></a>
-<span class="sourceLineNo">224</span>        }<a name="line.224"></a>
-<span class="sourceLineNo">225</span>        currentCompareRowInPeerTable = replicatedScanner.next();<a name="line.225"></a>
-<span class="sourceLineNo">226</span>      }<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      while (true) {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>        if (currentCompareRowInPeerTable == null) {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>          // reach the region end of peer table, row only in source table<a name="line.229"></a>
-<span class="sourceLineNo">230</span>          logFailRowAndIncreaseCounter(context, Counters.ONLY_IN_SOURCE_TABLE_ROWS, value);<a name="line.230"></a>
-<span class="sourceLineNo">231</span>          break;<a name="line.231"></a>
-<span class="sourceLineNo">232</span>        }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>        int rowCmpRet = Bytes.compareTo(value.getRow(), currentCompareRowInPeerTable.getRow());<a name="line.233"></a>
-<span class="sourceLineNo">234</span>        if (rowCmpRet == 0) {<a name="line.234"></a>
-<span class="sourceLineNo">235</span>          // rowkey is same, need to compare the content of the row<a name="line.235"></a>
-<span class="sourceLineNo">236</span>          try {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>            Result.compareResults(value, currentCompareRowInPeerTable);<a name="line.237"></a>
-<span class="sourceLineNo">238</span>            context.getCounter(Counters.GOODROWS).increment(1);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>            if (verbose) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>              LOG.info("Good row key: " + delimiter<a name="line.240"></a>
-<span class="sourceLineNo">241</span>                  + Bytes.toStringBinary(value.getRow()) + delimiter);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>            }<a name="line.242"></a>
-<span class="sourceLineNo">243</span>          } catch (Exception e) {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>            logFailRowAndIncreaseCounter(context, Counters.CONTENT_DIFFERENT_ROWS, value);<a name="line.244"></a>
-<span class="sourceLineNo">245</span>          }<a name="line.245"></a>
-<span class="sourceLineNo">246</span>          currentCompareRowInPeerTable = replicatedScanner.next();<a name="line.246"></a>
-<span class="sourceLineNo">247</span>          break;<a name="line.247"></a>
-<span class="sourceLineNo">248</span>        } else if (rowCmpRet &lt; 0) {<a name="line.248"></a>
-<span class="sourceLineNo">249</span>          // row only exists in source table<a name="line.249"></a>
-<span class="sourceLineNo">250</span>          logFailRowAndIncreaseCounter(context, Counters.ONLY_IN_SOURCE_TABLE_ROWS, value);<a name="line.250"></a>
+<span class="sourceLineNo">191</span>        final InputSplit tableSplit = context.getInputSplit();<a name="line.191"></a>
+<span class="sourceLineNo">192</span><a name="line.192"></a>
+<span class="sourceLineNo">193</span>        String zkClusterKey = conf.get(NAME + ".peerQuorumAddress");<a name="line.193"></a>
+<span class="sourceLineNo">194</span>        Configuration peerConf = HBaseConfiguration.createClusterConf(conf,<a name="line.194"></a>
+<span class="sourceLineNo">195</span>            zkClusterKey, PEER_CONFIG_PREFIX);<a name="line.195"></a>
+<span class="sourceLineNo">196</span><a name="line.196"></a>
+<span class="sourceLineNo">197</span>        String peerName = peerConf.get(NAME + ".peerTableName", tableName.getNameAsString());<a name="line.197"></a>
+<span class="sourceLineNo">198</span>        TableName peerTableName = TableName.valueOf(peerName);<a name="line.198"></a>
+<span class="sourceLineNo">199</span>        replicatedConnection = ConnectionFactory.createConnection(peerConf);<a name="line.199"></a>
+<span class="sourceLineNo">200</span>        replicatedTable = replicatedConnection.getTable(peerTableName);<a name="line.200"></a>
+<span class="sourceLineNo">201</span>        scan.setStartRow(value.getRow());<a name="line.201"></a>
+<span class="sourceLineNo">202</span><a name="line.202"></a>
+<span class="sourceLineNo">203</span>        byte[] endRow = null;<a name="line.203"></a>
+<span class="sourceLineNo">204</span>        if (tableSplit instanceof TableSnapshotInputFormat.TableSnapshotRegionSplit) {<a name="line.204"></a>
+<span class="sourceLineNo">205</span>          endRow = ((TableSnapshotInputFormat.TableSnapshotRegionSplit) tableSplit).getRegionInfo()<a name="line.205"></a>
+<span class="sourceLineNo">206</span>              .getEndKey();<a name="line.206"></a>
+<span class="sourceLineNo">207</span>        } else {<a name="line.207"></a>
+<span class="sourceLineNo">208</span>          endRow = ((TableSplit) tableSplit).getEndRow();<a name="line.208"></a>
+<span class="sourceLineNo">209</span>        }<a name="line.209"></a>
+<span class="sourceLineNo">210</span><a name="line.210"></a>
+<span class="sourceLineNo">211</span>        scan.setStopRow(endRow);<a name="line.211"></a>
+<span class="sourceLineNo">212</span><a name="line.212"></a>
+<span class="sourceLineNo">213</span>        String peerSnapshotName = conf.get(NAME + ".peerSnapshotName", null);<a name="line.213"></a>
+<span class="sourceLineNo">214</span>        if (peerSnapshotName != null) {<a name="line.214"></a>
+<span class="sourceLineNo">215</span>          String peerSnapshotTmpDir = conf.get(NAME + ".peerSnapshotTmpDir", null);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>          String peerFSAddress = conf.get(NAME + ".peerFSAddress", null);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>          String peerHBaseRootAddress = conf.get(NAME + ".peerHBaseRootAddress", null);<a name="line.217"></a>
+<span class="sourceLineNo">218</span>          FileSystem.setDefaultUri(peerConf, peerFSAddress);<a name="line.218"></a>
+<span class="sourceLineNo">219</span>          FSUtils.setRootDir(peerConf, new Path(peerHBaseRootAddress));<a name="line.219"></a>
+<span class="sourceLineNo">220</span>          LOG.info("Using peer snapshot:" + peerSnapshotName + " with temp dir:"<a name="line.220"></a>
+<span class="sourceLineNo">221</span>              + peerSnapshotTmpDir + " peer root uri:" + FSUtils.getRootDir(peerConf)<a name="line.221"></a>
+<span class="sourceLineNo">222</span>              + " peerFSAddress:" + peerFSAddress);<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>          replicatedScanner = new TableSnapshotScanner(peerConf, FSUtils.getRootDir(peerConf),<a name="line.224"></a>
+<span class="sourceLineNo">225</span>              new Path(peerFSAddress, peerSnapshotTmpDir), peerSnapshotName, scan, true);<a name="line.225"></a>
+<span class="sourceLineNo">226</span>        } else {<a name="line.226"></a>
+<span class="sourceLineNo">227</span>          replicatedScanner = replicatedTable.getScanner(scan);<a name="line.227"></a>
+<span class="sourceLineNo">228</span>        }<a name="line.228"></a>
+<span class="sourceLineNo">229</span>        currentCompareRowInPeerTable = replicatedScanner.next();<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      }<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      while (true) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        if (currentCompareRowInPeerTable == null) {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>          // reach the region end of peer table, row only in source table<a name="line.233"></a>
+<span class="sourceLineNo">234</span>          logFailRowAndIncreaseCounter(context, Counters.ONLY_IN_SOURCE_TABLE_ROWS, value);<a name="line.234"></a>
+<span class="sourceLineNo">235</span>          break;<a name="line.235"></a>
+<span class="sourceLineNo">236</span>        }<a name="line.236"></a>
+<span class="sourceLineNo">237</span>        int rowCmpRet = Bytes.compareTo(value.getRow(), currentCompareRowInPeerTable.getRow());<a name="line.237"></a>
+<span class="sourceLineNo">238</span>        if (rowCmpRet == 0) {<a name="line.238"></a>
+<span class="sourceLineNo">239</span>          // rowkey is same, need to compare the content of the row<a name="line.239"></a>
+<span class="sourceLineNo">240</span>          try {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>            Result.compareResults(value, currentCompareRowInPeerTable);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>            context.getCounter(Counters.GOODROWS).increment(1);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>            if (verbose) {<a name="line.243"></a>
+<span class="sourceLineNo">244</span>              LOG.info("Good row key: " + delimiter<a name="line.244"></a>
+<span class="sourceLineNo">245</span>                  + Bytes.toStringBinary(value.getRow()) + delimiter);<a name="line.245"></a>
+<span class="sourceLineNo">246</span>            }<a name="line.246"></a>
+<span class="sourceLineNo">247</span>          } catch (Exception e) {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>            logFailRowAndIncreaseCounter(context, Counters.CONTENT_DIFFERENT_ROWS, value);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>          }<a name="line.249"></a>
+<span class="sourceLineNo">250</span>          currentCompareRowInPeerTable = replicatedScanner.next();<a name="line.250"></a>
 <span class="sourceLineNo">251</span>          break;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>        } else {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>          // row only exists in peer table<a name="line.253"></a>
-<span class="sourceLineNo">254</span>          logFailRowAndIncreaseCounter(context, Counters.ONLY_IN_PEER_TABLE_ROWS,<a name="line.254"></a>
-<span class="sourceLineNo">255</span>            currentCompareRowInPeerTable);<a name="line.255"></a>
-<span class="sourceLineNo">256</span>          currentCompareRowInPeerTable = replicatedScanner.next();<a name="line.256"></a>
-<span class="sourceLineNo">257</span>        }<a name="line.257"></a>
-<span class="sourceLineNo">258</span>      }<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    }<a name="line.259"></a>
-<span class="sourceLineNo">260</span><a name="line.260"></a>
-<span class="sourceLineNo">261</span>    private void logFailRowAndIncreaseCounter(Context context, Counters counter, Result row) {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>      if (sleepMsBeforeReCompare &gt; 0) {<a name="line.262"></a>
-<span class="sourceLineNo">263</span>        Threads.sleep(sleepMsBeforeReCompare);<a name="line.263"></a>
-<span class="sourceLineNo">264</span>        try {<a name="line.264"></a>
-<span class="sourceLineNo">265</span>          Result sourceResult = sourceTable.get(new Get(row.getRow()));<a name="line.265"></a>
-<span class="sourceLineNo">266</span>          Result replicatedResult = replicatedTable.get(new Get(row.getRow()));<a name="line.266"></a>
-<span class="sourceLineNo">267</span>          Result.compareResults(sourceResult, replicatedResult);<a name="line.267"></a>
-<span class="sourceLineNo">268</span>          if (!sourceResult.isEmpty()) {<a name="line.268"></a>
-<span class="sourceLineNo">269</span>            context.getCounter(Counters.GOODROWS).increment(1);<a name="line.269"></a>
-<span class="sourceLineNo">270</span>            if (verbose) {<a name="line.270"></a>
-<span class="sourceLineNo">271</span>              LOG.info("Good row key (with recompare): " + delimiter + Bytes.toStringBinary(row.getRow())<a name="line.271"></a>
-<span class="sourceLineNo">272</span>              + delimiter);<a name="line.272"></a>
-<span class="sourceLineNo">273</span>            }<a name="line.273"></a>
-<span class="sourceLineNo">274</span>          }<a name="line.274"></a>
-<span class="sourceLineNo">275</span>          return;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>        } catch (Exception e) {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>          LOG.error("recompare fail after sleep, rowkey=" + delimiter +<a name="line.277"></a>
-<span class="sourceLineNo">278</span>              Bytes.toStringBinary(row.getRow()) + delimiter);<a name="line.278"></a>
-<span class="sourceLineNo">279</span>        }<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      }<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      context.getCounter(counter).increment(1);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      context.getCounter(Counters.BADROWS).increment(1);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      LOG.error(counter.toString() + ", rowkey=" + delimiter + Bytes.toStringBinary(row.getRow()) +<a name="line.283"></a>
-<span class="sourceLineNo">284</span>          delimiter);<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    }<a name="line.285"></a>
-<span class="sourceLineNo">286</span><a name="line.286"></a>
-<span class="sourceLineNo">287</span>    @Override<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    protected void cleanup(Context context) {<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      if (replicatedScanner != null) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>        try {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>          while (currentCompareRowInPeerTable != null) {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>            logFailRowAndIncreaseCounter(context, Counters.ONLY_IN_PEER_TABLE_ROWS,<a name="line.292"></a>
-<span class="sourceLineNo">293</span>              currentCompareRowInPeerTable);<a name="line.293"></a>
-<span class="sourceLineNo">294</span>            currentCompareRowInPeerTable = replicatedScanner.next();<a name="line.294"></a>
-<span class="sourceLineNo">295</span>          }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>        } catch (Exception e) {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>          LOG.error("fail to scan peer table in cleanup", e);<a name="line.297"></a>
-<span class="sourceLineNo">298</span>        } finally {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>          replicatedScanner.close();<a name="line.299"></a>
-<span class="sourceLineNo">300</span>          replicatedScanner = null;<a name="line.300"></a>
-<span class="sourceLineNo">301</span>        }<a name="line.301"></a>
-<span class="sourceLineNo">302</span>      }<a name="line.302"></a>
-<span class="sourceLineNo">303</span><a name="line.303"></a>
-<span class="sourceLineNo">304</span>      if (sourceTable != null) {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>        try {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>          sourceTable.close();<a name="line.306"></a>
-<span class="sourceLineNo">307</span>        } catch (IOException e) {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>          LOG.error("fail to close source table in cleanup", e);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>        }<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      }<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      if(sourceConnection != null){<a name="line.311"></a>
-<span class="sourceLineNo">312</span>        try {<a name="line.312"></a>
-<span class="sourceLineNo">313</span>          sourceConnection.close();<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        } catch (Exception e) {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>          LOG.error("fail to close source connection in cleanup", e);<a name="line.315"></a>
-<span class="sourceLineNo">316</span>        }<a name="line.316"></a>
-<span class="sourceLineNo">317</span>      }<a name="line.317"></a>
-<span class="sourceLineNo">318</span><a name="line.318"></a>
-<span class="sourceLineNo">319</span>      if(replicatedTable != null){<a name="line.319"></a>
-<span class="sourceLineNo">320</span>        try{<a name="line.320"></a>
-<span class="sourceLineNo">321</span>          replicatedTable.close();<a name="line.321"></a>
-<span class="sourceLineNo">322</span>        } catch (Exception e) {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>          LOG.error("fail to close replicated table in cleanup", e);<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>      if(replicatedConnection != null){<a name="line.326"></a>
-<span class="sourceLineNo">327</span>        try {<a name="line.327"></a>
-<span class="sourceLineNo">328</span>          replicatedConnection.close();<a name="line.328"></a>
-<span class="sourceLineNo">329</span>        } catch (Exception e) {<a name="line.329"></a>
-<span class="sourceLineNo">330</span>          LOG.error("fail to close replicated connection in cleanup", e);<a name="line.330"></a>
-<span class="sourceLineNo">331</span>        }<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      }<a name="line.332"></a>
-<span class="sourceLineNo">333</span>    }<a name="line.333"></a>
-<span class="sourceLineNo">334</span>  }<a name="line.334"></a>
-<span class="sourceLineNo">335</span><a name="line.335"></a>
-<span class="sourceLineNo">336</span>  private static Pair&lt;ReplicationPeerConfig, Configuration&gt; getPeerQuorumConfig(<a name="line.336"></a>
-<span class="sourceLineNo">337</span>      final Configuration conf, String peerId) throws IOException {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    ZKWatcher localZKW = null;<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    try {<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      localZKW = new ZKWatcher(conf, "VerifyReplication", new Abortable() {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>        @Override<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        public void abort(String why, Throwable e) {<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">252</span>        } else if (rowCmpRet &lt; 0) {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>          // row only exists in source table<a name="line.253"></a>
+<span class="sourceLineNo">254</span>          logFailRowAndIncreaseCounter(context, Counters.ONLY_IN_SOURCE_TABLE_ROWS, value);<a name="line.254"></a>
+<span class="sourceLineNo">255</span>          break;<a name="line.255"></a>
+<span class="sourceLineNo">256</span>        } else {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>          // row only exists in peer table<a name="line.257"></a>
+<span class="sourceLineNo">258</span>          logFailRowAndIncreaseCounter(context, Counters.ONLY_IN_PEER_TABLE_ROWS,<a name="line.258"></a>
+<span class="sourceLineNo">259</span>            currentCompareRowInPeerTable);<a name="line.259"></a>
+<span class="sourceLineNo">260</span>          currentCompareRowInPeerTable = replicatedScanner.next();<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        }<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      }<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    }<a name="line.263"></a>
+<span class="sourceLineNo">264</span><a name="line.264"></a>
+<span class="sourceLineNo">265</span>    private void logFailRowAndIncreaseCounter(Context context, Counters counter, Result row) {<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      if (sleepMsBeforeReCompare &gt; 0) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>        Threads.sleep(sleepMsBeforeReCompare);<a name="line.267"></a>
+<span class="sourceLineNo">268</span>        try {<a name="line.268"></a>
+<span class="sourceLineNo">269</span>          Result sourceResult = sourceTable.get(new Get(row.getRow()));<a name="line.269"></a>
+<span class="sourceLineNo">270</span>          Result replicatedResult = replicatedTable.get(new Get(row.getRow()));<a name="line.270"></a>
+<span class="sourceLineNo">271</span>          Result.compareResults(sourceResult, replicatedResult);<a name="line.271"></a>
+<span class="sourceLineNo">272</span>          if (!sourceResult.isEmpty()) {<a name="line.272"></a>
+<span class="sourceLineNo">273</span>            context.getCounter(Counters.GOODROWS).increment(1);<a name="line.273"></a>
+<span class="sourceLineNo">274</span>            if (verbose) {<a name="line.274"></a>
+<span class="sourceLineNo">275</span>              LOG.info("Good row key (with recompare): " + delimiter + Bytes.toStringBinary(row.getRow())<a name="line.275"></a>
+<span class="sourceLineNo">276</span>              + delimiter);<a name="line.276"></a>
+<span class="sourceLineNo">277</span>            }<a name="line.277"></a>
+<span class="sourceLineNo">278</span>          }<a name="line.278"></a>
+<span class="sourceLineNo">279</span>          return;<a name="line.279"></a>
+<span class="sourceLineNo">280</span>        } catch (Exception e) {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>          LOG.error("recompare fail after sleep, rowkey=" + delimiter +<a name="line.281"></a>
+<span class="sourceLineNo">282</span>              Bytes.toStringBinary(row.getRow()) + delimiter);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>        }<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      }<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      context.getCounter(counter).increment(1);<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      context.getCounter(Counters.BADROWS).increment(1);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      LOG.error(counter.toString() + ", rowkey=" + delimiter + Bytes.toStringBinary(row.getRow()) +<a name="line.287"></a>
+<span class="sourceLineNo">288</span>          delimiter);<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>    @Override<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    protected void cleanup(Context context) {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      if (replicatedScanner != null) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        try {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>          while (currentCompareRowInPeerTable != null) {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>            logFailRowAndIncreaseCounter(context, Counters.ONLY_IN_PEER_TABLE_ROWS,<a name="line.296"></a>
+<span class="sourceLineNo">297</span>              currentCompareRowInPeerTable);<a name="line.297"></a>
+<span class="sourceLineNo">298</span>            currentCompareRowInPeerTable = replicatedScanner.next();<a name="line.298"></a>
+<span class="sourceLineNo">299</span>          }<a name="line.299"></a>
+<span class="sourceLineNo">300</span>        } catch (Exception e) {<a name="line.300"></a>
+<span class="sourceLineNo">301</span>          LOG.error("fail to scan peer table in cleanup", e);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>        } finally {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>          replicatedScanner.close();<a name="line.303"></a>
+<span class="sourceLineNo">304</span>          replicatedScanner = null;<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>      if (sourceTable != null) {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>        try {<a name="line.309"></a>
+<span class="sourceLineNo">310</span>          sourceTable.close();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>        } catch (IOException e) {<a name="line.311"></a>
+<span class="sourceLineNo">312</span>          LOG.error("fail to close source table in cleanup", e);<a name="line.312"></a>
+<span class="sourceLineNo">313</span>        }<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      }<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      if(sourceConnection != null){<a name="line.315"></a>
+<span class="sourceLineNo">316</span>        try {<a name="line.316"></a>
+<span class="sourceLineNo">317</span>          sourceConnection.close();<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        } catch (Exception e) {<a name="line.318"></a>
+<span class="sourceLineNo">319</span>          LOG.error("fail to close source connection in cleanup", e);<a name="line.319"></a>
+<span class="sourceLineNo">320</span>        }<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      }<a name="line.321"></a>
+<span class="sourceLineNo">322</span><a name="line.322"></a>
+<span class="sourceLineNo">323</span>      if(replicatedTable != null){<a name="line.323"></a>
+<span class="sourceLineNo">324</span>        try{<a name="line.324"></a>
+<span class="sourceLineNo">325</span>          replicatedTable.close();<a name="line.325"></a>
+<span class="sourceLineNo">326</span>        } catch (Exception e) {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>          LOG.error("fail to close replicated table in cleanup", e);<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>      if(replicatedConnection != null){<a name="line.330"></a>
+<span class="sourceLineNo">331</span>        try {<a name="line.331"></a>
+<span class="sourceLineNo">332</span>          replicatedConnection.close();<a name="line.332"></a>
+<span class="sourceLineNo">333</span>        } catch (Exception e) {<a name="line.333"></a>
+<span class="sourceLineNo">334</span>          LOG.error("fail to close replicated connection in cleanup", e);<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>  }<a name="line.338"></a>
+<span class="sourceLineNo">339</span><a name="line.339"></a>
+<span class="sourceLineNo">340</span>  private static Pair&lt;ReplicationPeerConfig, Configuration&gt; getPeerQuorumConfig(<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      final Configuration conf, String peerId) throws IOException {<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    ZKWatcher localZKW = null;<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    try {<a name="line.343"></a>
+<span class="sourceLineNo">344</span>      localZKW = new ZKWatcher(conf, "VerifyReplication", new Abortable() {<a name="line.344"></a>
 <span class="sourceLineNo">345</span>        @Override<a name="line.345"></a>
-<span class="sourceLineNo">346</span>        public boolean isAborted() {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>          return false;<a name="line.347"></a>
-<span class="sourceLineNo">348</span>        }<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      });<a name="line.349"></a>
-<span class="sourceLineNo">350</span>      ReplicationPeerStorage storage =<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        ReplicationStorageFactory.getReplicationPeerStorage(localZKW, conf);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      ReplicationPeerConfig peerConfig = storage.getPeerConfig(peerId);<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      return Pair.newPair(peerConfig,<a name="line.353"></a>
-<span class="sourceLineNo">354</span>        ReplicationUtils.getPeerClusterConfiguration(peerConfig, conf));<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    } catch (ReplicationException e) {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      throw new IOException("An error occurred while trying to connect to the remote peer cluster",<a name="line.356"></a>
-<span class="sourceLineNo">357</span>          e);<a name="line.357"></a>
-<span class="sourceLineNo">358</span>    } finally {<a name="line.358"></a>
-<span class="sourceLineNo">359</span>      if (localZKW != null) {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        localZKW.close();<a name="line.360"></a>
-<span class="sourceLineNo">361</span>      }<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    }<a name="line.362"></a>
-<span class="sourceLineNo">363</span>  }<a name="line.363"></a>
-<span class="sourceLineNo">364</span><a name="line.364"></a>
-<span class="sourceLineNo">365</span>  private void restoreSnapshotForPeerCluster(Configuration conf, String peerQuorumAddress)<a name="line.365"></a>
-<span class="sourceLineNo">366</span>      throws IOException {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    Configuration peerConf =<a name="line.367"></a>
-<span class="sourceLineNo">368</span>        HBaseConfiguration.createClusterConf(conf, peerQuorumAddress, PEER_CONFIG_PREFIX);<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    FileSystem.setDefaultUri(peerConf, peerFSAddress);<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    FSUtils.setRootDir(peerConf, new Path(peerFSAddress, peerHBaseRootAddress));<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    FileSystem fs = FileSystem.get(peerConf);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    RestoreSnapshotHelper.copySnapshotForScanner(peerConf, fs, FSUtils.getRootDir(peerConf),<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      new Path(peerFSAddress, peerSnapshotTmpDir), peerSnapshotName);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>  }<a name="line.374"></a>
-<span class="sourceLineNo">375</span><a name="line.375"></a>
-<span class="sourceLineNo">376</span>  /**<a name="line.376"></a>
-<span class="sourceLineNo">377</span>   * Sets up the actual job.<a name="line.377"></a>
-<span class="sourceLineNo">378</span>   *<a name="line.378"></a>
-<span class="sourceLineNo">379</span>   * @param conf  The current configuration.<a name="line.379"></a>
-<span class="sourceLineNo">380</span>   * @param args  The command line parameters.<a name="line.380"></a>
-<span class="sourceLineNo">381</span>   * @return The newly created job.<a name="line.381"></a>
-<span class="sourceLineNo">382</span>   * @throws java.io.IOException When setting up the job fails.<a name="line.382"></a>
-<span class="sourceLineNo">383</span>   */<a name="line.383"></a>
-<span class="sourceLineNo">384</span>  public Job createSubmittableJob(Configuration conf, String[] args)<a name="line.384"></a>
-<span class="sourceLineNo">385</span>  throws IOException {<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    if (!doCommandLine(args)) {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      return null;<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    }<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    conf.set(NAME+".tableName", tableName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    conf.setLong(NAME+".startTime", startTime);<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    conf.setLong(NAME+".endTime", endTime);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    conf.setInt(NAME +".sleepMsBeforeReCompare", sleepMsBeforeReCompare);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    conf.set(NAME + ".delimiter", delimiter);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    conf.setInt(NAME + ".batch", batch);<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    conf.setBoolean(NAME +".verbose", verbose);<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    conf.setBoolean(NAME +".includeDeletedCells", includeDeletedCells);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    if (families != null) {<a name="line.397"></a>
-<span class="sourceLineNo">398</span>      conf.set(NAME+".families", families);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    }<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    if (rowPrefixes != null){<a name="line.400"></a>
-<span class="sourceLineNo">401</span>      conf.set(NAME+".rowPrefixes", rowPrefixes);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    }<a name="line.402"></a>
-<span class="sourceLineNo">403</span><a name="line.403"></a>
-<span class="sourceLineNo">404</span>    String peerQuorumAddress;<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    Pair&lt;ReplicationPeerConfig, Configuration&gt; peerConfigPair = null;<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    if (peerId != null) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      peerConfigPair = getPeerQuorumConfig(conf, peerId);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      ReplicationPeerConfig peerConfig = peerConfigPair.getFirst();<a name="line.408"></a>
-<span class="sourceLineNo">409</span>      peerQuorumAddress = peerConfig.getClusterKey();<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      LOG.info("Peer Quorum Address: " + peerQuorumAddress + ", Peer Configuration: " +<a name="line.410"></a>
-<span class="sourceLineNo">411</span>        peerConfig.getConfiguration());<a name="line.411"></a>
-<span class="sourceLineNo">412</span>      conf.set(NAME + ".peerQuorumAddress", peerQuorumAddress);<a name="line.412"></a>
-<span class="sourceLineNo">413</span>      HBaseConfiguration.setWithPrefix(conf, PEER_CONFIG_PREFIX,<a name="line.413"></a>
-<span class="sourceLineNo">414</span>        peerConfig.getConfiguration().entrySet());<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    } else {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>      assert this.peerQuorumAddress != null;<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      peerQuorumAddress = this.peerQuorumAddress;<a name="line.417"></a>
-<span class="sourceLineNo">418</span>      LOG.info("Peer Quorum Address: " + peerQuorumAddress);<a name="line.418"></a>
-<span class="sourceLineNo">419</span>      conf.set(NAME + ".peerQuorumAddress", peerQuorumAddress);<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    }<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>    conf.setInt(NAME + ".versions", versions);<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    LOG.info("Number of version: " + versions);<a name="line.423"></a>
-<span class="sourceLineNo">424</span><a name="line.424"></a>
-<span class="sourceLineNo">425</span>    //Set Snapshot specific parameters<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    if (peerSnapshotName != null) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      conf.set(NAME + ".peerSnapshotName", peerSnapshotName);<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>      // for verifyRep by snapshot, choose a unique sub-directory under peerSnapshotTmpDir to<a name="line.429"></a>
-<span class="sourceLineNo">430</span>      // restore snapshot.<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      Path restoreDir = new Path(peerSnapshotTmpDir, UUID.randomUUID().toString());<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      peerSnapshotTmpDir = restoreDir.toString();<a name="line.432"></a>
-<span class="sourceLineNo">433</span>      conf.set(NAME + ".peerSnapshotTmpDir", peerSnapshotTmpDir);<a name="line.433"></a>
-<span class="sourceLineNo">434</span><a name="line.434"></a>
-<span class="sourceLineNo">435</span>      conf.set(NAME + ".peerFSAddress", peerFSAddress);<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      conf.set(NAME + ".peerHBaseRootAddress", peerHBaseRootAddress);<a name="line.436"></a>
+<span class="sourceLineNo">346</span>        public void abort(String why, Throwable e) {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>        }<a name="line.347"></a>
+<span class="sourceLineNo">348</span><a name="line.348"></a>
+<span class="sourceLineNo">349</span>        @Override<a name="line.349"></a>
+<span class="sourceLineNo">350</span>        public boolean isAborted() {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>          return false;<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>      ReplicationPeerStorage storage =<a name="line.354"></a>
+<span class="sourceLineNo">355</span>        ReplicationStorageFactory.getReplicationPeerStorage(localZKW, conf);<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      ReplicationPeerConfig peerConfig = storage.getPeerConfig(peerId);<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      return Pair.newPair(peerConfig,<a name="line.357"></a>
+<span class="sourceLineNo">358</span>        ReplicationUtils.getPeerClusterConfiguration(peerConfig, conf));<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    } catch (ReplicationException e) {<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      throw new IOException("An error occurred while trying to connect to the remote peer cluster",<a name="line.360"></a>
+<span class="sourceLineNo">361</span>          e);<a name="line.361"></a>
+<span class="sourceLineNo">362</span>    } finally {<a name="line.362"></a>
+<span class="sourceLineNo">363</span>      if (localZKW != null) {<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        localZKW.close();<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>  }<a name="line.367"></a>
+<span class="sourceLineNo">368</span><a name="line.368"></a>
+<span class="sourceLineNo">369</span>  private void restoreSnapshotForPeerCluster(Configuration conf, String peerQuorumAddress)<a name="line.369"></a>
+<span class="sourceLineNo">370</span>      throws IOException {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    Configuration peerConf =<a name="line.371"></a>
+<span class="sourceLineNo">372</span>        HBaseConfiguration.createClusterConf(conf, peerQuorumAddress, PEER_CONFIG_PREFIX);<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    FileSystem.setDefaultUri(peerConf, peerFSAddress);<a name="line.373"></a>
+<span class="sourceLineNo">374</span>    FSUtils.setRootDir(peerConf, new Path(peerFSAddress, peerHBaseRootAddress));<a name="line.374"></a>
+<span class="sourceLineNo">375</span>    FileSystem fs = FileSystem.get(peerConf);<a name="line.375"></a>
+<span class="sourceLineNo">376</span>    RestoreSnapshotHelper.copySnapshotForScanner(peerConf, fs, FSUtils.getRootDir(peerConf),<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      new Path(peerFSAddress, peerSnapshotTmpDir), peerSnapshotName);<a name="line.377"></a>
+<span class="sourceLineNo">378</span>  }<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>  /**<a name="line.380"></a>
+<span class="sourceLineNo">381</span>   * Sets up the actual job.<a name="line.381"></a>
+<span class="sourceLineNo">382</span>   *<a name="line.382"></a>
+<span class="sourceLineNo">383</span>   * @param conf  The current configuration.<a name="line.383"></a>
+<span class="sourceLineNo">384</span>   * @param args  The command line parameters.<a name="line.384"></a>
+<span class="sourceLineNo">385</span>   * @return The newly created job.<a name="line.385"></a>
+<span class="sourceLineNo">386</span>   * @throws java.io.IOException When setting up the job fails.<a name="line.386"></a>
+<span class="sourceLineNo">387</span>   */<a name="line.387"></a>
+<span class="sourceLineNo">388</span>  public Job createSubmittableJob(Configuration conf, String[] args)<a name="line.388"></a>
+<span class="sourceLineNo">389</span>  throws IOException {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    if (!doCommandLine(args)) {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      return null;<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    conf.set(NAME+".tableName", tableName);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>    conf.setLong(NAME+".startTime", startTime);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    conf.setLong(NAME+".endTime", endTime);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    conf.setInt(NAME +".sleepMsBeforeReCompare", sleepMsBeforeReCompare);<a name="line.396"></a>
+<span class="sourceLineNo">397</span>    conf.set(NAME + ".delimiter", delimiter);<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    conf.setInt(NAME + ".batch", batch);<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    conf.setBoolean(NAME +".verbose", verbose);<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    conf.setBoolean(NAME +".includeDeletedCells", includeDeletedCells);<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    if (families != null) {<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      conf.set(NAME+".families", families);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    if (rowPrefixes != null){<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      conf.set(NAME+".rowPrefixes", rowPrefixes);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    }<a name="line.406"></a>
+<span class="sourceLineNo">407</span><a name="line.407"></a>
+<span class="sourceLineNo">408</span>    String peerQuorumAddress;<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    Pair&lt;ReplicationPeerConfig, Configuration&gt; peerConfigPair = null;<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    if (peerId != null) {<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      peerConfigPair = getPeerQuorumConfig(conf, peerId);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      ReplicationPeerConfig peerConfig = peerConfigPair.getFirst();<a name="line.412"></a>
+<span class="sourceLineNo">413</span>      peerQuorumAddress = peerConfig.getClusterKey();<a name="line.413"></a>
+<span class="sourceLineNo">414</span>      LOG.info("Peer Quorum Address: " + peerQuorumAddress + ", Peer Configuration: " +<a name="line.414"></a>
+<span class="sourceLineNo">415</span>        peerConfig.getConfiguration());<a name="line.415"></a>
+<span class="sourceLineNo">416</span>      conf.set(NAME + ".peerQuorumAddress", peerQuorumAddress);<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      HBaseConfiguration.setWithPrefix(conf, PEER_CONFIG_PREFIX,<a name="line.417"></a>
+<span class="sourceLineNo">418</span>        peerConfig.getConfiguration().entrySet());<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    } else {<a name="line.419"></a>
+<span class="sourceLineNo">420</span>      assert this.peerQuorumAddress != null;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>      peerQuorumAddress = this.peerQuorumAddress;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>      LOG.info("Peer Quorum Address: " + peerQuorumAddress);<a name="line.422"></a>
+<span class="sourceLineNo">423</span>      conf.set(NAME + ".peerQuorumAddress", peerQuorumAddress);<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    }<a name="line.424"></a>
+<span class="sourceLineNo">425</span><a name="line.425"></a>
+<span class="sourceLineNo">426</span>    if (peerTableName != null) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>      LOG.info("Peer Table Name: " + peerTableName);<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      conf.set(NAME + ".peerTableName", peerTableName);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>    }<a name="line.429"></a>
+<span class="sourceLineNo">430</span><a name="line.430"></a>
+<span class="sourceLineNo">431</span>    conf.setInt(NAME + ".versions", versions);<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    LOG.info("Number of version: " + versions);<a name="line.432"></a>
+<span class="sourceLineNo">433</span><a name="line.433"></a>
+<span class="sourceLineNo">434</span>    //Set Snapshot specific parameters<a name="line.434"></a>
+<span class="sourceLineNo">435</span>    if (peerSnapshotName != null) {<a name="line.435"></a>
+<span class="sourceLineNo">436</span>      conf.set(NAME + ".peerSnapshotName", peerSnapshotName);<a name="line.436"></a>
 <span class="sourceLineNo">437</span><a name="line.437"></a>
-<span class="sourceLineNo">438</span>      // This is to create HDFS delegation token for peer cluster in case of secured<a name="line.438"></a>
-<span class="sourceLineNo">439</span>      conf.setStrings(MRJobConfig.JOB_NAMENODES, peerFSAddress, conf.get(HConstants.HBASE_DIR));<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    }<a name="line.440"></a>
-<span class="sourceLineNo">441</span><a name="line.441"></a>
-<span class="sourceLineNo">442</span>    Job job = Job.getInstance(conf, conf.get(JOB_NAME_CONF_KEY, NAME + "_" + tableName));<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    job.setJarByClass(VerifyReplication.class);<a name="line.443"></a>
-<span class="sourceLineNo">444</span><a name="line.444"></a>
-<span class="sourceLineNo">445</span>    Scan scan = new Scan();<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    scan.setTimeRange(startTime, endTime);<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    scan.setRaw(includeDeletedCells);<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    scan.setCacheBlocks(false);<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    if (batch &gt; 0) {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>      scan.setBatch(batch);<a name="line.450"></a>
-<span class="sourceLineNo">451</span>    }<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    if (versions &gt;= 0) {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      scan.setMaxVersions(versions);<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      LOG.info("Number of versions set to " + versions);<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    }<a name="line.455"></a>
-<span class="sourceLineNo">456</span>    if(families != null) {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      String[] fams = families.split(",");<a name="line.457"></a>
-<span class="sourceLineNo">458</span>      for(String fam : fams) {<a name="line.458"></a>
-<span class="sourceLineNo">459</span>        scan.addFamily(Bytes.toBytes(fam));<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><a name="line.462"></a>
-<span class="sourceLineNo">463</span>    setRowPrefixFilter(scan, rowPrefixes);<a name="line.463"></a>
-<span class="sourceLineNo">464</span><a name="line.464"></a>
-<span class="sourceLineNo">465</span>    if (sourceSnapshotName != null) {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      Path snapshotTempPath = new Path(sourceSnapshotTmpDir);<a name="line.466"></a>
-<span class="sourceLineNo">467</span>      LOG.info(<a name="line.467"></a>
-<span class="sourceLineNo">468</span>        "Using source snapshot-" + sourceSnapshotName + " with temp dir:" + sourceSnapshotTmpDir);<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      TableMapReduceUtil.initTableSnapshotMapperJob(sourceSnapshotName, scan, Verifier.class, null,<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        null, job, true, snapshotTempPath);<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      restoreSnapshotForPeerCluster(conf, peerQuorumAddress);<a name="line.471"></a>
-<span class="sourceLineNo">472</span>    } else {<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      TableMapReduceUtil.initTableMapperJob(tableName, scan, Verifier.class, null, null, job);<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
-<span class="sourceLineNo">475</span><a name="line.475"></a>
-<span class="sourceLineNo">476</span>    if (peerId != null) {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      assert peerConfigPair != null;<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      Configuration peerClusterConf = peerConfigPair.getSecond();<a name="line.478"></a>
-<span class="sourceLineNo">479</span>      // Obtain the auth token from peer cluster<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      TableMapReduceUtil.initCredentialsForCluster(job, peerClusterConf);<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
-<span class="sourceLineNo">482</span><a name="line.482"></a>
-<span class="sourceLineNo">483</span>    job.setOutputFormatClass(NullOutputFormat.class);<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    job.setNumReduceTasks(0);<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    return job;<a name="line.485"></a>
-<span class="sourceLineNo">486</span>  }<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>  private static void setRowPrefixFilter(Scan scan, String rowPrefixes) {<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    if (rowPrefixes != null &amp;&amp; !rowPrefixes.isEmpty()) {<a name="line.489"></a>
-<span class="sourceLineNo">490</span>      String[] rowPrefixArray = rowPrefixes.split(",");<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      Arrays.sort(rowPrefixArray);<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ONE);<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      for (String prefix : rowPrefixArray) {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        Filter filter = new PrefixFilter(Bytes.toBytes(prefix));<a name="line.494"></a>
-<span class="sourceLineNo">495</span>        filterList.addFilter(filter);<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      }<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      scan.setFilter(filterList);<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      byte[] startPrefixRow = Bytes.toBytes(rowPrefixArray[0]);<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      byte[] lastPrefixRow = Bytes.toBytes(rowPrefixArray[rowPrefixArray.length -1]);<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      setStartAndStopRows(scan, startPrefixRow, lastPrefixRow);<a name="line.500"></a>
-<span class="sourceLineNo">501</span>    }<a name="line.501"></a>
-<span class="sourceLineNo">502</span>  }<a name="line.502"></a>
-<span class="sourceLineNo">503</span><a name="line.503"></a>
-<span class="sourceLineNo">504</span>  private static void setStartAndStopRows(Scan scan, byte[] startPrefixRow, byte[] lastPrefixRow) {<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    scan.setStartRow(startPrefixRow);<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    byte[] stopRow = Bytes.add(Bytes.head(lastPrefixRow, lastPrefixRow.length - 1),<a name="line.506"></a>
-<span class="sourceLineNo">507</span>        new byte[]{(byte) (lastPrefixRow[lastPrefixRow.length - 1] + 1)});<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    scan.setStopRow(stopRow);<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>  @VisibleForTesting<a name="line.511"></a>
-<span class="sourceLineNo">512</span>  public boolean doCommandLine(final String[] args) {<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    if (args.length &lt; 2) {<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      printUsage(null);<a name="line.514"></a>
-<span class="sourceLineNo">515</span>      return false;<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    }<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    try {<a name="line.517"></a>
-<span class="sourceLineNo">518</span>      for (int i = 0; i &lt; args.length; i++) {<a name="line.518"></a>
-<span class="sourceLineNo">519</span>        String cmd = args[i];<a name="line.519"></a>
-<span class="sourceLineNo">520</span>        if (cmd.equals("-h") || cmd.startsWith("--h")) {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>          printUsage(null);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          return false;<a name="line.522"></a>
-<span class="sourceLineNo">523</span>        }<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>        final String startTimeArgKey = "--starttime=";<a name="line.525"></a>
-<span class="sourceLineNo">526</span>        if (cmd.startsWith(startTimeArgKey)) {<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          startTime = Long.parseLong(cmd.substring(startTimeArgKey.length()));<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          continue;<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>        final String endTimeArgKey = "--endtime=";<a name="line.531"></a>
-<span class="sourceLineNo">532</span>        if (cmd.startsWith(endTimeArgKey)) {<a name="line.532"></a>
-<span class="sourceLineNo">533</span>          endTime = Long.parseLong(cmd.substring(endTimeArgKey.length()));<a name="line.533"></a>
-<span class="sourceLineNo">534</span>          continue;<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>        final String includeDeletedCellsArgKey = "--raw";<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        if (cmd.equals(includeDeletedCellsArgKey)) {<a name="line.538"></a>
-<span class="sourceLineNo">539</span>          includeDeletedCells = true;<a name="line.539"></a>
-<span class="sourceLineNo">540</span>          continue;<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        }<a name="line.541"></a>
-<span class="sourceLineNo">542</span><a name="line.542"></a>
-<span class="sourceLineNo">543</span>        final String versionsArgKey = "--versions=";<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        if (cmd.startsWith(versionsArgKey)) {<a name="line.544"></a>
-<span class="sourceLineNo">545</span>          versions = Integer.parseInt(cmd.substring(versionsArgKey.length()));<a name="line.545"></a>
-<span class="sourceLineNo">546</span>          continue;<a name="line.546"></a>
-<span class="sourceLineNo">547</span>        }<a name="line.547"></a>
-<span class="sourceLineNo">548</span><a name="line.548"></a>
-<span class="sourceLineNo">549</span>        final String batchArgKey = "--batch=";<a name="line.549"></a>
-<span class="sourceLineNo">550</span>        if (cmd.startsWith(batchArgKey)) {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>          batch = Integer.parseInt(cmd.substring(batchArgKey.length()));<a name="line.551"></a>
-<span class="sourceLineNo">552</span>          continue;<a name="line.552"></a>
-<span class="sourceLineNo">553</span>        }<a name="line.553"></a>
-<span class="sourceLineNo">554</span><a name="line.554"></a>
-<span class="sourceLineNo">555</span>        final String familiesArgKey = "--families=";<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        if (cmd.startsWith(familiesArgKey)) {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>          families = cmd.substring(familiesArgKey.length());<a name="line.557"></a>
-<span class="sourceLineNo">558</span>          continue;<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>        final String rowPrefixesKey = "--row-prefixes=";<a name="line.561"></a>
-<span class="sourceLineNo">562</span>        if (cmd.startsWith(rowPrefixesKey)){<a name="line.562"></a>
-<span class="sourceLineNo">563</span>          rowPrefixes = cmd.substring(rowPrefixesKey.length());<a name="line.563"></a>
-<span class="sourceLineNo">564</span>          continue;<a name="line.564"></a>
-<span class="sourceLineNo">565</span>        }<a name="line.565"></a>
-<span class="sourceLineNo">566</span><a name="line.566"></a>
-<span class="sourceLineNo">567</span>        final String delimiterArgKey = "--delimiter=";<a name="line.567"></a>
-<span class="sourceLineNo">568</span>        if (cmd.startsWith(delimiterArgKey)) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>          delimiter = cmd.substring(delimiterArgKey.length());<a name="line.569"></a>
-<span class="sourceLineNo">570</span>          continue;<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>        final String sleepToReCompareKey = "--recomparesleep=";<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        if (cmd.startsWith(sleepToReCompareKey)) {<a name="line.574"></a>
-<span class="sourceLineNo">575</span>          sleepMsBeforeReCompare = Integer.parseInt(cmd.substring(sleepToReCompareKey.length()));<a name="line.575"></a>
-<span class="sourceLineNo">576</span>          continue;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        }<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        final String verboseKey = "--verbose";<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        if (cmd.startsWith(verboseKey)) {<a name="line.579"></a>
-<span class="sourceLineNo">580</span>          verbose = true;<a name="line.580"></a>
-<span class="sourceLineNo">581</span>          continue;<a name="line.581"></a>
-<span class="sourceLineNo">582</span>        }<a name="line.582"></a>
-<span class="sourceLineNo">583</span><a name="line.583"></a>
-<span class="sourceLineNo">584</span>        final String sourceSnapshotNameArgKey = "--sourceSnapshotName=";<a name="line.584"></a>
-<span class="sourceLineNo">585</span>        if (cmd.startsWith(sourceSnapshotNameArgKey)) {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>          sourceSnapshotName = cmd.substring(sourceSnapshotNameArgKey.length());<a name="line.586"></a>
-<span class="sourceLineNo">587</span>          continue;<a name="line.587"></a>
-<span class="sourceLineNo">588</span>        }<a name="line.588"></a>
-<span class="sourceLineNo">589</span><a name="line.589"></a>
-<span class="sourceLineNo">590</span>        final String sourceSnapshotTmpDirArgKey = "--sourceSnapshotTmpDir=";<a name="line.590"></a>
-<span class="sourceLineNo">591</span>        if (cmd.startsWith(sourceSnapshotTmpDirArgKey)) {<a name="line.591"></a>
-<span class="sourceLineNo">592</span>          sourceSnapshotTmpDir = cmd.substring(sourceSnapshotTmpDirArgKey.length());<a name="line.592"></a>
-<span class="sourceLineNo">593</span>          continue;<a name="line.593"></a>
-<span class="sourceLineNo">594</span>        }<a name="line.594"></a>
-<span class="sourceLineNo">595</span><a name="line.595"></a>
-<span class="sourceLineNo">596</span>        final String peerSnapshotNameArgKey = "--peerSnapshotName=";<a name="line.596"></a>
-<span class="sourceLineNo">597</span>        if (cmd.startsWith(peerSnapshotNameArgKey)) {<a name="line.597"></a>
-<span class="sourceLineNo">598</span>          peerSnapshotName = cmd.substring(peerSnapshotNameArgKey.length());<a name="line.598"></a>
-<span class="sourceLineNo">599</span>          continue;<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>        final String peerSnapshotTmpDirArgKey = "--peerSnapshotTmpDir=";<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        if (cmd.startsWith(peerSnapshotTmpDirArgKey)) {<a name="line.603"></a>
-<span class="sourceLineNo">604</span>          peerSnapshotTmpDir = cmd.substring(peerSnapshotTmpDirArgKey.length());<a name="line.604"></a>
-<span class="sourceLineNo">605</span>          continue;<a name="line.605"></a>
-<span class="sourceLineNo">606</span>        }<a name="line.606"></a>
-<span class="sourceLineNo">607</span><a name="line.607"></a>
-<span class="sourceLineNo">608</span>        final String peerFSAddressArgKey = "--peerFSAddress=";<a name="line.608"></a>
-<span class="sourceLineNo">609</span>        if (cmd.startsWith(peerFSAddressArgKey)) {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>          peerFSAddress = cmd.substring(peerFSAddressArgKey.length());<a name="line.610"></a>
-<span class="sourceLineNo">611</span>          continue;<a name="line.611"></a>
-<span class="sourceLineNo">612</span>        }<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>        final String peerHBaseRootAddressArgKey = "--peerHBaseRootAddress=";<a name="line.614"></a>
-<span class="sourceLineNo">615</span>        if (cmd.startsWith(peerHBaseRootAddressArgKey)) {<a name="line.615"></a>
-<span class="sourceLineNo">616</span>          peerHBaseRootAddress = cmd.substring(peerHBaseRootAddressArgKey.length());<a name="line.616"></a>
-<span class="sourceLineNo">617</span>          continue;<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>        if (cmd.startsWith("--")) {<a name="line.620"></a>
-<span class="sourceLineNo">621</span>          printUsage("Invalid argument '" + cmd + "'");<a name="line.621"></a>
-<span class="sourceLineNo">622</span>          return false;<a name="line.622"></a>
-<span class="sourceLineNo">623</span>        }<a name="line.623"></a>
-<span class="sourceLineNo">624</span><a name="line.624"></a>
-<span class="sourceLineNo">625</span>        if (i == args.length-2) {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>          if (isPeerQuorumAddress(cmd)) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>            peerQuorumAddress = cmd;<a name="line.627"></a>
-<span class="sourceLineNo">628</span>          } else {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>            peerId = cmd;<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>        if (i == args.length-1) {<a name="line.633"></a>
-<span class="sourceLineNo">634</span>          tableName = cmd;<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>      if ((sourceSnapshotName != null &amp;&amp; sourceSnapshotTmpDir == null)<a name="line.638"></a>
-<span class="sourceLineNo">639</span>          || (sourceSnapshotName == null &amp;&amp; sourceSnapshotTmpDir != null)) {<a name="line.639"></a>
-<span class="sourceLineNo">640</span>        printUsage("Source snapshot name and snapshot temp location should be provided"<a name="line.640"></a>
-<span class="sourceLineNo">641</span>            + " to use snapshots in source cluster");<a name="line.641"></a>
-<span class="sourceLineNo">642</span>        return false;<a name="line.642"></a>
-<span class="sourceLineNo">643</span>      }<a name="line.643"></a>
-<span class="sourceLineNo">644</span><a name="line.644"></a>
-<span class="sourceLineNo">645</span>      if (peerSnapshotName != null || peerSnapshotTmpDir != null || peerFSAddress != null<a name="line.645"></a>
-<span class="sourceLineNo">646</span>          || peerHBaseRootAddress != null) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>        if (peerSnapshotName == null || peerSnapshotTmpDir == null || peerFSAddress == null<a name="line.647"></a>
-<span class="sourceLineNo">648</span>            || peerHBaseRootAddress == null) {<a name="line.648"></a>
-<span class="sourceLineNo">649</span>          printUsage(<a name="line.649"></a>
-<span class="sourceLineNo">650</span>            "Peer snapshot name, peer snapshot temp location, Peer HBase root address and  "<a name="line.650"></a>
-<span class="sourceLineNo">651</span>                + "peer FSAddress should be provided to use snapshots in peer cluster");<a name="line.651"></a>
-<span class="sourceLineNo">652</span>          return false;<a name="line.652"></a>
-<span class="sourceLineNo">653</span>        }<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      }<a name="line.654"></a>
-<span class="sourceLineNo">655</span><a name="line.655"></a>
-<span class="sourceLineNo">656</span>      // This is to avoid making recompare calls to source/peer tables when snapshots are used<a name="line.656"></a>
-<span class="sourceLineNo">657</span>      if ((sourceSnapshotName != null || peerSnapshotName != null) &amp;&amp; sleepMsBeforeReCompare &gt; 0) {<a name="line.657"></a>
-<span class="sourceLineNo">658</span>        printUsage(<a name="line.658"></a>
-<span class="sourceLineNo">659</span>          "Using sleepMsBeforeReCompare along with snapshots is not allowed as snapshots are immutable");<a name="line.659"></a>
-<span class="sourceLineNo">660</span>        return false;<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>    } catch (Exception e) {<a name="line.663"></a>
-<span class="sourceLineNo">664</span>      LOG.error("Failed to parse commandLine arguments", e);<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      printUsage("Can't start because " + e.getMessage());<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      return false;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    }<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    return true;<a name="line.668"></a>
-<span class="sourceLineNo">669</span>  }<a name="line.669"></a>
+<span class="sourceLineNo">438</span>      // for verifyRep by snapshot, choose a unique sub-directory under peerSnapshotTmpDir to<a name="line.438"></a>
+<span class="sourceLineNo">439</span>      // restore snapshot.<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      Path restoreDir = new Path(peerSnapshotTmpDir, UUID.randomUUID().toString());<a name="line.440"></a>
+<span class="sourceLineNo">441</span>      peerSnapshotTmpDir = restoreDir.toString();<a name="line.441"></a>
+<span class="sourceLineNo">442</span>      conf.set(NAME + ".peerSnapshotTmpDir", peerSnapshotTmpDir);<a name="line.442"></a>
+<span class="sourceLineNo">443</span><a name="line.443"></a>
+<span class="sourceLineNo">444</span>      conf.set(NAME + ".peerFSAddress", peerFSAddress);<a name="line.444"></a>
+<span class="sourceLineNo">445</span>      conf.set(NAME + ".peerHBaseRootAddress", peerHBaseRootAddress);<a name="line.445"></a>
+<span class="sourceLineNo">446</span><a name="line.446"></a>
+<span class="sourceLineNo">447</span>      // This is to create HDFS delegation token for peer cluster in case of secured<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      conf.setStrings(MRJobConfig.JOB_NAMENODES, peerFSAddress, conf.get(HConstants.HBASE_DIR));<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>    Job job = Job.getInstance(conf, conf.get(JOB_NAME_CONF_KEY, NAME + "_" + tableName));<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    job.setJarByClass(VerifyReplication.class);<a name="line.452"></a>
+<span class="sourceLineNo">453</span><a name="line.453"></a>
+<span class="sourceLineNo">454</span>    Scan scan = new Scan();<a name="line.454"></a>
+<span class="sourceLineNo">455</span>    scan.setTimeRange(startTime, endTime);<a name="line.455"></a>
+<span class="sourceLineNo">456</span>    scan.setRaw(includeDeletedCells);<a name="line.456"></a>
+<span class="sourceLineNo">457</span>    scan.setCacheBlocks(false);<a name="line.457"></a>
+<span class="sourceLineNo">458</span>    if (batch &gt; 0) {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>      scan.setBatch(batch);<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    }<a name="line.460"></a>
+<span class="sourceLineNo">461</span>    if (versions &gt;= 0) {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      scan.setMaxVersions(versions);<a name="line.462"></a>
+<span class="sourceLineNo">463</span>      LOG.info("Number of versions set to " + versions);<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    }<a name="line.464"></a>
+<span class="sourceLineNo">465</span>    if(families != null) {<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      String[] fams = families.split(",");<a name="line.466"></a>
+<span class="sourceLineNo">467</span>      for(String fam : fams) {<a name="line.467"></a>
+<span class="sourceLineNo">468</span>        scan.addFamily(Bytes.toBytes(fam));<a name="line.468"></a>
+<span class="sourceLineNo">469</span>      }<a name="line.469"></a>
+<span class="sourceLineNo">470</span>    }<a name="line.470"></a>
+<span class="sourceLineNo">471</span><a name="line.471"></a>
+<span class="sourceLineNo">472</span>    setRowPrefixFilter(scan, rowPrefixes);<a name="line.472"></a>
+<span class="sourceLineNo">473</span><a name="line.473"></a>
+<span class="sourceLineNo">474</span>    if (sourceSnapshotName != null) {<a name="line.474"></a>
+<span class="sourceLineNo">475</span>      Path snapshotTempPath = new Path(sourceSnapshotTmpDir);<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      LOG.info(<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        "Using source snapshot-" + sourceSnapshotName + " with temp dir:" + sourceSnapshotTmpDir);<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      TableMapReduceUtil.initTableSnapshotMapperJob(sourceSnapshotName, scan, Verifier.class, null,<a name="line.478"></a>
+<span class="sourceLineNo">479</span>        null, job, true, snapshotTempPath);<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      restoreSnapshotForPeerCluster(conf, peerQuorumAddress);<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    } else {<a name="line.481"></a>
+<span class="sourceLineNo">482</span>      TableMapReduceUtil.initTableMapperJob(tableName, scan, Verifier.class, null, null, job);<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    }<a name="line.483"></a>
+<span class="sourceLineNo">484</span><a name="line.484"></a>
+<span class="sourceLineNo">485</span>    if (peerId != null) {<a name="line.485"></a>
+<span class="sourceLineNo">486</span>      assert peerConfigPair != null;<a name="line.486"></a>
+<span class="sourceLineNo">487</span>      Configuration peerClusterConf = peerConfigPair.getSecond();<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      // Obtain the auth token from peer cluster<a name="line.488"></a>
+<span class="sourceLineNo">489</span>      TableMapReduceUtil.initCredentialsForCluster(job, peerClusterConf);<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    }<a name="line.490"></a>
+<span class="sourceLineNo">491</span><a name="line.491"></a>
+<span class="sourceLineNo">492</span>    job.setOutputFormatClass(NullOutputFormat.class);<a name="line.492"></a>
+<span class="sourceLineNo">493</span>    job.setNumReduceTasks(0);<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    return job;<a name="line.494"></a>
+<span class="sourceLineNo">495</span>  }<a name="line.495"></a>
+<span class="sourceLineNo">496</span><a name="line.496"></a>
+<span class="sourceLineNo">497</span>  private static void setRowPrefixFilter(Scan scan, String rowPrefixes) {<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    if (rowPrefixes != null &amp;&amp; !rowPrefixes.isEmpty()) {<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      String[] rowPrefixArray = rowPrefixes.split(",");<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      Arrays.sort(rowPrefixArray);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ONE);<a name="line.501"></a>
+<span class="sourceLineNo">502</span>      for (String prefix : rowPrefixArray) {<a name="line.502"></a>
+<span class="sourceLineNo">503</span>        Filter filter = new PrefixFilter(Bytes.toBytes(prefix));<a name="line.503"></a>
+<span class="sourceLineNo">504</span>        filterList.addFilter(filter);<a name="line.504"></a>
+<span class="sourceLineNo">505</span>      }<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      scan.setFilter(filterList);<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      byte[] startPrefixRow = Bytes.toBytes(rowPrefixArray[0]);<a name="line.507"></a>
+<span class="sourceLineNo">508</span>      byte[] lastPrefixRow = Bytes.toBytes(rowPrefixArray[rowPrefixArray.length -1]);<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      setStartAndStopRows(scan, startPrefixRow, lastPrefixRow);<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    }<a name="line.510"></a>
+<span class="sourceLineNo">511</span>  }<a name="line.511"></a>
+<span class="sourceLineNo">512</span><a name="line.512"></a>
+<span class="sourceLineNo">513</span>  private static void setStartAndStopRows(Scan scan, byte[] startPrefixRow, byte[] lastPrefixRow) {<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    scan.setStartRow(startPrefixRow);<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    byte[] stopRow = Bytes.add(Bytes.head(lastPrefixRow, lastPrefixRow.length - 1),<a name="line.515"></a>
+<span class="sourceLineNo">516</span>        new byte[]{(byte) (lastPrefixRow[lastPrefixRow.length - 1] + 1)});<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    scan.setStopRow(stopRow);<a name="line.517"></a>
+<span class="sourceLineNo">518</span>  }<a name="line.518"></a>
+<span class="sourceLineNo">519</span><a name="line.519"></a>
+<span class="sourceLineNo">520</span>  @VisibleForTesting<a name="line.520"></a>
+<span class="sourceLineNo">521</span>  public boolean doCommandLine(final String[] args) {<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    if (args.length &lt; 2) {<a name="line.522"></a>
+<span class="sourceLineNo">523</span>      printUsage(null);<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      return false;<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    }<a name="line.525"></a>
+<span class="sourceLineNo">526</span>    try {<a name="line.526"></a>
+<span class="sourceLineNo">527</span>      for (int i = 0; i &lt; args.length; i++) {<a name="line.527"></a>
+<span class="sourceLineNo">528</span>        String cmd = args[i];<a name="line.528"></a>
+<span class="sourceLineNo">529</span>        if (cmd.equals("-h") || cmd.startsWith("--h")) {<a name="line.529"></a>
+<span class="sourceLineNo">530</span>          printUsage(null);<a name="line.530"></a>
+<span class="sourceLineNo">531</span>          return false;<a name="line.531"></a>
+<span class="sourceLineNo">532</span>        }<a name="line.532"></a>
+<span class="sourceLineNo">533</span><a name="line.533"></a>
+<span class="sourceLineNo">534</span>        final String startTimeArgKey = "--starttime=";<a name="line.534"></a>
+<span class="sourceLineNo">535</span>        if (cmd.startsWith(startTimeArgKey)) {<a name="line.535"></a>
+<span class="sourceLineNo">536</span>          startTime = Long.parseLong(cmd.substring(startTimeArgKey.length()));<a name="line.536"></a>
+<span class="sourceLineNo">537</span>          continue;<a name="line.537"></a>
+<span class="sourceLineNo">538</span>        }<a name="line.538"></a>
+<span class="sourceLineNo">539</span><a name="line.539"></a>
+<span class="sourceLineNo">540</span>        final String endTimeArgKey = "--endtime=";<a name="line.540"></a>
+<span class="sourceLineNo">541</span>        if (cmd.startsWith(endTimeArgKey)) {<a name="line.541"></a>
+<span class="sourceLineNo">542</span>          endTime = Long.parseLong(cmd.substring(endTimeArgKey.length()));<a name="line.542"></a>
+<span class="sourceLineNo">543</span>          continue;<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>        final String includeDeletedCellsArgKey = "--raw";<a name="line.546"></a>
+<span class="sourceLineNo">547</span>        if (cmd.equals(includeDeletedCellsArgKey)) {<a name="line.547"></a>
+<span class="sourceLineNo">548</span>          includeDeletedCells = true;<a name="line.548"></a>
+<span class="sourceLineNo">549</span>          continue;<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>        final String versionsArgKey = "--versions=";<a name="line.552"></a>
+<span class="sourceLineNo">553</span>        if (cmd.startsWith(versionsArgKey)) {<a name="line.553"></a>
+<span class="sourceLineNo">554</span>          versions = Integer.parseInt(cmd.substring(versionsArgKey.length()));<a name="line.554"></a>
+<span class="sourceLineNo">555</span>          continue;<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>        final String batchArgKey = "--batch=";<a name="line.558"></a>
+<span class="sourceLineNo">559</span>        if (cmd.startsWith(batchArgKey)) {<a name="line.559"></a>
+<span class="sourceLineNo">560</span>          batch = Integer.parseInt(cmd.substring(batchArgKey.length()));<a name="line.560"></a>
+<span class="sourceLineNo">561</span>          continue;<a name="line.561"></a>
+<span class="sourceLineNo">562</span>        }<a name="line.562"></a>
+<span class="sourceLineNo">563</span><a name="line.563"></a>
+<span class="sourceLineNo">564</span>        final String familiesArgKey = "--families=";<a name="line.564"></a>
+<span class="sourceLineNo">565</span>        if (cmd.startsWith(familiesArgKey)) {<a name="line.565"></a>
+<span class="sourceLineNo">566</span>          families = cmd.substring(familiesArgKey.length());<a name="line.566"></a>
+<span class="sourceLineNo">567</span>          continue;<a name="line.567"></a>
+<span class="sourceLineNo">568</span>        }<a name="line.568"></a>
+<span class="sourceLineNo">569</span><a name="line.569"></a>
+<span class="sourceLineNo">570</span>        final String rowPrefixesKey = "--row-prefixes=";<a name="line.570"></a>
+<span class="sourceLineNo">571</span>        if (cmd.startsWith(rowPrefixesKey)){<a name="line.571"></a>
+<span class="sourceLineNo">572</span>          rowPrefixes = cmd.substring(rowPrefixesKey.length());<a name="line.572"></a>
+<span class="sourceLineNo">573</span>          continue;<a name="line.573"></a>
+<span class="sourceLineNo">574</span>        }<a name="line.574"></a>
+<span class="sourceLineNo">575</span><a name="line.575"></a>
+<span class="sourceLineNo">576</span>        final String delimiterArgKey = "--delimiter=";<a name="line.576"></a>
+<span class="sourceLineNo">577</span>        if (cmd.startsWith(delimiterArgKey)) {<a name="line.577"></a>
+<span class="sourceLineNo">578</span>          delimiter = cmd.substring(delimiterArgKey.length());<a name="line.578"></a>
+<span class="sourceLineNo">579</span>          continue;<a name="line.579"></a>
+<span class="sourceLineNo">580</span>        }<a name="line.580"></a>
+<span class="sourceLineNo">581</span><a name="line.581"></a>
+<span class="sourceLineNo">582</span>        final String sleepToReCompareKey = "--recomparesleep=";<a name="line.582"></a>
+<span class="sourceLineNo">583</span>        if (cmd.startsWith(sleepToReCompareKey)) {<a name="line.583"></a>
+<span class="sourceLineNo">584</span>          sleepMsBeforeReCompare = Integer.parseInt(cmd.substring(sleepToReCompareKey.length()));<a name="line.584"></a>
+<span class="sourceLineNo">585</span>          continue;<a name="line.585"></a>
+<span class="sourceLineNo">586</span>        }<a name="line.586"></a>
+<span class="sourceLineNo">587</span>        final String verboseKey = "--verbose";<a name="line.587"></a>
+<span class="sourceLineNo">588</span>        if (cmd.startsWith(verboseKey)) {<a name="line.588"></a>
+<span class="sourceLineNo">589</span>          verbose = true;<a name="line.589"></a>
+<span class="sourceLineNo">590</span>          continue;<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>        final String sourceSnapshotNameArgKey = "--sourceSnapshotName=";<a name="line.593"></a>
+<span class="sourceLineNo">594</span>        if (cmd.startsWith(sourceSnapshotNameArgKey)) {<a name="line.594"></a>
+<span class="sourceLineNo">595</span>          sourceSnapshotName = cmd.substring(sourceSnapshotNameArgKey.length());<a name="line.595"></a>
+<span class="sourceLineNo">596</span>          continue;<a name="line.596"></a>
+<span class="sourceLineNo">597</span>        }<a name="line.597"></a>
+<span class="sourceLineNo">598</span><a name="line.598"></a>
+<span class="sourceLineNo">599</span>        final String sourceSnapshotTmpDirArgKey = "--sourceSnapshotTmpDir=";<a name="line.599"></a>
+<span class="sourceLineNo">600</span>        if (cmd.startsWith(sourceSnapshotTmpDirArgKey)) {<a name="line.600"></a>
+<span class="sourceLineNo">601</span>          sourceSnapshotTmpDir = cmd.substring(sourceSnapshotTmpDirArgKey.length());<a name="line.601"></a>
+<span class="sourceLineNo">602</span>          continue;<a name="line.602"></a>
+<span class="sourceLineNo">603</span>        }<a name="line.603"></a>
+<span class="sourceLineNo">604</span><a name="line.604"></a>
+<span class="sourceLineNo">605</span>        final String peerSnapshotNameArgKey = "--peerSnapshotName=";<a name="line.605"></a>
+<span class="sourceLineNo">606</span>        if (cmd.startsWith(peerSnapshotNameArgKey)) {<a name="line.606"></a>
+<span class="sourceLineNo">607</span>          peerSnapshotName = cmd.substring(peerSnapshotNameArgKey.length());<a name="line.607"></a>
+<span class="sourceLineNo">608</span>          continue;<a name="line.608"></a>
+<span class="sourceLineNo">609</span>        }<a name="line.609"></a>
+<span class="sourceLineNo">610</span><a name="line.610"></a>
+<span class="sourceLineNo">611</span>        final String peerSnapshotTmpDirArgKey = "--peerSnapshotTmpDir=";<a name="line.611"></a>
+<span class="sourceLineNo">612</span>        if (cmd.startsWith(peerSnapshotTmpDirArgKey)) {<a name="line.612"></a>
+<span class="sourceLineNo">613</span>          peerSnapshotTmpDir = cmd.substring(peerSnapshotTmpDirArgKey.length());<a name="line.613"></a>
+<span class="sourceLineNo">614</span>          continue;<a name="line.614"></a>
+<span class="sourceLineNo">615</span>        }<a name="line.615"></a>
+<span class="sourceLineNo">616</span><a name="line.616"></a>
+<span class="sourceLineNo">617</span>        final String peerFSAddressArgKey = "--peerFSAddress=";<a name="line.617"></a>
+<span class="sourceLineNo">618</span>        if (cmd.startsWith(peerFSAddressArgKey)) {<a name="line.618"></a>
+<span class="sourceLineNo">619</span>          peerFSAddress = cmd.substring(peerFSAddressArgKey.length());<a name="line.619"></a>
+<span class="sourceLineNo">620</span>          continue;<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>        final String peerHBaseRootAddressArgKey = "--peerHBaseRootAddress=";<a name="line.623"></a>
+<span class="sourceLineNo">624</span>        if (cmd.startsWith(peerHBaseRootAddressArgKey)) {<a name="line.624"></a>
+<span class="sourceLineNo">625</span>          peerHBaseRootAddress = cmd.substring(peerHBaseRootAddressArgKey.length());<a name="line.625"></a>
+<span class="sourceLineNo">626</span>          continue;<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>        final String peerTableNameArgKey = "--peerTableName=";<a name="line.629"></a>
+<span class="sourceLineNo">630</span>        if (cmd.startsWith(peerTableNameArgKey)) {<a name="line.630"></a>
+<span class="sourceLineNo">631</span>          peerTableName = cmd.substring(peerTableNameArgKey.length());<a name="line.631"></a>
+<span class="sourceLineNo">632</span>          continue;<a name="line.632"></a>
+<span class="sourceLineNo">633</span>        }<a name="line.633"></a>
+<span class="sourceLineNo">634</span><a name="line.634"></a>
+<span class="sourceLineNo">635</span>        if (cmd.startsWith("--")) {<a name="line.635"></a>
+<span class="sourceLineNo">636</span>          printUsage("Invalid argument '" + cmd + "'");<a name="line.636"></a>
+<span class="sourceLineNo">637</span>          return false;<a name="line.637"></a>
+<span class="sourceLineNo">638</span>        }<a name="line.638"></a>
+<span class="sourceLineNo">639</span><a name="line.639"></a>
+<span class="sourceLineNo">640</span>        if (i == args.length-2) {<a name="line.640"></a>
+<span class="sourceLineNo">641</span>          if (isPeerQuorumAddress(cmd)) {<a name="line.641"></a>
+<span class="sourceLineNo">642</span>            peerQuorumAddress = cmd;<a name="line.642"></a>
+<span class="sourceLineNo">643</span>          } else {<a name="line.643"></a>
+<span class="sourceLineNo">644</span>            peerId = cmd;<a name="line.644"></a>
+<span class="sourceLineNo">645</span>          }<a name="line.645"></a>
+<span class="sourceLineNo">646</span>        }<a name="line.646"></a>
+<span class="sourceLineNo">647</span><a name="line.647"></a>
+<span class="sourceLineNo">648</span>        if (i == args.length-1) {<a name="line.648"></a>
+<span class="sourceLineNo">649</span>          tableName = cmd;<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><a name="line.652"></a>
+<span class="sourceLineNo">653</span>      if ((sourceSnapshotName != null &amp;&amp; sourceSnapshotTmpDir == null)<a name="line.653"></a>
+<span class="sourceLineNo">654</span>          || (sourceSnapshotName == null &amp;&amp; sourceSnapshotTmpDir != null)) {<a name="line.654"></a>
+<span class="sourceLineNo">655</span>        printUsage("Source snapshot name and snapshot temp location should be provided"<a name="line.655"></a>
+<span class="sourceLineNo">656</span>            + " to use snapshots in source cluster");<a name="line.656"></a>
+<span class="sourceLineNo">657</span>        return false;<a name="line.657"></a>
+<span class="sourceLineNo">658</span>      }<a name="line.658"></a>
+<span class="sourceLineNo">659</span><a name="line.659"></a>
+<span class="sourceLineNo">660</span>      if (peerSnapshotName != null || peerSnapshotTmpDir != null || peerFSAddress != null<a name="line.660"></a>
+<span class="sourceLineNo">661</span>          || peerHBaseRootAddress != null) {<a name="line.661"></a>
+<span class="sourceLineNo">662</span>        if (peerSnapshotName == null || peerSnapshotTmpDir == null || peerFSAddress == null<a name="line.662"></a>
+<span class="sourceLineNo">663</span>            || peerHBaseRootAddress == null) {<a name="line.663"></a>
+<span class="sourceLineNo">664</span>          printUsage(<a name="line.664"></a>
+<span class="sourceLineNo">665</span>            "Peer snapshot name, peer snapshot temp location, Peer HBase root address and  "<a name="line.665"></a>
+<span class="sourceLineNo">666</span>                + "peer FSAddress should be provided to use snapshots in peer cluster");<a name="line.666"></a>
+<span class="sourceLineNo">667</span>          return false;<a name="line.667"></a>
+<span class="sourceLineNo">668</span>        }<a name="line.668"></a>
+<span class="sourceLineNo">669</span>      }<a name="line.669"></a>
 <span class="sourceLineNo">670</span><a name="line.670"></a>
-<span class="sourceLineNo">671</span>  private boolean isPeerQuorumAddress(String cmd) {<a name="line.671"></a>
-<span class="sourceLineNo">672</span>    try {<a name="line.672"></a>
-<span class="sourceLineNo">673</span>      ZKConfig.validateClusterKey(cmd);<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    } catch (IOException e) {<a name="line.674"></a>
-<span class="sourceLineNo">675</span>      // not a quorum address<a name="line.675"></a>
-<span class="sourceLineNo">676</span>      return false;<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    }<a name="line.677"></a>
-<span class="sourceLineNo">678</span>    return true;<a name="line.678"></a>
-<span class="sourceLineNo">679</span>  }<a name="line.679"></a>
-<span class="sourceLineNo">680</span><a name="line.680"></a>
-<span class="sourceLineNo">681</span>  /*<a name="line.681"></a>
-<span class="sourceLineNo">682</span>   * @param errorMsg Error message.  Can be null.<a name="line.682"></a>
-<span class="sourceLineNo">683</span>   */<a name="line.683"></a>
-<span class="sourceLineNo">684</span>  private static void printUsage(final String errorMsg) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>    if (errorMsg != null &amp;&amp; errorMsg.length() &gt; 0) {<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      System.err.println("ERROR: " + errorMsg);<a name="line.686"></a>
-<span class="sourceLineNo">687</span>    }<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    System.err.println("Usage: verifyrep [--starttime=X]" +<a name="line.688"></a>
-<span class="sourceLineNo">689</span>        " [--endtime=Y] [--families=A] [--row-prefixes=B] [--delimiter=] [--recomparesleep=] " +<a name="line.689"></a>
-<span class="sourceLineNo">690</span>        "[--batch=] [--verbose] [--sourceSnapshotName=P] [--sourceSnapshotTmpDir=Q] "<a name="line.690"></a>
-<span class="sourceLineNo">691</span>      + "[--peerSnapshotName=R] [--peerSnapshotTmpDir=S] [--peerFSAddress=T] "<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      + "[--peerHBaseRootAddress=U] &lt;peerid|peerQuorumAddress&gt; &lt;tablename&gt;");<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    System.err.println();<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    System.err.println("Options:");<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    System.err.println(" starttime    beginning of the time range");<a name="line.695"></a>
-<span class="sourceLineNo">696</span>    System.err.println("              without endtime means from starttime to forever");<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    System.err.println(" endtime      end of the time range");<a name="line.697"></a>
-<span class="sourceLineNo">698</span>    System.err.println(" versions     number of cell versions to verify");<a name="line.698"></a>
-<span class="sourceLineNo">699</span>    System.err.println(" batch        batch count for scan, " +<a name="line.699"></a>
-<span class="sourceLineNo">700</span>        "note that result row counts will no longer be actual number of rows when you use this option");<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    System.err.println(" raw          includes raw scan if given in options");<a name="line.701"></a>
-<span class="sourceLineNo">702</span>    System.err.println(" families     comma-separated list of families to copy");<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    System.err.println(" row-prefixes comma-separated list of row key prefixes to filter on ");<a name="line.703"></a>
-<span class="sourceLineNo">704</span>    System.err.println(" delimiter    the delimiter used in display around rowkey");<a name="line.704"></a>
-<span class="sourceLineNo">705</span>    System.err.println(" recomparesleep   milliseconds to sleep before recompare row, " +<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        "default value is 0 which disables the recompare.");<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    System.err.println(" verbose      logs row keys of good rows");<a name="line.707"></a>
-<span class="sourceLineNo">708</span>    System.err.println(" sourceSnapshotName  Source Snapshot Name");<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    System.err.println(" sourceSnapshotTmpDir Tmp location to restore source table snapshot");<a name="line.709"></a>
-<span class="sourceLineNo">710</span>    System.err.println(" peerSnapshotName  Peer Snapshot Name");<a name="line.710"></a>
-<span class="sourceLineNo">711</span>    System.err.println(" peerSnapshotTmpDir Tmp location to restore peer table snapshot");<a name="line.711"></a>
-<span class="sourceLineNo">712</span>    System.err.println(" peerFSAddress      Peer cluster Hadoop FS address");<a name="line.712"></a>
-<span class="sourceLineNo">713</span>    System.err.println(" peerHBaseRootAddress  Peer cluster HBase root location");<a name="line.713"></a>
-<span class="sourceLineNo">714</span>    System.err.println();<a name="line.714"></a>
-<span class="sourceLineNo">715</span>    System.err.println("Args:");<a name="line.715"></a>
-<span class="sourceLineNo">716</span>    System.err.println(" peerid       Id of the peer used for verification, must match the one given for replication");<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    System.err.println(" peerQuorumAddress   quorumAdress of the peer used for verification. The "<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      + "format is zk_quorum:zk_port:zk_hbase_path");<a name="line.718"></a>
-<span class="sourceLineNo">719</span>    System.err.println(" tablename    Name of the table to verify");<a name="line.719"></a>
-<span class="sourceLineNo">720</span>    System.err.println();<a name="line.720"></a>
-<span class="sourceLineNo">721</span>    System.err.println("Examples:");<a name="line.721"></a>
-<span class="sourceLineNo">722</span>    System.err.println(" To verify the data replicated from TestTable for a 1 hour window with peer #5 ");<a name="line.722"></a>
-<span class="sourceLineNo">723</span>    System.err.println(" $ hbase " +<a name="line.723"></a>
-<span class="sourceLineNo">724</span>        "org.apache.hadoop.hbase.mapreduce.replication.VerifyReplication" +<a name="line.724"></a>
-<span class="sourceLineNo">725</span>        " --starttime=1265875194289 --endtime=1265878794289 5 TestTable ");<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>  @Override<a name="line.728"></a>
-<span class="sourceLineNo">729</span>  public int run(String[] args) throws Exception {<a name="line.729"></a>
-<span class="sourceLineNo">730</span>    Configuration conf = this.getConf();<a name="line.730"></a>
-<span class="sourceLineNo">731</span>    Job job = createSubmittableJob(conf, args);<a name="line.731"></a>
-<span class="sourceLineNo">732</span>    if (job != null) {<a name="line.732"></a>
-<span class="sourceLineNo">733</span>      return job.waitForCompletion(true) ? 0 : 1;<a name="line.733"></a>
-<span class="sourceLineNo">734</span>    }<a name="line.734"></a>
-<span class="sourceLineNo">735</span>    return 1;<a name="line.735"></a>
-<span class="sourceLineNo">736</span>  }<a name="line.736"></a>
-<span class="sourceLineNo">737</span><a name="line.737"></a>
-<span class="sourceLineNo">738</span>  /**<a name="line.738"></a>
-<span class="sourceLineNo">739</span>   * Main entry point.<a name="line.739"></a>
-<span class="sourceLineNo">740</span>   *<a name="line.740"></a>
-<span class="sourceLineNo">741</span>   * @param args  The command line parameters.<a name="line.741"></a>
-<span class="sourceLineNo">742</span>   * @throws Exception When running the job fails.<a name="line.742"></a>
-<span class="sourceLineNo">743</span>   */<a name="line.743"></a>
-<span class="sourceLineNo">744</span>  public static void main(String[] args) throws Exception {<a name="line.744"></a>
-<span class="sourceLineNo">745</span>    int res = ToolRunner.run(HBaseConfiguration.create(), new VerifyReplication(), args);<a name="line.745"></a>
-<span class="sourceLineNo">746</span>    System.exit(res);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>  }<a name="line.747"></a>
-<span class="sourceLineNo">748</span>}<a name="line.748"></a>
+<span class="sourceLineNo">671</span>      // This is to avoid making recompare calls to source/peer tables when snapshots are used<a name="line.671"></a>
+<span class="sourceLineNo">672</span>      if ((sourceSnapshotName != null || peerSnapshotName != null) &amp;&amp; sleepMsBeforeReCompare &gt; 0) {<a name="line.672"></a>
+<span class="sourceLineNo">673</span>        printUsage(<a name="line.673"></a>
+<span class="sourceLineNo">674</span>          "Using sleepMsBeforeReCompare along with snapshots is not allowed as snapshots are immutable");<a name="line.674"></a>
+<span class="sourceLineNo">675</span>        return false;<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>    } catch (Exception e) {<a name="line.678"></a>
+<span class="sourceLineNo">679</span>      LOG.error("Failed to parse commandLine arguments", e);<a name="line.679"></a>
+<span class="sourceLineNo">680</span>      printUsage("Can't start because " + e.getMessage());<a name="line.680"></a>
+<span class="sourceLineNo">681</span>      return false;<a name="line.681"></a>
+<span class="sourceLineNo">682</span>    }<a name="line.682"></a>
+<span class="sourceLineNo">683</span>    return true;<a name="line.683"></a>
+<span class="sourceLineNo">684</span>  }<a name="line.684"></a>
+<span class="sourceLineNo">685</span><a name="line.685"></a>
+<span class="sourceLineNo">686</span>  private boolean isPeerQuorumAddress(String cmd) {<a name="line.686"></a>
+<span class="sourceLineNo">687</span>    try {<a name="line.687"></a>
+<span class="sourceLineNo">688</span>      ZKConfig.validateClusterKey(cmd);<a name="line.688"></a>
+<span class="sourceLineNo">689</span>    } catch (IOException e) {<a name="line.689"></a>
+<span class="sourceLineNo">690</span>      // not a quorum address<a name="line.690"></a>
+<span class="sourceLineNo">691</span>      return false;<a name="line.691"></a>
+<span class="sourceLineNo">692</span>    }<a name="line.692"></a>
+<span class="sourceLineNo">693</span>    return true;<a name="line.693"></a>
+<span class="sourceLineNo">694</span>  }<a name="line.694"></a>
+<span class="sourceLineNo">695</span><a name="line.695"></a>
+<span class="sourceLineNo">696</span>  /*<a name="line.696"></a>
+<span class="sourceLineNo">697</span>   * @param errorMsg Error message.  Can be null.<a name="line.697"></a>
+<span class="sourceLineNo">698</span>   */<a name="line.698"></a>
+<span class="sourceLineNo">699</span>  private static void printUsage(final String errorMsg) {<a name="line.699"></a>
+<span class="sourceLineNo">700</span>    if (errorMsg != null &amp;&amp; errorMsg.length() &gt; 0) {<a name="line.700"></a>
+<span class="sourceLineNo">701</span>      System.err.println("ERROR: " + errorMsg);<a name="line.701"></a>
+<span class="sourceLineNo">702</span>    }<a name="line.702"></a>
+<span class="sourceLineNo">703</span>    System.err.println("Usage: verifyrep [--starttime=X]"<a name="line.703"></a>
+<span class="sourceLineNo">704</span>        + " [--endtime=Y] [--families=A] [--row-prefixes=B] [--delimiter=] [--recomparesleep=] "<a name="line.704"></a>
+<span class="sourceLineNo">705</span>        + "[--batch=] [--verbose] [--peerTableName=] [--sourceSnapshotName=P] "<a name="line.705"></a>
+<span class="sourceLineNo">706</span>        + "[--sourceSnapshotTmpDir=Q] [--peerSnapshotName=R] [--peerSnapshotTmpDir=S] "<a name="line.706"></a>
+<span class="sourceLineNo">707</span>        + "[--peerFSAddress=T] [--peerHBaseRootAddress=U] &lt;peerid|peerQuorumAddress&gt; &lt;tablename&gt;");<a name="line.707"></a>
+<span class="sourceLineNo">708</span>    System.err.println();<a name="line.708"></a>
+<span class="sourceLineNo">709</span>    System.err.println("Options:");<a name="line.709"></a>
+<span class="sourceLineNo">710</span>    System.err.println(" starttime    beginning of the time range");<a name="line.710"></a>
+<span class="sourceLineNo">711</span>    System.err.println("              without endtime means from starttime to forever");<a name="line.711"></a>
+<span class="sourceLineNo">712</span>    System.err.println(" endtime      end of the time range");<a name="line.712"></a>
+<span class="sourceLineNo">713</span>    System.err.println(" versions     number of cell versions to verify");<a name="line.713"></a>
+<span class="sourceLineNo">714</span>    System.err.println(" batch        batch count for scan, " +<a name="line.714"></a>
+<span class="sourceLineNo">715</span>        "note that result row counts will no longer be actual number of rows when you use this option");<a name="line.715"></a>
+<span class="sourceLineNo">716</span>    System.err.println(" raw          includes raw scan if given in options");<a name="line.716"></a>
+<span class="sourceLineNo">717</span>    System.err.println(" families     comma-separated list of families to copy");<a name="line.717"></a>
+<span class="sourceLineNo">718</span>    System.err.println(" row-prefixes comma-separated list of row key prefixes to filter on ");<a name="line.718"></a>
+<span class="sourceLineNo">719</span>    System.err.println(" delimiter    the delimiter used in display around rowkey");<a name="line.719"></a>
+<span class="sourceLineNo">720</span>    System.err.println(" recomparesleep   milliseconds to sleep before recompare row, " +<a name="line.720"></a>
+<span class="sourceLineNo">721</span>        "default value is 0 which disables the recompare.");<a name="line.721"></a>
+<span class="sourceLineNo">722</span>    System.err.println(" verbose      logs row keys of good rows");<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    System.err.println(" peerTableName  Peer Table Name");<a name="line.723"></a>
+<span class="sourceLineNo">724</span>    System.err.println(" sourceSnapshotName  Source Snapshot Name");<a name="line.724"></a>
+<span class="sourceLineNo">725</span>    System.err.println(" sourceSnapshotTmpDir Tmp location to restore source table snapshot");<a name="line.725"></a>
+<span class="sourceLineNo">726</span>    System.err.println(" peerSnapshotName  Peer Snapshot Name");<a name="line.726"></a>
+<span class="sourceLineNo">727</span>    System.err.println(" peerSnapshotTmpDir Tmp location to restore peer table snapshot");<a name="line.727"></a>
+<span class="sourceLineNo">728</span>    System.err.println(" peerFSAddress      Peer cluster Hadoop FS address");<a name="line.728"></a>
+<span class="sourceLineNo">729</span>    System.err.println(" peerHBaseRootAddress  Peer cluster HBase root location");<a name="line.729"></a>
+<span class="sourceLineNo">730</span>    System.err.println();<a name="line.730"></a>
+<span class="sourceLineNo">731</span>    System.err.println("Args:");<a name="line.731"></a>
+<span class="sourceLineNo">732</span>    System.err.println(" peerid       Id of the peer used for verification, must match the one given for replication");<a name="line.732"></a>
+<span class="sourceLineNo">733</span>    System.err.println(" peerQuorumAddress   quorumAdress of the peer used for verification. The "<a name="line.733"></a>
+<span class="sourceLineNo">734</span>      + "format is zk_quorum:zk_port:zk_hbase_path");<a name="line.734"></a>
+<span class="sourceLineNo">735</span>    System.err.println(" tablename    Name of the table to verify");<a name="line.735"></a>
+<span class="sourceLineNo">736</span>    System.err.println();<a name="line.736"></a>
+<span class="sourceLineNo">737</span>    System.err.println("Examples:");<a name="line.737"></a>
+<span class="sourceLineNo">738</span>    System.err.println(" To verify the data replicated from TestTable for a 1 hour window with peer #5 ");<a name="line.738"></a>
+<span class="sourceLineNo">739</span>    System.err.println(" $ hbase " +<a name="line.739"></a>
+<span class="sourceLineNo">740</span>        "org.apache.hadoop.hbase.mapreduce.replication.VerifyReplication" +<a name="line.740"></a>
+<span class="sourceLineNo">741</span>        " --starttime=1265875194289 --endtime=1265878794289 5 TestTable ");<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>  @Override<a name="line.744"></a>
+<span class="sourceLineNo">745</span>  public int run(String[] args) throws Exception {<a name="line.745"></a>
+<span class="sourceLineNo">746</span>    Configuration conf = this.getConf();<a name="line.746"></a>
+<span class="sourceLineNo">747</span>    Job job = createSubmittableJob(conf, args);<a name="line.747"></a>
+<span class="sourceLineNo">748</span>    if (job != null) {<a name="line.748"></a>
+<span class="sourceLineNo">749</span>      return job.waitForCompletion(true) ? 0 : 1;<a name="line.749"></a>
+<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
+<span class="sourceLineNo">751</span>    return 1;<a name="line.751"></a>
+<span class="sourceLineNo">752</span>  }<a name="line.752"></a>
+<span class="sourceLineNo">753</span><a name="line.753"></a>
+<span class="sourceLineNo">754</span>  /**<a name="line.754"></a>
+<span class="sourceLineNo">755</span>   * Main entry point.<a name="line.755"></a>
+<span class="sourceLineNo">756</span>   *<a name="line.756"></a>
+<span class="sourceLineNo">757</span>   * @param args  The command line parameters.<a name="line.757"></a>
+<span class="sourceLineNo">758</span>   * @throws Exception When running the job fails.<a name="line.758"></a>
+<span class="sourceLineNo">759</span>   */<a name="line.759"></a>
+<span class="sourceLineNo">760</span>  public static void main(String[] args) throws Exception {<a name="line.760"></a>
+<span class="sourceLineNo">761</span>    int res = ToolRunner.run(HBaseConfiguration.create(), new VerifyReplication(), args);<a name="line.761"></a>
+<span class="sourceLineNo">762</span>    System.exit(res);<a name="line.762"></a>
+<span class="sourceLineNo">763</span>  }<a name="line.763"></a>
+<span class="sourceLineNo">764</span>}<a name="line.764"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.html b/devapidocs/src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.html
index 47325cd..b16e963 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.html
@@ -122,638 +122,654 @@
 <span class="sourceLineNo">114</span>  String peerFSAddress = null;<a name="line.114"></a>
 <span class="sourceLineNo">115</span>  //Peer cluster HBase root dir location<a name="line.115"></a>
 <span class="sourceLineNo">116</span>  String peerHBaseRootAddress = null;<a name="line.116"></a>
-<span class="sourceLineNo">117</span><a name="line.117"></a>
-<span class="sourceLineNo">118</span><a name="line.118"></a>
-<span class="sourceLineNo">119</span>  private final static String JOB_NAME_CONF_KEY = "mapreduce.job.name";<a name="line.119"></a>
+<span class="sourceLineNo">117</span>  //Peer Table Name<a name="line.117"></a>
+<span class="sourceLineNo">118</span>  String peerTableName = null;<a name="line.118"></a>
+<span class="sourceLineNo">119</span><a name="line.119"></a>
 <span class="sourceLineNo">120</span><a name="line.120"></a>
-<span class="sourceLineNo">121</span>  /**<a name="line.121"></a>
-<span class="sourceLineNo">122</span>   * Map-only comparator for 2 tables<a name="line.122"></a>
-<span class="sourceLineNo">123</span>   */<a name="line.123"></a>
-<span class="sourceLineNo">124</span>  public static class Verifier<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      extends TableMapper&lt;ImmutableBytesWritable, Put&gt; {<a name="line.125"></a>
-<span class="sourceLineNo">126</span><a name="line.126"></a>
-<span class="sourceLineNo">127</span>    public enum Counters {<a name="line.127"></a>
-<span class="sourceLineNo">128</span>      GOODROWS, BADROWS, ONLY_IN_SOURCE_TABLE_ROWS, ONLY_IN_PEER_TABLE_ROWS, CONTENT_DIFFERENT_ROWS<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    }<a name="line.129"></a>
-<span class="sourceLineNo">130</span><a name="line.130"></a>
-<span class="sourceLineNo">131</span>    private Connection sourceConnection;<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    private Table sourceTable;<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    private Connection replicatedConnection;<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    private Table replicatedTable;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    private ResultScanner replicatedScanner;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    private Result currentCompareRowInPeerTable;<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    private int sleepMsBeforeReCompare;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    private String delimiter = "";<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    private boolean verbose = false;<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    private int batch = -1;<a name="line.140"></a>
-<span class="sourceLineNo">141</span><a name="line.141"></a>
-<span class="sourceLineNo">142</span>    /**<a name="line.142"></a>
-<span class="sourceLineNo">143</span>     * Map method that compares every scanned row with the equivalent from<a name="line.143"></a>
-<span class="sourceLineNo">144</span>     * a distant cluster.<a name="line.144"></a>
-<span class="sourceLineNo">145</span>     * @param row  The current table row key.<a name="line.145"></a>
-<span class="sourceLineNo">146</span>     * @param value  The columns.<a name="line.146"></a>
-<span class="sourceLineNo">147</span>     * @param context  The current context.<a name="line.147"></a>
-<span class="sourceLineNo">148</span>     * @throws IOException When something is broken with the data.<a name="line.148"></a>
-<span class="sourceLineNo">149</span>     */<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    @Override<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    public void map(ImmutableBytesWritable row, final Result value,<a name="line.151"></a>
-<span class="sourceLineNo">152</span>                    Context context)<a name="line.152"></a>
-<span class="sourceLineNo">153</span>        throws IOException {<a name="line.153"></a>
-<span class="sourceLineNo">154</span>      if (replicatedScanner == null) {<a name="line.154"></a>
-<span class="sourceLineNo">155</span>        Configuration conf = context.getConfiguration();<a name="line.155"></a>
-<span class="sourceLineNo">156</span>        sleepMsBeforeReCompare = conf.getInt(NAME +".sleepMsBeforeReCompare", 0);<a name="line.156"></a>
-<span class="sourceLineNo">157</span>        delimiter = conf.get(NAME + ".delimiter", "");<a name="line.157"></a>
-<span class="sourceLineNo">158</span>        verbose = conf.getBoolean(NAME +".verbose", false);<a name="line.158"></a>
-<span class="sourceLineNo">159</span>        batch = conf.getInt(NAME + ".batch", -1);<a name="line.159"></a>
-<span class="sourceLineNo">160</span>        final Scan scan = new Scan();<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        if (batch &gt; 0) {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>          scan.setBatch(batch);<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        }<a name="line.163"></a>
-<span class="sourceLineNo">164</span>        scan.setCacheBlocks(false);<a name="line.164"></a>
-<span class="sourceLineNo">165</span>        scan.setCaching(conf.getInt(TableInputFormat.SCAN_CACHEDROWS, 1));<a name="line.165"></a>
-<span class="sourceLineNo">166</span>        long startTime = conf.getLong(NAME + ".startTime", 0);<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        long endTime = conf.getLong(NAME + ".endTime", Long.MAX_VALUE);<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        String families = conf.get(NAME + ".families", null);<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        if(families != null) {<a name="line.169"></a>
-<span class="sourceLineNo">170</span>          String[] fams = families.split(",");<a name="line.170"></a>
-<span class="sourceLineNo">171</span>          for(String fam : fams) {<a name="line.171"></a>
-<span class="sourceLineNo">172</span>            scan.addFamily(Bytes.toBytes(fam));<a name="line.172"></a>
-<span class="sourceLineNo">173</span>          }<a name="line.173"></a>
-<span class="sourceLineNo">174</span>        }<a name="line.174"></a>
-<span class="sourceLineNo">175</span>        boolean includeDeletedCells = conf.getBoolean(NAME + ".includeDeletedCells", false);<a name="line.175"></a>
-<span class="sourceLineNo">176</span>        scan.setRaw(includeDeletedCells);<a name="line.176"></a>
-<span class="sourceLineNo">177</span>        String rowPrefixes = conf.get(NAME + ".rowPrefixes", null);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>        setRowPrefixFilter(scan, rowPrefixes);<a name="line.178"></a>
-<span class="sourceLineNo">179</span>        scan.setTimeRange(startTime, endTime);<a name="line.179"></a>
-<span class="sourceLineNo">180</span>        int versions = conf.getInt(NAME+".versions", -1);<a name="line.180"></a>
-<span class="sourceLineNo">181</span>        LOG.info("Setting number of version inside map as: " + versions);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>        if (versions &gt;= 0) {<a name="line.182"></a>
-<span class="sourceLineNo">183</span>          scan.setMaxVersions(versions);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>        }<a name="line.184"></a>
-<span class="sourceLineNo">185</span>        TableName tableName = TableName.valueOf(conf.get(NAME + ".tableName"));<a name="line.185"></a>
-<span class="sourceLineNo">186</span>        sourceConnection = ConnectionFactory.createConnection(conf);<a name="line.186"></a>
-<span class="sourceLineNo">187</span>        sourceTable = sourceConnection.getTable(tableName);<a name="line.187"></a>
-<span class="sourceLineNo">188</span><a name="line.188"></a>
-<span class="sourceLineNo">189</span>        final InputSplit tableSplit = context.getInputSplit();<a name="line.189"></a>
+<span class="sourceLineNo">121</span>  private final static String JOB_NAME_CONF_KEY = "mapreduce.job.name";<a name="line.121"></a>
+<span class="sourceLineNo">122</span><a name="line.122"></a>
+<span class="sourceLineNo">123</span>  /**<a name="line.123"></a>
+<span class="sourceLineNo">124</span>   * Map-only comparator for 2 tables<a name="line.124"></a>
+<span class="sourceLineNo">125</span>   */<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  public static class Verifier<a name="line.126"></a>
+<span class="sourceLineNo">127</span>      extends TableMapper&lt;ImmutableBytesWritable, Put&gt; {<a name="line.127"></a>
+<span class="sourceLineNo">128</span><a name="line.128"></a>
+<span class="sourceLineNo">129</span>    public enum Counters {<a name="line.129"></a>
+<span class="sourceLineNo">130</span>      GOODROWS, BADROWS, ONLY_IN_SOURCE_TABLE_ROWS, ONLY_IN_PEER_TABLE_ROWS, CONTENT_DIFFERENT_ROWS<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    }<a name="line.131"></a>
+<span class="sourceLineNo">132</span><a name="line.132"></a>
+<span class="sourceLineNo">133</span>    private Connection sourceConnection;<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    private Table sourceTable;<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    private Connection replicatedConnection;<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    private Table replicatedTable;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    private ResultScanner replicatedScanner;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    private Result currentCompareRowInPeerTable;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    private int sleepMsBeforeReCompare;<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    private String delimiter = "";<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    private boolean verbose = false;<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    private int batch = -1;<a name="line.142"></a>
+<span class="sourceLineNo">143</span><a name="line.143"></a>
+<span class="sourceLineNo">144</span>    /**<a name="line.144"></a>
+<span class="sourceLineNo">145</span>     * Map method that compares every scanned row with the equivalent from<a name="line.145"></a>
+<span class="sourceLineNo">146</span>     * a distant cluster.<a name="line.146"></a>
+<span class="sourceLineNo">147</span>     * @param row  The current table row key.<a name="line.147"></a>
+<span class="sourceLineNo">148</span>     * @param value  The columns.<a name="line.148"></a>
+<span class="sourceLineNo">149</span>     * @param context  The current context.<a name="line.149"></a>
+<span class="sourceLineNo">150</span>     * @throws IOException When something is broken with the data.<a name="line.150"></a>
+<span class="sourceLineNo">151</span>     */<a name="line.151"></a>
+<span class="sourceLineNo">152</span>    @Override<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    public void map(ImmutableBytesWritable row, final Result value,<a name="line.153"></a>
+<span class="sourceLineNo">154</span>                    Context context)<a name="line.154"></a>
+<span class="sourceLineNo">155</span>        throws IOException {<a name="line.155"></a>
+<span class="sourceLineNo">156</span>      if (replicatedScanner == null) {<a name="line.156"></a>
+<span class="sourceLineNo">157</span>        Configuration conf = context.getConfiguration();<a name="line.157"></a>
+<span class="sourceLineNo">158</span>        sleepMsBeforeReCompare = conf.getInt(NAME +".sleepMsBeforeReCompare", 0);<a name="line.158"></a>
+<span class="sourceLineNo">159</span>        delimiter = conf.get(NAME + ".delimiter", "");<a name="line.159"></a>
+<span class="sourceLineNo">160</span>        verbose = conf.getBoolean(NAME +".verbose", false);<a name="line.160"></a>
+<span class="sourceLineNo">161</span>        batch = conf.getInt(NAME + ".batch", -1);<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        final Scan scan = new Scan();<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        if (batch &gt; 0) {<a name="line.163"></a>
+<span class="sourceLineNo">164</span>          scan.setBatch(batch);<a name="line.164"></a>
+<span class="sourceLineNo">165</span>        }<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        scan.setCacheBlocks(false);<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        scan.setCaching(conf.getInt(TableInputFormat.SCAN_CACHEDROWS, 1));<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        long startTime = conf.getLong(NAME + ".startTime", 0);<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        long endTime = conf.getLong(NAME + ".endTime", Long.MAX_VALUE);<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        String families = conf.get(NAME + ".families", null);<a name="line.170"></a>
+<span class="sourceLineNo">171</span>        if(families != null) {<a name="line.171"></a>
+<span class="sourceLineNo">172</span>          String[] fams = families.split(",");<a name="line.172"></a>
+<span class="sourceLineNo">173</span>          for(String fam : fams) {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>            scan.addFamily(Bytes.toBytes(fam));<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>        boolean includeDeletedCells = conf.getBoolean(NAME + ".includeDeletedCells", false);<a name="line.177"></a>
+<span class="sourceLineNo">178</span>        scan.setRaw(includeDeletedCells);<a name="line.178"></a>
+<span class="sourceLineNo">179</span>        String rowPrefixes = conf.get(NAME + ".rowPrefixes", null);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>        setRowPrefixFilter(scan, rowPrefixes);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>        scan.setTimeRange(startTime, endTime);<a name="line.181"></a>
+<span class="sourceLineNo">182</span>        int versions = conf.getInt(NAME+".versions", -1);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>        LOG.info("Setting number of version inside map as: " + versions);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>        if (versions &gt;= 0) {<a name="line.184"></a>
+<span class="sourceLineNo">185</span>          scan.setMaxVersions(versions);<a name="line.185"></a>
+<span class="sourceLineNo">186</span>        }<a name="line.186"></a>
+<span class="sourceLineNo">187</span>        TableName tableName = TableName.valueOf(conf.get(NAME + ".tableName"));<a name="line.187"></a>
+<span class="sourceLineNo">188</span>        sourceConnection = ConnectionFactory.createConnection(conf);<a name="line.188"></a>
+<span class="sourceLineNo">189</span>        sourceTable = sourceConnection.getTable(tableName);<a name="line.189"></a>
 <span class="sourceLineNo">190</span><a name="line.190"></a>
-<span class="sourceLineNo">191</span>        String zkClusterKey = conf.get(NAME + ".peerQuorumAddress");<a name="line.191"></a>
-<span class="sourceLineNo">192</span>        Configuration peerConf = HBaseConfiguration.createClusterConf(conf,<a name="line.192"></a>
-<span class="sourceLineNo">193</span>            zkClusterKey, PEER_CONFIG_PREFIX);<a name="line.193"></a>
-<span class="sourceLineNo">194</span><a name="line.194"></a>
-<span class="sourceLineNo">195</span>        replicatedConnection = ConnectionFactory.createConnection(peerConf);<a name="line.195"></a>
-<span class="sourceLineNo">196</span>        replicatedTable = replicatedConnection.getTable(tableName);<a name="line.196"></a>
-<span class="sourceLineNo">197</span>        scan.setStartRow(value.getRow());<a name="line.197"></a>
-<span class="sourceLineNo">198</span><a name="line.198"></a>
-<span class="sourceLineNo">199</span>        byte[] endRow = null;<a name="line.199"></a>
-<span class="sourceLineNo">200</span>        if (tableSplit instanceof TableSnapshotInputFormat.TableSnapshotRegionSplit) {<a name="line.200"></a>
-<span class="sourceLineNo">201</span>          endRow = ((TableSnapshotInputFormat.TableSnapshotRegionSplit) tableSplit).getRegionInfo()<a name="line.201"></a>
-<span class="sourceLineNo">202</span>              .getEndKey();<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        } else {<a name="line.203"></a>
-<span class="sourceLineNo">204</span>          endRow = ((TableSplit) tableSplit).getEndRow();<a name="line.204"></a>
-<span class="sourceLineNo">205</span>        }<a name="line.205"></a>
-<span class="sourceLineNo">206</span><a name="line.206"></a>
-<span class="sourceLineNo">207</span>        scan.setStopRow(endRow);<a name="line.207"></a>
-<span class="sourceLineNo">208</span><a name="line.208"></a>
-<span class="sourceLineNo">209</span>        String peerSnapshotName = conf.get(NAME + ".peerSnapshotName", null);<a name="line.209"></a>
-<span class="sourceLineNo">210</span>        if (peerSnapshotName != null) {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>          String peerSnapshotTmpDir = conf.get(NAME + ".peerSnapshotTmpDir", null);<a name="line.211"></a>
-<span class="sourceLineNo">212</span>          String peerFSAddress = conf.get(NAME + ".peerFSAddress", null);<a name="line.212"></a>
-<span class="sourceLineNo">213</span>          String peerHBaseRootAddress = conf.get(NAME + ".peerHBaseRootAddress", null);<a name="line.213"></a>
-<span class="sourceLineNo">214</span>          FileSystem.setDefaultUri(peerConf, peerFSAddress);<a name="line.214"></a>
-<span class="sourceLineNo">215</span>          FSUtils.setRootDir(peerConf, new Path(peerHBaseRootAddress));<a name="line.215"></a>
-<span class="sourceLineNo">216</span>          LOG.info("Using peer snapshot:" + peerSnapshotName + " with temp dir:"<a name="line.216"></a>
-<span class="sourceLineNo">217</span>              + peerSnapshotTmpDir + " peer root uri:" + FSUtils.getRootDir(peerConf)<a name="line.217"></a>
-<span class="sourceLineNo">218</span>              + " peerFSAddress:" + peerFSAddress);<a name="line.218"></a>
-<span class="sourceLineNo">219</span><a name="line.219"></a>
-<span class="sourceLineNo">220</span>          replicatedScanner = new TableSnapshotScanner(peerConf, FSUtils.getRootDir(peerConf),<a name="line.220"></a>
-<span class="sourceLineNo">221</span>              new Path(peerFSAddress, peerSnapshotTmpDir), peerSnapshotName, scan, true);<a name="line.221"></a>
-<span class="sourceLineNo">222</span>        } else {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>          replicatedScanner = replicatedTable.getScanner(scan);<a name="line.223"></a>
-<span class="sourceLineNo">224</span>        }<a name="line.224"></a>
-<span class="sourceLineNo">225</span>        currentCompareRowInPeerTable = replicatedScanner.next();<a name="line.225"></a>
-<span class="sourceLineNo">226</span>      }<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      while (true) {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>        if (currentCompareRowInPeerTable == null) {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>          // reach the region end of peer table, row only in source table<a name="line.229"></a>
-<span class="sourceLineNo">230</span>          logFailRowAndIncreaseCounter(context, Counters.ONLY_IN_SOURCE_TABLE_ROWS, value);<a name="line.230"></a>
-<span class="sourceLineNo">231</span>          break;<a name="line.231"></a>
-<span class="sourceLineNo">232</span>        }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>        int rowCmpRet = Bytes.compareTo(value.getRow(), currentCompareRowInPeerTable.getRow());<a name="line.233"></a>
-<span class="sourceLineNo">234</span>        if (rowCmpRet == 0) {<a name="line.234"></a>
-<span class="sourceLineNo">235</span>          // rowkey is same, need to compare the content of the row<a name="line.235"></a>
-<span class="sourceLineNo">236</span>          try {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>            Result.compareResults(value, currentCompareRowInPeerTable);<a name="line.237"></a>
-<span class="sourceLineNo">238</span>            context.getCounter(Counters.GOODROWS).increment(1);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>            if (verbose) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>              LOG.info("Good row key: " + delimiter<a name="line.240"></a>
-<span class="sourceLineNo">241</span>                  + Bytes.toStringBinary(value.getRow()) + delimiter);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>            }<a name="line.242"></a>
-<span class="sourceLineNo">243</span>          } catch (Exception e) {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>            logFailRowAndIncreaseCounter(context, Counters.CONTENT_DIFFERENT_ROWS, value);<a name="line.244"></a>
-<span class="sourceLineNo">245</span>          }<a name="line.245"></a>
-<span class="sourceLineNo">246</span>          currentCompareRowInPeerTable = replicatedScanner.next();<a name="line.246"></a>
-<span class="sourceLineNo">247</span>          break;<a name="line.247"></a>
-<span class="sourceLineNo">248</span>        } else if (rowCmpRet &lt; 0) {<a name="line.248"></a>
-<span class="sourceLineNo">249</span>          // row only exists in source table<a name="line.249"></a>
-<span class="sourceLineNo">250</span>          logFailRowAndIncreaseCounter(context, Counters.ONLY_IN_SOURCE_TABLE_ROWS, value);<a name="line.250"></a>
+<span class="sourceLineNo">191</span>        final InputSplit tableSplit = context.getInputSplit();<a name="line.191"></a>
+<span class="sourceLineNo">192</span><a name="line.192"></a>
+<span class="sourceLineNo">193</span>        String zkClusterKey = conf.get(NAME + ".peerQuorumAddress");<a name="line.193"></a>
+<span class="sourceLineNo">194</span>        Configuration peerConf = HBaseConfiguration.createClusterConf(conf,<a name="line.194"></a>
+<span class="sourceLineNo">195</span>            zkClusterKey, PEER_CONFIG_PREFIX);<a name="line.195"></a>
+<span class="sourceLineNo">196</span><a name="line.196"></a>
+<span class="sourceLineNo">197</span>        String peerName = peerConf.get(NAME + ".peerTableName", tableName.getNameAsString());<a name="line.197"></a>
+<span class="sourceLineNo">198</span>        TableName peerTableName = TableName.valueOf(peerName);<a name="line.198"></a>
+<span class="sourceLineNo">199</span>        replicatedConnection = ConnectionFactory.createConnection(peerConf);<a name="line.199"></a>
+<span class="sourceLineNo">200</span>        replicatedTable = replicatedConnection.getTable(peerTableName);<a name="line.200"></a>
+<span class="sourceLineNo">201</span>        scan.setStartRow(value.getRow());<a name="line.201"></a>
+<span class="sourceLineNo">202</span><a name="line.202"></a>
+<span class="sourceLineNo">203</span>        byte[] endRow = null;<a name="line.203"></a>
+<span class="sourceLineNo">204</span>        if (tableSplit instanceof TableSnapshotInputFormat.TableSnapshotRegionSplit) {<a name="line.204"></a>
+<span class="sourceLineNo">205</span>          endRow = ((TableSnapshotInputFormat.TableSnapshotRegionSplit) tableSplit).getRegionInfo()<a name="line.205"></a>
+<span class="sourceLineNo">206</span>              .getEndKey();<a name="line.206"></a>
+<span class="sourceLineNo">207</span>        } else {<a name="line.207"></a>
+<span class="sourceLineNo">208</span>          endRow = ((TableSplit) tableSplit).getEndRow();<a name="line.208"></a>
+<span class="sourceLineNo">209</span>        }<a name="line.209"></a>
+<span class="sourceLineNo">210</span><a name="line.210"></a>
+<span class="sourceLineNo">211</span>        scan.setStopRow(endRow);<a name="line.211"></a>
+<span class="sourceLineNo">212</span><a name="line.212"></a>
+<span class="sourceLineNo">213</span>        String peerSnapshotName = conf.get(NAME + ".peerSnapshotName", null);<a name="line.213"></a>
+<span class="sourceLineNo">214</span>        if (peerSnapshotName != null) {<a name="line.214"></a>
+<span class="sourceLineNo">215</span>          String peerSnapshotTmpDir = conf.get(NAME + ".peerSnapshotTmpDir", null);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>          String peerFSAddress = conf.get(NAME + ".peerFSAddress", null);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>          String peerHBaseRootAddress = conf.get(NAME + ".peerHBaseRootAddress", null);<a name="line.217"></a>
+<span class="sourceLineNo">218</span>          FileSystem.setDefaultUri(peerConf, peerFSAddress);<a name="line.218"></a>
+<span class="sourceLineNo">219</span>          FSUtils.setRootDir(peerConf, new Path(peerHBaseRootAddress));<a name="line.219"></a>
+<span class="sourceLineNo">220</span>          LOG.info("Using peer snapshot:" + peerSnapshotName + " with temp dir:"<a name="line.220"></a>
+<span class="sourceLineNo">221</span>              + peerSnapshotTmpDir + " peer root uri:" + FSUtils.getRootDir(peerConf)<a name="line.221"></a>
+<span class="sourceLineNo">222</span>              + " peerFSAddress:" + peerFSAddress);<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>          replicatedScanner = new TableSnapshotScanner(peerConf, FSUtils.getRootDir(peerConf),<a name="line.224"></a>
+<span class="sourceLineNo">225</span>              new Path(peerFSAddress, peerSnapshotTmpDir), peerSnapshotName, scan, true);<a name="line.225"></a>
+<span class="sourceLineNo">226</span>        } else {<a name="line.226"></a>
+<span class="sourceLineNo">227</span>          replicatedScanner = replicatedTable.getScanner(scan);<a name="line.227"></a>
+<span class="sourceLineNo">228</span>        }<a name="line.228"></a>
+<span class="sourceLineNo">229</span>        currentCompareRowInPeerTable = replicatedScanner.next();<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      }<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      while (true) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        if (currentCompareRowInPeerTable == null) {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>          // reach the region end of peer table, row only in source table<a name="line.233"></a>
+<span class="sourceLineNo">234</span>          logFailRowAndIncreaseCounter(context, Counters.ONLY_IN_SOURCE_TABLE_ROWS, value);<a name="line.234"></a>
+<span class="sourceLineNo">235</span>          break;<a name="line.235"></a>
+<span class="sourceLineNo">236</span>        }<a name="line.236"></a>
+<span class="sourceLineNo">237</span>        int rowCmpRet = Bytes.compareTo(value.getRow(), currentCompareRowInPeerTable.getRow());<a name="line.237"></a>
+<span class="sourceLineNo">238</span>        if (rowCmpRet == 0) {<a name="line.238"></a>
+<span class="sourceLineNo">239</span>          // rowkey is same, need to compare the content of the row<a name="line.239"></a>
+<span class="sourceLineNo">240</span>          try {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>            Result.compareResults(value, currentCompareRowInPeerTable);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>            context.getCounter(Counters.GOODROWS).increment(1);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>            if (verbose) {<a name="line.243"></a>
+<span class="sourceLineNo">244</span>              LOG.info("Good row key: " + delimiter<a name="line.244"></a>
+<span class="sourceLineNo">245</span>                  + Bytes.toStringBinary(value.getRow()) + delimiter);<a name="line.245"></a>
+<span class="sourceLineNo">246</span>            }<a name="line.246"></a>
+<span class="sourceLineNo">247</span>          } catch (Exception e) {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>            logFailRowAndIncreaseCounter(context, Counters.CONTENT_DIFFERENT_ROWS, value);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>          }<a name="line.249"></a>
+<span class="sourceLineNo">250</span>          currentCompareRowInPeerTable = replicatedScanner.next();<a name="line.250"></a>
 <span class="sourceLineNo">251</span>          break;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>        } else {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>          // row only exists in peer table<a name="line.253"></a>
-<span class="sourceLineNo">254</span>          logFailRowAndIncreaseCounter(context, Counters.ONLY_IN_PEER_TABLE_ROWS,<a name="line.254"></a>
-<span class="sourceLineNo">255</span>            currentCompareRowInPeerTable);<a name="line.255"></a>
-<span class="sourceLineNo">256</span>          currentCompareRowInPeerTable = replicatedScanner.next();<a name="line.256"></a>
-<span class="sourceLineNo">257</span>        }<a name="line.257"></a>
-<span class="sourceLineNo">258</span>      }<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    }<a name="line.259"></a>
-<span class="sourceLineNo">260</span><a name="line.260"></a>
-<span class="sourceLineNo">261</span>    private void logFailRowAndIncreaseCounter(Context context, Counters counter, Result row) {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>      if (sleepMsBeforeReCompare &gt; 0) {<a name="line.262"></a>
-<span class="sourceLineNo">263</span>        Threads.sleep(sleepMsBeforeReCompare);<a name="line.263"></a>
-<span class="sourceLineNo">264</span>        try {<a name="line.264"></a>
-<span class="sourceLineNo">265</span>          Result sourceResult = sourceTable.get(new Get(row.getRow()));<a name="line.265"></a>
-<span class="sourceLineNo">266</span>          Result replicatedResult = replicatedTable.get(new Get(row.getRow()));<a name="line.266"></a>
-<span class="sourceLineNo">267</span>          Result.compareResults(sourceResult, replicatedResult);<a name="line.267"></a>
-<span class="sourceLineNo">268</span>          if (!sourceResult.isEmpty()) {<a name="line.268"></a>
-<span class="sourceLineNo">269</span>            context.getCounter(Counters.GOODROWS).increment(1);<a name="line.269"></a>
-<span class="sourceLineNo">270</span>            if (verbose) {<a name="line.270"></a>
-<span class="sourceLineNo">271</span>              LOG.info("Good row key (with recompare): " + delimiter + Bytes.toStringBinary(row.getRow())<a name="line.271"></a>
-<span class="sourceLineNo">272</span>              + delimiter);<a name="line.272"></a>
-<span class="sourceLineNo">273</span>            }<a name="line.273"></a>
-<span class="sourceLineNo">274</span>          }<a name="line.274"></a>
-<span class="sourceLineNo">275</span>          return;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>        } catch (Exception e) {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>          LOG.error("recompare fail after sleep, rowkey=" + delimiter +<a name="line.277"></a>
-<span class="sourceLineNo">278</span>              Bytes.toStringBinary(row.getRow()) + delimiter);<a name="line.278"></a>
-<span class="sourceLineNo">279</span>        }<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      }<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      context.getCounter(counter).increment(1);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      context.getCounter(Counters.BADROWS).increment(1);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      LOG.error(counter.toString() + ", rowkey=" + delimiter + Bytes.toStringBinary(row.getRow()) +<a name="line.283"></a>
-<span class="sourceLineNo">284</span>          delimiter);<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    }<a name="line.285"></a>
-<span class="sourceLineNo">286</span><a name="line.286"></a>
-<span class="sourceLineNo">287</span>    @Override<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    protected void cleanup(Context context) {<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      if (replicatedScanner != null) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>        try {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>          while (currentCompareRowInPeerTable != null) {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>            logFailRowAndIncreaseCounter(context, Counters.ONLY_IN_PEER_TABLE_ROWS,<a name="line.292"></a>
-<span class="sourceLineNo">293</span>              currentCompareRowInPeerTable);<a name="line.293"></a>
-<span class="sourceLineNo">294</span>            currentCompareRowInPeerTable = replicatedScanner.next();<a name="line.294"></a>
-<span class="sourceLineNo">295</span>          }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>        } catch (Exception e) {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>          LOG.error("fail to scan peer table in cleanup", e);<a name="line.297"></a>
-<span class="sourceLineNo">298</span>        } finally {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>          replicatedScanner.close();<a name="line.299"></a>
-<span class="sourceLineNo">300</span>          replicatedScanner = null;<a name="line.300"></a>
-<span class="sourceLineNo">301</span>        }<a name="line.301"></a>
-<span class="sourceLineNo">302</span>      }<a name="line.302"></a>
-<span class="sourceLineNo">303</span><a name="line.303"></a>
-<span class="sourceLineNo">304</span>      if (sourceTable != null) {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>        try {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>          sourceTable.close();<a name="line.306"></a>
-<span class="sourceLineNo">307</span>        } catch (IOException e) {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>          LOG.error("fail to close source table in cleanup", e);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>        }<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      }<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      if(sourceConnection != null){<a name="line.311"></a>
-<span class="sourceLineNo">312</span>        try {<a name="line.312"></a>
-<span class="sourceLineNo">313</span>          sourceConnection.close();<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        } catch (Exception e) {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>          LOG.error("fail to close source connection in cleanup", e);<a name="line.315"></a>
-<span class="sourceLineNo">316</span>        }<a name="line.316"></a>
-<span class="sourceLineNo">317</span>      }<a name="line.317"></a>
-<span class="sourceLineNo">318</span><a name="line.318"></a>
-<span class="sourceLineNo">319</span>      if(replicatedTable != null){<a name="line.319"></a>
-<span class="sourceLineNo">320</span>        try{<a name="line.320"></a>
-<span class="sourceLineNo">321</span>          replicatedTable.close();<a name="line.321"></a>
-<span class="sourceLineNo">322</span>        } catch (Exception e) {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>          LOG.error("fail to close replicated table in cleanup", e);<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>      if(replicatedConnection != null){<a name="line.326"></a>
-<span class="sourceLineNo">327</span>        try {<a name="line.327"></a>
-<span class="sourceLineNo">328</span>          replicatedConnection.close();<a name="line.328"></a>
-<span class="sourceLineNo">329</span>        } catch (Exception e) {<a name="line.329"></a>
-<span class="sourceLineNo">330</span>          LOG.error("fail to close replicated connection in cleanup", e);<a name="line.330"></a>
-<span class="sourceLineNo">331</span>        }<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      }<a name="line.332"></a>
-<span class="sourceLineNo">333</span>    }<a name="line.333"></a>
-<span class="sourceLineNo">334</span>  }<a name="line.334"></a>
-<span class="sourceLineNo">335</span><a name="line.335"></a>
-<span class="sourceLineNo">336</span>  private static Pair&lt;ReplicationPeerConfig, Configuration&gt; getPeerQuorumConfig(<a name="line.336"></a>
-<span class="sourceLineNo">337</span>      final Configuration conf, String peerId) throws IOException {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    ZKWatcher localZKW = null;<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    try {<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      localZKW = new ZKWatcher(conf, "VerifyReplication", new Abortable() {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>        @Override<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        public void abort(String why, Throwable e) {<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">252</span>        } else if (rowCmpRet &lt; 0) {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>          // row only exists in source table<a name="line.253"></a>
+<span class="sourceLineNo">254</span>          logFailRowAndIncreaseCounter(context, Counters.ONLY_IN_SOURCE_TABLE_ROWS, value);<a name="line.254"></a>
+<span class="sourceLineNo">255</span>          break;<a name="line.255"></a>
+<span class="sourceLineNo">256</span>        } else {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>          // row only exists in peer table<a name="line.257"></a>
+<span class="sourceLineNo">258</span>          logFailRowAndIncreaseCounter(context, Counters.ONLY_IN_PEER_TABLE_ROWS,<a name="line.258"></a>
+<span class="sourceLineNo">259</span>            currentCompareRowInPeerTable);<a name="line.259"></a>
+<span class="sourceLineNo">260</span>          currentCompareRowInPeerTable = replicatedScanner.next();<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        }<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      }<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    }<a name="line.263"></a>
+<span class="sourceLineNo">264</span><a name="line.264"></a>
+<span class="sourceLineNo">265</span>    private void logFailRowAndIncreaseCounter(Context context, Counters counter, Result row) {<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      if (sleepMsBeforeReCompare &gt; 0) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>        Threads.sleep(sleepMsBeforeReCompare);<a name="line.267"></a>
+<span class="sourceLineNo">268</span>        try {<a name="line.268"></a>
+<span class="sourceLineNo">269</span>          Result sourceResult = sourceTable.get(new Get(row.getRow()));<a name="line.269"></a>
+<span class="sourceLineNo">270</span>          Result replicatedResult = replicatedTable.get(new Get(row.getRow()));<a name="line.270"></a>
+<span class="sourceLineNo">271</span>          Result.compareResults(sourceResult, replicatedResult);<a name="line.271"></a>
+<span class="sourceLineNo">272</span>          if (!sourceResult.isEmpty()) {<a name="line.272"></a>
+<span class="sourceLineNo">273</span>            context.getCounter(Counters.GOODROWS).increment(1);<a name="line.273"></a>
+<span class="sourceLineNo">274</span>            if (verbose) {<a name="line.274"></a>
+<span class="sourceLineNo">275</span>              LOG.info("Good row key (with recompare): " + delimiter + Bytes.toStringBinary(row.getRow())<a name="line.275"></a>
+<span class="sourceLineNo">276</span>              + delimiter);<a name="line.276"></a>
+<span class="sourceLineNo">277</span>            }<a name="line.277"></a>
+<span class="sourceLineNo">278</span>          }<a name="line.278"></a>
+<span class="sourceLineNo">279</span>          return;<a name="line.279"></a>
+<span class="sourceLineNo">280</span>        } catch (Exception e) {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>          LOG.error("recompare fail after sleep, rowkey=" + delimiter +<a name="line.281"></a>
+<span class="sourceLineNo">282</span>              Bytes.toStringBinary(row.getRow()) + delimiter);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>        }<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      }<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      context.getCounter(counter).increment(1);<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      context.getCounter(Counters.BADROWS).increment(1);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      LOG.error(counter.toString() + ", rowkey=" + delimiter + Bytes.toStringBinary(row.getRow()) +<a name="line.287"></a>
+<span class="sourceLineNo">288</span>          delimiter);<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>    @Override<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    protected void cleanup(Context context) {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      if (replicatedScanner != null) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        try {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>          while (currentCompareRowInPeerTable != null) {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>            logFailRowAndIncreaseCounter(context, Counters.ONLY_IN_PEER_TABLE_ROWS,<a name="line.296"></a>
+<span class="sourceLineNo">297</span>              currentCompareRowInPeerTable);<a name="line.297"></a>
+<span class="sourceLineNo">298</span>            currentCompareRowInPeerTable = replicatedScanner.next();<a name="line.298"></a>
+<span class="sourceLineNo">299</span>          }<a name="line.299"></a>
+<span class="sourceLineNo">300</span>        } catch (Exception e) {<a name="line.300"></a>
+<span class="sourceLineNo">301</span>          LOG.error("fail to scan peer table in cleanup", e);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>        } finally {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>          replicatedScanner.close();<a name="line.303"></a>
+<span class="sourceLineNo">304</span>          replicatedScanner = null;<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>      if (sourceTable != null) {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>        try {<a name="line.309"></a>
+<span class="sourceLineNo">310</span>          sourceTable.close();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>        } catch (IOException e) {<a name="line.311"></a>
+<span class="sourceLineNo">312</span>          LOG.error("fail to close source table in cleanup", e);<a name="line.312"></a>
+<span class="sourceLineNo">313</span>        }<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      }<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      if(sourceConnection != null){<a name="line.315"></a>
+<span class="sourceLineNo">316</span>        try {<a name="line.316"></a>
+<span class="sourceLineNo">317</span>          sourceConnection.close();<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        } catch (Exception e) {<a name="line.318"></a>
+<span class="sourceLineNo">319</span>          LOG.error("fail to close source connection in cleanup", e);<a name="line.319"></a>
+<span class="sourceLineNo">320</span>        }<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      }<a name="line.321"></a>
+<span class="sourceLineNo">322</span><a name="line.322"></a>
+<span class="sourceLineNo">323</span>      if(replicatedTable != null){<a name="line.323"></a>
+<span class="sourceLineNo">324</span>        try{<a name="line.324"></a>
+<span class="sourceLineNo">325</span>          replicatedTable.close();<a name="line.325"></a>
+<span class="sourceLineNo">326</span>        } catch (Exception e) {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>          LOG.error("fail to close replicated table in cleanup", e);<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>      if(replicatedConnection != null){<a name="line.330"></a>
+<span class="sourceLineNo">331</span>        try {<a name="line.331"></a>
+<span class="sourceLineNo">332</span>          replicatedConnection.close();<a name="line.332"></a>
+<span class="sourceLineNo">333</span>        } catch (Exception e) {<a name="line.333"></a>
+<span class="sourceLineNo">334</span>          LOG.error("fail to close replicated connection in cleanup", e);<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>  }<a name="line.338"></a>
+<span class="sourceLineNo">339</span><a name="line.339"></a>
+<span class="sourceLineNo">340</span>  private static Pair&lt;ReplicationPeerConfig, Configuration&gt; getPeerQuorumConfig(<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      final Configuration conf, String peerId) throws IOException {<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    ZKWatcher localZKW = null;<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    try {<a name="line.343"></a>
+<span class="sourceLineNo">344</span>      localZKW = new ZKWatcher(conf, "VerifyReplication", new Abortable() {<a name="line.344"></a>
 <span class="sourceLineNo">345</span>        @Override<a name="line.345"></a>
-<span class="sourceLineNo">346</span>        public boolean isAborted() {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>          return false;<a name="line.347"></a>
-<span class="sourceLineNo">348</span>        }<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      });<a name="line.349"></a>
-<span class="sourceLineNo">350</span>      ReplicationPeerStorage storage =<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        ReplicationStorageFactory.getReplicationPeerStorage(localZKW, conf);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      ReplicationPeerConfig peerConfig = storage.getPeerConfig(peerId);<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      return Pair.newPair(peerConfig,<a name="line.353"></a>
-<span class="sourceLineNo">354</span>        ReplicationUtils.getPeerClusterConfiguration(peerConfig, conf));<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    } catch (ReplicationException e) {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      throw new IOException("An error occurred while trying to connect to the remote peer cluster",<a name="line.356"></a>
-<span class="sourceLineNo">357</span>          e);<a name="line.357"></a>
-<span class="sourceLineNo">358</span>    } finally {<a name="line.358"></a>
-<span class="sourceLineNo">359</span>      if (localZKW != null) {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        localZKW.close();<a name="line.360"></a>
-<span class="sourceLineNo">361</span>      }<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    }<a name="line.362"></a>
-<span class="sourceLineNo">363</span>  }<a name="line.363"></a>
-<span class="sourceLineNo">364</span><a name="line.364"></a>
-<span class="sourceLineNo">365</span>  private void restoreSnapshotForPeerCluster(Configuration conf, String peerQuorumAddress)<a name="line.365"></a>
-<span class="sourceLineNo">366</span>      throws IOException {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    Configuration peerConf =<a name="line.367"></a>
-<span class="sourceLineNo">368</span>        HBaseConfiguration.createClusterConf(conf, peerQuorumAddress, PEER_CONFIG_PREFIX);<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    FileSystem.setDefaultUri(peerConf, peerFSAddress);<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    FSUtils.setRootDir(peerConf, new Path(peerFSAddress, peerHBaseRootAddress));<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    FileSystem fs = FileSystem.get(peerConf);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    RestoreSnapshotHelper.copySnapshotForScanner(peerConf, fs, FSUtils.getRootDir(peerConf),<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      new Path(peerFSAddress, peerSnapshotTmpDir), peerSnapshotName);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>  }<a name="line.374"></a>
-<span class="sourceLineNo">375</span><a name="line.375"></a>
-<span class="sourceLineNo">376</span>  /**<a name="line.376"></a>
-<span class="sourceLineNo">377</span>   * Sets up the actual job.<a name="line.377"></a>
-<span class="sourceLineNo">378</span>   *<a name="line.378"></a>
-<span class="sourceLineNo">379</span>   * @param conf  The current configuration.<a name="line.379"></a>
-<span class="sourceLineNo">380</span>   * @param args  The command line parameters.<a name="line.380"></a>
-<span class="sourceLineNo">381</span>   * @return The newly created job.<a name="line.381"></a>
-<span class="sourceLineNo">382</span>   * @throws java.io.IOException When setting up the job fails.<a name="line.382"></a>
-<span class="sourceLineNo">383</span>   */<a name="line.383"></a>
-<span class="sourceLineNo">384</span>  public Job createSubmittableJob(Configuration conf, String[] args)<a name="line.384"></a>
-<span class="sourceLineNo">385</span>  throws IOException {<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    if (!doCommandLine(args)) {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      return null;<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    }<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    conf.set(NAME+".tableName", tableName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    conf.setLong(NAME+".startTime", startTime);<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    conf.setLong(NAME+".endTime", endTime);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    conf.setInt(NAME +".sleepMsBeforeReCompare", sleepMsBeforeReCompare);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    conf.set(NAME + ".delimiter", delimiter);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    conf.setInt(NAME + ".batch", batch);<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    conf.setBoolean(NAME +".verbose", verbose);<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    conf.setBoolean(NAME +".includeDeletedCells", includeDeletedCells);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    if (families != null) {<a name="line.397"></a>
-<span class="sourceLineNo">398</span>      conf.set(NAME+".families", families);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    }<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    if (rowPrefixes != null){<a name="line.400"></a>
-<span class="sourceLineNo">401</span>      conf.set(NAME+".rowPrefixes", rowPrefixes);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    }<a name="line.402"></a>
-<span class="sourceLineNo">403</span><a name="line.403"></a>
-<span class="sourceLineNo">404</span>    String peerQuorumAddress;<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    Pair&lt;ReplicationPeerConfig, Configuration&gt; peerConfigPair = null;<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    if (peerId != null) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      peerConfigPair = getPeerQuorumConfig(conf, peerId);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      ReplicationPeerConfig peerConfig = peerConfigPair.getFirst();<a name="line.408"></a>
-<span class="sourceLineNo">409</span>      peerQuorumAddress = peerConfig.getClusterKey();<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      LOG.info("Peer Quorum Address: " + peerQuorumAddress + ", Peer Configuration: " +<a name="line.410"></a>
-<span class="sourceLineNo">411</span>        peerConfig.getConfiguration());<a name="line.411"></a>
-<span class="sourceLineNo">412</span>      conf.set(NAME + ".peerQuorumAddress", peerQuorumAddress);<a name="line.412"></a>
-<span class="sourceLineNo">413</span>      HBaseConfiguration.setWithPrefix(conf, PEER_CONFIG_PREFIX,<a name="line.413"></a>
-<span class="sourceLineNo">414</span>        peerConfig.getConfiguration().entrySet());<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    } else {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>      assert this.peerQuorumAddress != null;<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      peerQuorumAddress = this.peerQuorumAddress;<a name="line.417"></a>
-<span class="sourceLineNo">418</span>      LOG.info("Peer Quorum Address: " + peerQuorumAddress);<a name="line.418"></a>
-<span class="sourceLineNo">419</span>      conf.set(NAME + ".peerQuorumAddress", peerQuorumAddress);<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    }<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>    conf.setInt(NAME + ".versions", versions);<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    LOG.info("Number of version: " + versions);<a name="line.423"></a>
-<span class="sourceLineNo">424</span><a name="line.424"></a>
-<span class="sourceLineNo">425</span>    //Set Snapshot specific parameters<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    if (peerSnapshotName != null) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      conf.set(NAME + ".peerSnapshotName", peerSnapshotName);<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>      // for verifyRep by snapshot, choose a unique sub-directory under peerSnapshotTmpDir to<a name="line.429"></a>
-<span class="sourceLineNo">430</span>      // restore snapshot.<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      Path restoreDir = new Path(peerSnapshotTmpDir, UUID.randomUUID().toString());<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      peerSnapshotTmpDir = restoreDir.toString();<a name="line.432"></a>
-<span class="sourceLineNo">433</span>      conf.set(NAME + ".peerSnapshotTmpDir", peerSnapshotTmpDir);<a name="line.433"></a>
-<span class="sourceLineNo">434</span><a name="line.434"></a>
-<span class="sourceLineNo">435</span>      conf.set(NAME + ".peerFSAddress", peerFSAddress);<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      conf.set(NAME + ".peerHBaseRootAddress", peerHBaseRootAddress);<a name="line.436"></a>
+<span class="sourceLineNo">346</span>        public void abort(String why, Throwable e) {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>        }<a name="line.347"></a>
+<span class="sourceLineNo">348</span><a name="line.348"></a>
+<span class="sourceLineNo">349</span>        @Override<a name="line.349"></a>
+<span class="sourceLineNo">350</span>        public boolean isAborted() {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>          return false;<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>      ReplicationPeerStorage storage =<a name="line.354"></a>
+<span class="sourceLineNo">355</span>        ReplicationStorageFactory.getReplicationPeerStorage(localZKW, conf);<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      ReplicationPeerConfig peerConfig = storage.getPeerConfig(peerId);<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      return Pair.newPair(peerConfig,<a name="line.357"></a>
+<span class="sourceLineNo">358</span>        ReplicationUtils.getPeerClusterConfiguration(peerConfig, conf));<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    } catch (ReplicationException e) {<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      throw new IOException("An error occurred while trying to connect to the remote peer cluster",<a name="line.360"></a>
+<span class="sourceLineNo">361</span>          e);<a name="line.361"></a>
+<span class="sourceLineNo">362</span>    } finally {<a name="line.362"></a>
+<span class="sourceLineNo">363</span>      if (localZKW != null) {<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        localZKW.close();<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>  }<a name="line.367"></a>
+<span class="sourceLineNo">368</span><a name="line.368"></a>
+<span class="sourceLineNo">369</span>  private void restoreSnapshotForPeerCluster(Configuration conf, String peerQuorumAddress)<a name="line.369"></a>
+<span class="sourceLineNo">370</span>      throws IOException {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    Configuration peerConf =<a name="line.371"></a>
+<span class="sourceLineNo">372</span>        HBaseConfiguration.createClusterConf(conf, peerQuorumAddress, PEER_CONFIG_PREFIX);<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    FileSystem.setDefaultUri(peerConf, peerFSAddress);<a name="line.373"></a>
+<span class="sourceLineNo">374</span>    FSUtils.setRootDir(peerConf, new Path(peerFSAddress, peerHBaseRootAddress));<a name="line.374"></a>
+<span class="sourceLineNo">375</span>    FileSystem fs = FileSystem.get(peerConf);<a name="line.375"></a>
+<span class="sourceLineNo">376</span>    RestoreSnapshotHelper.copySnapshotForScanner(peerConf, fs, FSUtils.getRootDir(peerConf),<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      new Path(peerFSAddress, peerSnapshotTmpDir), peerSnapshotName);<a name="line.377"></a>
+<span class="sourceLineNo">378</span>  }<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>  /**<a name="line.380"></a>
+<span class="sourceLineNo">381</span>   * Sets up the actual job.<a name="line.381"></a>
+<span class="sourceLineNo">382</span>   *<a name="line.382"></a>
+<span class="sourceLineNo">383</span>   * @param conf  The current configuration.<a name="line.383"></a>
+<span class="sourceLineNo">384</span>   * @param args  The command line parameters.<a name="line.384"></a>
+<span class="sourceLineNo">385</span>   * @return The newly created job.<a name="line.385"></a>
+<span class="sourceLineNo">386</span>   * @throws java.io.IOException When setting up the job fails.<a name="line.386"></a>
+<span class="sourceLineNo">387</span>   */<a name="line.387"></a>
+<span class="sourceLineNo">388</span>  public Job createSubmittableJob(Configuration conf, String[] args)<a name="line.388"></a>
+<span class="sourceLineNo">389</span>  throws IOException {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    if (!doCommandLine(args)) {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      return null;<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    conf.set(NAME+".tableName", tableName);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>    conf.setLong(NAME+".startTime", startTime);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    conf.setLong(NAME+".endTime", endTime);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    conf.setInt(NAME +".sleepMsBeforeReCompare", sleepMsBeforeReCompare);<a name="line.396"></a>
+<span class="sourceLineNo">397</span>    conf.set(NAME + ".delimiter", delimiter);<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    conf.setInt(NAME + ".batch", batch);<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    conf.setBoolean(NAME +".verbose", verbose);<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    conf.setBoolean(NAME +".includeDeletedCells", includeDeletedCells);<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    if (families != null) {<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      conf.set(NAME+".families", families);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    if (rowPrefixes != null){<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      conf.set(NAME+".rowPrefixes", rowPrefixes);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    }<a name="line.406"></a>
+<span class="sourceLineNo">407</span><a name="line.407"></a>
+<span class="sourceLineNo">408</span>    String peerQuorumAddress;<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    Pair&lt;ReplicationPeerConfig, Configuration&gt; peerConfigPair = null;<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    if (peerId != null) {<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      peerConfigPair = getPeerQuorumConfig(conf, peerId);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      ReplicationPeerConfig peerConfig = peerConfigPair.getFirst();<a name="line.412"></a>
+<span class="sourceLineNo">413</span>      peerQuorumAddress = peerConfig.getClusterKey();<a name="line.413"></a>
+<span class="sourceLineNo">414</span>      LOG.info("Peer Quorum Address: " + peerQuorumAddress + ", Peer Configuration: " +<a name="line.414"></a>
+<span class="sourceLineNo">415</span>        peerConfig.getConfiguration());<a name="line.415"></a>
+<span class="sourceLineNo">416</span>      conf.set(NAME + ".peerQuorumAddress", peerQuorumAddress);<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      HBaseConfiguration.setWithPrefix(conf, PEER_CONFIG_PREFIX,<a name="line.417"></a>
+<span class="sourceLineNo">418</span>        peerConfig.getConfiguration().entrySet());<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    } else {<a name="line.419"></a>
+<span class="sourceLineNo">420</span>      assert this.peerQuorumAddress != null;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>      peerQuorumAddress = this.peerQuorumAddress;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>      LOG.info("Peer Quorum Address: " + peerQuorumAddress);<a name="line.422"></a>
+<span class="sourceLineNo">423</span>      conf.set(NAME + ".peerQuorumAddress", peerQuorumAddress);<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    }<a name="line.424"></a>
+<span class="sourceLineNo">425</span><a name="line.425"></a>
+<span class="sourceLineNo">426</span>    if (peerTableName != null) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>      LOG.info("Peer Table Name: " + peerTableName);<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      conf.set(NAME + ".peerTableName", peerTableName);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>    }<a name="line.429"></a>
+<span class="sourceLineNo">430</span><a name="line.430"></a>
+<span class="sourceLineNo">431</span>    conf.setInt(NAME + ".versions", versions);<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    LOG.info("Number of version: " + versions);<a name="line.432"></a>
+<span class="sourceLineNo">433</span><a name="line.433"></a>
+<span class="sourceLineNo">434</span>    //Set Snapshot specific parameters<a name="line.434"></a>
+<span class="sourceLineNo">435</span>    if (peerSnapshotName != null) {<a name="line.435"></a>
+<span class="sourceLineNo">436</span>      conf.set(NAME + ".peerSnapshotName", peerSnapshotName);<a name="line.436"></a>
 <span class="sourceLineNo">437</span><a name="line.437"></a>
-<span class="sourceLineNo">438</span>      // This is to create HDFS delegation token for peer cluster in case of secured<a name="line.438"></a>
-<span class="sourceLineNo">439</span>      conf.setStrings(MRJobConfig.JOB_NAMENODES, peerFSAddress, conf.get(HConstants.HBASE_DIR));<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    }<a name="line.440"></a>
-<span class="sourceLineNo">441</span><a name="line.441"></a>
-<span class="sourceLineNo">442</span>    Job job = Job.getInstance(conf, conf.get(JOB_NAME_CONF_KEY, NAME + "_" + tableName));<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    job.setJarByClass(VerifyReplication.class);<a name="line.443"></a>
-<span class="sourceLineNo">444</span><a name="line.444"></a>
-<span class="sourceLineNo">445</span>    Scan scan = new Scan();<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    scan.setTimeRange(startTime, endTime);<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    scan.setRaw(includeDeletedCells);<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    scan.setCacheBlocks(false);<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    if (batch &gt; 0) {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>      scan.setBatch(batch);<a name="line.450"></a>
-<span class="sourceLineNo">451</span>    }<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    if (versions &gt;= 0) {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      scan.setMaxVersions(versions);<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      LOG.info("Number of versions set to " + versions);<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    }<a name="line.455"></a>
-<span class="sourceLineNo">456</span>    if(families != null) {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      String[] fams = families.split(",");<a name="line.457"></a>
-<span class="sourceLineNo">458</span>      for(String fam : fams) {<a name="line.458"></a>
-<span class="sourceLineNo">459</span>        scan.addFamily(Bytes.toBytes(fam));<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><a name="line.462"></a>
-<span class="sourceLineNo">463</span>    setRowPrefixFilter(scan, rowPrefixes);<a name="line.463"></a>
-<span class="sourceLineNo">464</span><a name="line.464"></a>
-<span class="sourceLineNo">465</span>    if (sourceSnapshotName != null) {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      Path snapshotTempPath = new Path(sourceSnapshotTmpDir);<a name="line.466"></a>
-<span class="sourceLineNo">467</span>      LOG.info(<a name="line.467"></a>
-<span class="sourceLineNo">468</span>        "Using source snapshot-" + sourceSnapshotName + " with temp dir:" + sourceSnapshotTmpDir);<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      TableMapReduceUtil.initTableSnapshotMapperJob(sourceSnapshotName, scan, Verifier.class, null,<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        null, job, true, snapshotTempPath);<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      restoreSnapshotForPeerCluster(conf, peerQuorumAddress);<a name="line.471"></a>
-<span class="sourceLineNo">472</span>    } else {<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      TableMapReduceUtil.initTableMapperJob(tableName, scan, Verifier.class, null, null, job);<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
-<span class="sourceLineNo">475</span><a name="line.475"></a>
-<span class="sourceLineNo">476</span>    if (peerId != null) {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      assert peerConfigPair != null;<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      Configuration peerClusterConf = peerConfigPair.getSecond();<a name="line.478"></a>
-<span class="sourceLineNo">479</span>      // Obtain the auth token from peer cluster<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      TableMapReduceUtil.initCredentialsForCluster(job, peerClusterConf);<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
-<span class="sourceLineNo">482</span><a name="line.482"></a>
-<span class="sourceLineNo">483</span>    job.setOutputFormatClass(NullOutputFormat.class);<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    job.setNumReduceTasks(0);<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    return job;<a name="line.485"></a>
-<span class="sourceLineNo">486</span>  }<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>  private static void setRowPrefixFilter(Scan scan, String rowPrefixes) {<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    if (rowPrefixes != null &amp;&amp; !rowPrefixes.isEmpty()) {<a name="line.489"></a>
-<span class="sourceLineNo">490</span>      String[] rowPrefixArray = rowPrefixes.split(",");<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      Arrays.sort(rowPrefixArray);<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ONE);<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      for (String prefix : rowPrefixArray) {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        Filter filter = new PrefixFilter(Bytes.toBytes(prefix));<a name="line.494"></a>
-<span class="sourceLineNo">495</span>        filterList.addFilter(filter);<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      }<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      scan.setFilter(filterList);<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      byte[] startPrefixRow = Bytes.toBytes(rowPrefixArray[0]);<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      byte[] lastPrefixRow = Bytes.toBytes(rowPrefixArray[rowPrefixArray.length -1]);<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      setStartAndStopRows(scan, startPrefixRow, lastPrefixRow);<a name="line.500"></a>
-<span class="sourceLineNo">501</span>    }<a name="line.501"></a>
-<span class="sourceLineNo">502</span>  }<a name="line.502"></a>
-<span class="sourceLineNo">503</span><a name="line.503"></a>
-<span class="sourceLineNo">504</span>  private static void setStartAndStopRows(Scan scan, byte[] startPrefixRow, byte[] lastPrefixRow) {<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    scan.setStartRow(startPrefixRow);<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    byte[] stopRow = Bytes.add(Bytes.head(lastPrefixRow, lastPrefixRow.length - 1),<a name="line.506"></a>
-<span class="sourceLineNo">507</span>        new byte[]{(byte) (lastPrefixRow[lastPrefixRow.length - 1] + 1)});<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    scan.setStopRow(stopRow);<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>  @VisibleForTesting<a name="line.511"></a>
-<span class="sourceLineNo">512</span>  public boolean doCommandLine(final String[] args) {<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    if (args.length &lt; 2) {<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      printUsage(null);<a name="line.514"></a>
-<span class="sourceLineNo">515</span>      return false;<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    }<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    try {<a name="line.517"></a>
-<span class="sourceLineNo">518</span>      for (int i = 0; i &lt; args.length; i++) {<a name="line.518"></a>
-<span class="sourceLineNo">519</span>        String cmd = args[i];<a name="line.519"></a>
-<span class="sourceLineNo">520</span>        if (cmd.equals("-h") || cmd.startsWith("--h")) {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>          printUsage(null);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          return false;<a name="line.522"></a>
-<span class="sourceLineNo">523</span>        }<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>        final String startTimeArgKey = "--starttime=";<a name="line.525"></a>
-<span class="sourceLineNo">526</span>        if (cmd.startsWith(startTimeArgKey)) {<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          startTime = Long.parseLong(cmd.substring(startTimeArgKey.length()));<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          continue;<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>        final String endTimeArgKey = "--endtime=";<a name="line.531"></a>
-<span class="sourceLineNo">532</span>        if (cmd.startsWith(endTimeArgKey)) {<a name="line.532"></a>
-<span class="sourceLineNo">533</span>          endTime = Long.parseLong(cmd.substring(endTimeArgKey.length()));<a name="line.533"></a>
-<span class="sourceLineNo">534</span>          continue;<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>        final String includeDeletedCellsArgKey = "--raw";<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        if (cmd.equals(includeDeletedCellsArgKey)) {<a name="line.538"></a>
-<span class="sourceLineNo">539</span>          includeDeletedCells = true;<a name="line.539"></a>
-<span class="sourceLineNo">540</span>          continue;<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        }<a name="line.541"></a>
-<span class="sourceLineNo">542</span><a name="line.542"></a>
-<span class="sourceLineNo">543</span>        final String versionsArgKey = "--versions=";<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        if (cmd.startsWith(versionsArgKey)) {<a name="line.544"></a>
-<span class="sourceLineNo">545</span>          versions = Integer.parseInt(cmd.substring(versionsArgKey.length()));<a name="line.545"></a>
-<span class="sourceLineNo">546</span>          continue;<a name="line.546"></a>
-<span class="sourceLineNo">547</span>        }<a name="line.547"></a>
-<span class="sourceLineNo">548</span><a name="line.548"></a>
-<span class="sourceLineNo">549</span>        final String batchArgKey = "--batch=";<a name="line.549"></a>
-<span class="sourceLineNo">550</span>        if (cmd.startsWith(batchArgKey)) {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>          batch = Integer.parseInt(cmd.substring(batchArgKey.length()));<a name="line.551"></a>
-<span class="sourceLineNo">552</span>          continue;<a name="line.552"></a>
-<span class="sourceLineNo">553</span>        }<a name="line.553"></a>
-<span class="sourceLineNo">554</span><a name="line.554"></a>
-<span class="sourceLineNo">555</span>        final String familiesArgKey = "--families=";<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        if (cmd.startsWith(familiesArgKey)) {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>          families = cmd.substring(familiesArgKey.length());<a name="line.557"></a>
-<span class="sourceLineNo">558</span>          continue;<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>        final String rowPrefixesKey = "--row-prefixes=";<a name="line.561"></a>
-<span class="sourceLineNo">562</span>        if (cmd.startsWith(rowPrefixesKey)){<a name="line.562"></a>
-<span class="sourceLineNo">563</span>          rowPrefixes = cmd.substring(rowPrefixesKey.length());<a name="line.563"></a>
-<span class="sourceLineNo">564</span>          continue;<a name="line.564"></a>
-<span class="sourceLineNo">565</span>        }<a name="line.565"></a>
-<span class="sourceLineNo">566</span><a name="line.566"></a>
-<span class="sourceLineNo">567</span>        final String delimiterArgKey = "--delimiter=";<a name="line.567"></a>
-<span class="sourceLineNo">568</span>        if (cmd.startsWith(delimiterArgKey)) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>          delimiter = cmd.substring(delimiterArgKey.length());<a name="line.569"></a>
-<span class="sourceLineNo">570</span>          continue;<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>        final String sleepToReCompareKey = "--recomparesleep=";<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        if (cmd.startsWith(sleepToReCompareKey)) {<a name="line.574"></a>
-<span class="sourceLineNo">575</span>          sleepMsBeforeReCompare = Integer.parseInt(cmd.substring(sleepToReCompareKey.length()));<a name="line.575"></a>
-<span class="sourceLineNo">576</span>          continue;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        }<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        final String verboseKey = "--verbose";<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        if (cmd.startsWith(verboseKey)) {<a name="line.579"></a>
-<span class="sourceLineNo">580</span>          verbose = true;<a name="line.580"></a>
-<span class="sourceLineNo">581</span>          continue;<a name="line.581"></a>
-<span class="sourceLineNo">582</span>        }<a name="line.582"></a>
-<span class="sourceLineNo">583</span><a name="line.583"></a>
-<span class="sourceLineNo">584</span>        final String sourceSnapshotNameArgKey = "--sourceSnapshotName=";<a name="line.584"></a>
-<span class="sourceLineNo">585</span>        if (cmd.startsWith(sourceSnapshotNameArgKey)) {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>          sourceSnapshotName = cmd.substring(sourceSnapshotNameArgKey.length());<a name="line.586"></a>
-<span class="sourceLineNo">587</span>          continue;<a name="line.587"></a>
-<span class="sourceLineNo">588</span>        }<a name="line.588"></a>
-<span class="sourceLineNo">589</span><a name="line.589"></a>
-<span class="sourceLineNo">590</span>        final String sourceSnapshotTmpDirArgKey = "--sourceSnapshotTmpDir=";<a name="line.590"></a>
-<span class="sourceLineNo">591</span>        if (cmd.startsWith(sourceSnapshotTmpDirArgKey)) {<a name="line.591"></a>
-<span class="sourceLineNo">592</span>          sourceSnapshotTmpDir = cmd.substring(sourceSnapshotTmpDirArgKey.length());<a name="line.592"></a>
-<span class="sourceLineNo">593</span>          continue;<a name="line.593"></a>
-<span class="sourceLineNo">594</span>        }<a name="line.594"></a>
-<span class="sourceLineNo">595</span><a name="line.595"></a>
-<span class="sourceLineNo">596</span>        final String peerSnapshotNameArgKey = "--peerSnapshotName=";<a name="line.596"></a>
-<span class="sourceLineNo">597</span>        if (cmd.startsWith(peerSnapshotNameArgKey)) {<a name="line.597"></a>
-<span class="sourceLineNo">598</span>          peerSnapshotName = cmd.substring(peerSnapshotNameArgKey.length());<a name="line.598"></a>
-<span class="sourceLineNo">599</span>          continue;<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>        final String peerSnapshotTmpDirArgKey = "--peerSnapshotTmpDir=";<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        if (cmd.startsWith(peerSnapshotTmpDirArgKey)) {<a name="line.603"></a>
-<span class="sourceLineNo">604</span>          peerSnapshotTmpDir = cmd.substring(peerSnapshotTmpDirArgKey.length());<a name="line.604"></a>
-<span class="sourceLineNo">605</span>          continue;<a name="line.605"></a>
-<span class="sourceLineNo">606</span>        }<a name="line.606"></a>
-<span class="sourceLineNo">607</span><a name="line.607"></a>
-<span class="sourceLineNo">608</span>        final String peerFSAddressArgKey = "--peerFSAddress=";<a name="line.608"></a>
-<span class="sourceLineNo">609</span>        if (cmd.startsWith(peerFSAddressArgKey)) {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>          peerFSAddress = cmd.substring(peerFSAddressArgKey.length());<a name="line.610"></a>
-<span class="sourceLineNo">611</span>          continue;<a name="line.611"></a>
-<span class="sourceLineNo">612</span>        }<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>        final String peerHBaseRootAddressArgKey = "--peerHBaseRootAddress=";<a name="line.614"></a>
-<span class="sourceLineNo">615</span>        if (cmd.startsWith(peerHBaseRootAddressArgKey)) {<a name="line.615"></a>
-<span class="sourceLineNo">616</span>          peerHBaseRootAddress = cmd.substring(peerHBaseRootAddressArgKey.length());<a name="line.616"></a>
-<span class="sourceLineNo">617</span>          continue;<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>        if (cmd.startsWith("--")) {<a name="line.620"></a>
-<span class="sourceLineNo">621</span>          printUsage("Invalid argument '" + cmd + "'");<a name="line.621"></a>
-<span class="sourceLineNo">622</span>          return false;<a name="line.622"></a>
-<span class="sourceLineNo">623</span>        }<a name="line.623"></a>
-<span class="sourceLineNo">624</span><a name="line.624"></a>
-<span class="sourceLineNo">625</span>        if (i == args.length-2) {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>          if (isPeerQuorumAddress(cmd)) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>            peerQuorumAddress = cmd;<a name="line.627"></a>
-<span class="sourceLineNo">628</span>          } else {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>            peerId = cmd;<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>        if (i == args.length-1) {<a name="line.633"></a>
-<span class="sourceLineNo">634</span>          tableName = cmd;<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>      if ((sourceSnapshotName != null &amp;&amp; sourceSnapshotTmpDir == null)<a name="line.638"></a>
-<span class="sourceLineNo">639</span>          || (sourceSnapshotName == null &amp;&amp; sourceSnapshotTmpDir != null)) {<a name="line.639"></a>
-<span class="sourceLineNo">640</span>        printUsage("Source snapshot name and snapshot temp location should be provided"<a name="line.640"></a>
-<span class="sourceLineNo">641</span>            + " to use snapshots in source cluster");<a name="line.641"></a>
-<span class="sourceLineNo">642</span>        return false;<a name="line.642"></a>
-<span class="sourceLineNo">643</span>      }<a name="line.643"></a>
-<span class="sourceLineNo">644</span><a name="line.644"></a>
-<span class="sourceLineNo">645</span>      if (peerSnapshotName != null || peerSnapshotTmpDir != null || peerFSAddress != null<a name="line.645"></a>
-<span class="sourceLineNo">646</span>          || peerHBaseRootAddress != null) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>        if (peerSnapshotName == null || peerSnapshotTmpDir == null || peerFSAddress == null<a name="line.647"></a>
-<span class="sourceLineNo">648</span>            || peerHBaseRootAddress == null) {<a name="line.648"></a>
-<span class="sourceLineNo">649</span>          printUsage(<a name="line.649"></a>
-<span class="sourceLineNo">650</span>            "Peer snapshot name, peer snapshot temp location, Peer HBase root address and  "<a name="line.650"></a>
-<span class="sourceLineNo">651</span>                + "peer FSAddress should be provided to use snapshots in peer cluster");<a name="line.651"></a>
-<span class="sourceLineNo">652</span>          return false;<a name="line.652"></a>
-<span class="sourceLineNo">653</span>        }<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      }<a name="line.654"></a>
-<span class="sourceLineNo">655</span><a name="line.655"></a>
-<span class="sourceLineNo">656</span>      // This is to avoid making recompare calls to source/peer tables when snapshots are used<a name="line.656"></a>
-<span class="sourceLineNo">657</span>      if ((sourceSnapshotName != null || peerSnapshotName != null) &amp;&amp; sleepMsBeforeReCompare &gt; 0) {<a name="line.657"></a>
-<span class="sourceLineNo">658</span>        printUsage(<a name="line.658"></a>
-<span class="sourceLineNo">659</span>          "Using sleepMsBeforeReCompare along with snapshots is not allowed as snapshots are immutable");<a name="line.659"></a>
-<span class="sourceLineNo">660</span>        return false;<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>    } catch (Exception e) {<a name="line.663"></a>
-<span class="sourceLineNo">664</span>      LOG.error("Failed to parse commandLine arguments", e);<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      printUsage("Can't start because " + e.getMessage());<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      return false;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    }<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    return true;<a name="line.668"></a>
-<span class="sourceLineNo">669</span>  }<a name="line.669"></a>
+<span class="sourceLineNo">438</span>      // for verifyRep by snapshot, choose a unique sub-directory under peerSnapshotTmpDir to<a name="line.438"></a>
+<span class="sourceLineNo">439</span>      // restore snapshot.<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      Path restoreDir = new Path(peerSnapshotTmpDir, UUID.randomUUID().toString());<a name="line.440"></a>
+<span class="sourceLineNo">441</span>      peerSnapshotTmpDir = restoreDir.toString();<a name="line.441"></a>
+<span class="sourceLineNo">442</span>      conf.set(NAME + ".peerSnapshotTmpDir", peerSnapshotTmpDir);<a name="line.442"></a>
+<span class="sourceLineNo">443</span><a name="line.443"></a>
+<span class="sourceLineNo">444</span>      conf.set(NAME + ".peerFSAddress", peerFSAddress);<a name="line.444"></a>
+<span class="sourceLineNo">445</span>      conf.set(NAME + ".peerHBaseRootAddress", peerHBaseRootAddress);<a name="line.445"></a>
+<span class="sourceLineNo">446</span><a name="line.446"></a>
+<span class="sourceLineNo">447</span>      // This is to create HDFS delegation token for peer cluster in case of secured<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      conf.setStrings(MRJobConfig.JOB_NAMENODES, peerFSAddress, conf.get(HConstants.HBASE_DIR));<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>    Job job = Job.getInstance(conf, conf.get(JOB_NAME_CONF_KEY, NAME + "_" + tableName));<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    job.setJarByClass(VerifyReplication.class);<a name="line.452"></a>
+<span class="sourceLineNo">453</span><a name="line.453"></a>
+<span class="sourceLineNo">454</span>    Scan scan = new Scan();<a name="line.454"></a>
+<span class="sourceLineNo">455</span>    scan.setTimeRange(startTime, endTime);<a name="line.455"></a>
+<span class="sourceLineNo">456</span>    scan.setRaw(includeDeletedCells);<a name="line.456"></a>
+<span class="sourceLineNo">457</span>    scan.setCacheBlocks(false);<a name="line.457"></a>
+<span class="sourceLineNo">458</span>    if (batch &gt; 0) {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>      scan.setBatch(batch);<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    }<a name="line.460"></a>
+<span class="sourceLineNo">461</span>    if (versions &gt;= 0) {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      scan.setMaxVersions(versions);<a name="line.462"></a>
+<span class="sourceLineNo">463</span>      LOG.info("Number of versions set to " + versions);<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    }<a name="line.464"></a>
+<span class="sourceLineNo">465</span>    if(families != null) {<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      String[] fams = families.split(",");<a name="line.466"></a>
+<span class="sourceLineNo">467</span>      for(String fam : fams) {<a name="line.467"></a>
+<span class="sourceLineNo">468</span>        scan.addFamily(Bytes.toBytes(fam));<a name="line.468"></a>
+<span class="sourceLineNo">469</span>      }<a name="line.469"></a>
+<span class="sourceLineNo">470</span>    }<a name="line.470"></a>
+<span class="sourceLineNo">471</span><a name="line.471"></a>
+<span class="sourceLineNo">472</span>    setRowPrefixFilter(scan, rowPrefixes);<a name="line.472"></a>
+<span class="sourceLineNo">473</span><a name="line.473"></a>
+<span class="sourceLineNo">474</span>    if (sourceSnapshotName != null) {<a name="line.474"></a>
+<span class="sourceLineNo">475</span>      Path snapshotTempPath = new Path(sourceSnapshotTmpDir);<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      LOG.info(<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        "Using source snapshot-" + sourceSnapshotName + " with temp dir:" + sourceSnapshotTmpDir);<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      TableMapReduceUtil.initTableSnapshotMapperJob(sourceSnapshotName, scan, Verifier.class, null,<a name="line.478"></a>
+<span class="sourceLineNo">479</span>        null, job, true, snapshotTempPath);<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      restoreSnapshotForPeerCluster(conf, peerQuorumAddress);<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    } else {<a name="line.481"></a>
+<span class="sourceLineNo">482</span>      TableMapReduceUtil.initTableMapperJob(tableName, scan, Verifier.class, null, null, job);<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    }<a name="line.483"></a>
+<span class="sourceLineNo">484</span><a name="line.484"></a>
+<span class="sourceLineNo">485</span>    if (peerId != null) {<a name="line.485"></a>
+<span class="sourceLineNo">486</span>      assert peerConfigPair != null;<a name="line.486"></a>
+<span class="sourceLineNo">487</span>      Configuration peerClusterConf = peerConfigPair.getSecond();<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      // Obtain the auth token from peer cluster<a name="line.488"></a>
+<span class="sourceLineNo">489</span>      TableMapReduceUtil.initCredentialsForCluster(job, peerClusterConf);<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    }<a name="line.490"></a>
+<span class="sourceLineNo">491</span><a name="line.491"></a>
+<span class="sourceLineNo">492</span>    job.setOutputFormatClass(NullOutputFormat.class);<a name="line.492"></a>
+<span class="sourceLineNo">493</span>    job.setNumReduceTasks(0);<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    return job;<a name="line.494"></a>
+<span class="sourceLineNo">495</span>  }<a name="line.495"></a>
+<span class="sourceLineNo">496</span><a name="line.496"></a>
+<span class="sourceLineNo">497</span>  private static void setRowPrefixFilter(Scan scan, String rowPrefixes) {<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    if (rowPrefixes != null &amp;&amp; !rowPrefixes.isEmpty()) {<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      String[] rowPrefixArray = rowPrefixes.split(",");<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      Arrays.sort(rowPrefixArray);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ONE);<a name="line.501"></a>
+<span class="sourceLineNo">502</span>      for (String prefix : rowPrefixArray) {<a name="line.502"></a>
+<span class="sourceLineNo">503</span>        Filter filter = new PrefixFilter(Bytes.toBytes(prefix));<a name="line.503"></a>
+<span class="sourceLineNo">504</span>        filterList.addFilter(filter);<a name="line.504"></a>
+<span class="sourceLineNo">505</span>      }<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      scan.setFilter(filterList);<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      byte[] startPrefixRow = Bytes.toBytes(rowPrefixArray[0]);<a name="line.507"></a>
+<span class="sourceLineNo">508</span>      byte[] lastPrefixRow = Bytes.toBytes(rowPrefixArray[rowPrefixArray.length -1]);<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      setStartAndStopRows(scan, startPrefixRow, lastPrefixRow);<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    }<a name="line.510"></a>
+<span class="sourceLineNo">511</span>  }<a name="line.511"></a>
+<span class="sourceLineNo">512</span><a name="line.512"></a>
+<span class="sourceLineNo">513</span>  private static void setStartAndStopRows(Scan scan, byte[] startPrefixRow, byte[] lastPrefixRow) {<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    scan.setStartRow(startPrefixRow);<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    byte[] stopRow = Bytes.add(Bytes.head(lastPrefixRow, lastPrefixRow.length - 1),<a name="line.515"></a>
+<span class="sourceLineNo">516</span>        new byte[]{(byte) (lastPrefixRow[lastPrefixRow.length - 1] + 1)});<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    scan.setStopRow(stopRow);<a name="line.517"></a>
+<span class="sourceLineNo">518</span>  }<a name="line.518"></a>
+<span class="sourceLineNo">519</span><a name="line.519"></a>
+<span class="sourceLineNo">520</span>  @VisibleForTesting<a name="line.520"></a>
+<span class="sourceLineNo">521</span>  public boolean doCommandLine(final String[] args) {<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    if (args.length &lt; 2) {<a name="line.522"></a>
+<span class="sourceLineNo">523</span>      printUsage(null);<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      return false;<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    }<a name="line.525"></a>
+<span class="sourceLineNo">526</span>    try {<a name="line.526"></a>
+<span class="sourceLineNo">527</span>      for (int i = 0; i &lt; args.length; i++) {<a name="line.527"></a>
+<span class="sourceLineNo">528</span>        String cmd = args[i];<a name="line.528"></a>
+<span class="sourceLineNo">529</span>        if (cmd.equals("-h") || cmd.startsWith("--h")) {<a name="line.529"></a>
+<span class="sourceLineNo">530</span>          printUsage(null);<a name="line.530"></a>
+<span class="sourceLineNo">531</span>          return false;<a name="line.531"></a>
+<span class="sourceLineNo">532</span>        }<a name="line.532"></a>
+<span class="sourceLineNo">533</span><a name="line.533"></a>
+<span class="sourceLineNo">534</span>        final String startTimeArgKey = "--starttime=";<a name="line.534"></a>
+<span class="sourceLineNo">535</span>        if (cmd.startsWith(startTimeArgKey)) {<a name="line.535"></a>
+<span class="sourceLineNo">536</span>          startTime = Long.parseLong(cmd.substring(startTimeArgKey.length()));<a name="line.536"></a>
+<span class="sourceLineNo">537</span>          continue;<a name="line.537"></a>
+<span class="sourceLineNo">538</span>        }<a name="line.538"></a>
+<span class="sourceLineNo">539</span><a name="line.539"></a>
+<span class="sourceLineNo">540</span>        final String endTimeArgKey = "--endtime=";<a name="line.540"></a>
+<span class="sourceLineNo">541</span>        if (cmd.startsWith(endTimeArgKey)) {<a name="line.541"></a>
+<span class="sourceLineNo">542</span>          endTime = Long.parseLong(cmd.substring(endTimeArgKey.length()));<a name="line.542"></a>
+<span class="sourceLineNo">543</span>          continue;<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>        final String includeDeletedCellsArgKey = "--raw";<a name="line.546"></a>
+<span class="sourceLineNo">547</span>        if (cmd.equals(includeDeletedCellsArgKey)) {<a name="line.547"></a>
+<span class="sourceLineNo">548</span>          includeDeletedCells = true;<a name="line.548"></a>
+<span class="sourceLineNo">549</span>          continue;<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>        final String versionsArgKey = "--versions=";<a name="line.552"></a>
+<span class="sourceLineNo">553</span>        if (cmd.startsWith(versionsArgKey)) {<a name="line.553"></a>
+<span class="sourceLineNo">554</span>          versions = Integer.parseInt(cmd.substring(versionsArgKey.length()));<a name="line.554"></a>
+<span class="sourceLineNo">555</span>          continue;<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>        final String batchArgKey = "--batch=";<a name="line.558"></a>
+<span class="sourceLineNo">559</span>        if (cmd.startsWith(batchArgKey)) {<a name="line.559"></a>
+<span class="sourceLineNo">560</span>          batch = Integer.parseInt(cmd.substring(batchArgKey.length()));<a name="line.560"></a>
+<span class="sourceLineNo">561</span>          continue;<a name="line.561"></a>
+<span class="sourceLineNo">562</span>        }<a name="line.562"></a>
+<span class="sourceLineNo">563</span><a name="line.563"></a>
+<span class="sourceLineNo">564</span>        final String familiesArgKey = "--families=";<a name="line.564"></a>
+<span class="sourceLineNo">565</span>        if (cmd.startsWith(familiesArgKey)) {<a name="line.565"></a>
+<span class="sourceLineNo">566</span>          families = cmd.substring(familiesArgKey.length());<a name="line.566"></a>
+<span class="sourceLineNo">567</span>          continue;<a name="line.567"></a>
+<span class="sourceLineNo">568</span>        }<a name="line.568"></a>
+<span class="sourceLineNo">569</span><a name="line.569"></a>
+<span class="sourceLineNo">570</span>        final String rowPrefixesKey = "--row-prefixes=";<a name="line.570"></a>
+<span class="sourceLineNo">571</span>        if (cmd.startsWith(rowPrefixesKey)){<a name="line.571"></a>
+<span class="sourceLineNo">572</span>          rowPrefixes = cmd.substring(rowPrefixesKey.length());<a name="line.572"></a>
+<span class="sourceLineNo">573</span>          continue;<a name="line.573"></a>
+<span class="sourceLineNo">574</span>        }<a name="line.574"></a>
+<span class="sourceLineNo">575</span><a name="line.575"></a>
+<span class="sourceLineNo">576</span>        final String delimiterArgKey = "--delimiter=";<a name="line.576"></a>
+<span class="sourceLineNo">577</span>        if (cmd.startsWith(delimiterArgKey)) {<a name="line.577"></a>
+<span class="sourceLineNo">578</span>          delimiter = cmd.substring(delimiterArgKey.length());<a name="line.578"></a>
+<span class="sourceLineNo">579</span>          continue;<a name="line.579"></a>
+<span class="sourceLineNo">580</span>        }<a name="line.580"></a>
+<span class="sourceLineNo">581</span><a name="line.581"></a>
+<span class="sourceLineNo">582</span>        final String sleepToReCompareKey = "--recomparesleep=";<a name="line.582"></a>
+<span class="sourceLineNo">583</span>        if (cmd.startsWith(sleepToReCompareKey)) {<a name="line.583"></a>
+<span class="sourceLineNo">584</span>          sleepMsBeforeReCompare = Integer.parseInt(cmd.substring(sleepToReCompareKey.length()));<a name="line.584"></a>
+<span class="sourceLineNo">585</span>          continue;<a name="line.585"></a>
+<span class="sourceLineNo">586</span>        }<a name="line.586"></a>
+<span class="sourceLineNo">587</span>        final String verboseKey = "--verbose";<a name="line.587"></a>
+<span class="sourceLineNo">588</span>        if (cmd.startsWith(verboseKey)) {<a name="line.588"></a>
+<span class="sourceLineNo">589</span>          verbose = true;<a name="line.589"></a>
+<span class="sourceLineNo">590</span>          continue;<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>        final String sourceSnapshotNameArgKey = "--sourceSnapshotName=";<a name="line.593"></a>
+<span class="sourceLineNo">594</span>        if (cmd.startsWith(sourceSnapshotNameArgKey)) {<a name="line.594"></a>
+<span class="sourceLineNo">595</span>          sourceSnapshotName = cmd.substring(sourceSnapshotNameArgKey.length());<a name="line.595"></a>
+<span class="sourceLineNo">596</span>          continue;<a name="line.596"></a>
+<span class="sourceLineNo">597</span>        }<a name="line.597"></a>
+<span class="sourceLineNo">598</span><a name="line.598"></a>
+<span class="sourceLineNo">599</span>        final String sourceSnapshotTmpDirArgKey = "--sourceSnapshotTmpDir=";<a name="line.599"></a>
+<span class="sourceLineNo">600</span>        if (cmd.startsWith(sourceSnapshotTmpDirArgKey)) {<a name="line.600"></a>
+<span class="sourceLineNo">601</span>          sourceSnapshotTmpDir = cmd.substring(sourceSnapshotTmpDirArgKey.length());<a name="line.601"></a>
+<span class="sourceLineNo">602</span>          continue;<a name="line.602"></a>
+<span class="sourceLineNo">603</span>        }<a name="line.603"></a>
+<span class="sourceLineNo">604</span><a name="line.604"></a>
+<span class="sourceLineNo">605</span>        final String peerSnapshotNameArgKey = "--peerSnapshotName=";<a name="line.605"></a>
+<span class="sourceLineNo">606</span>        if (cmd.startsWith(peerSnapshotNameArgKey)) {<a name="line.606"></a>
+<span class="sourceLineNo">607</span>          peerSnapshotName = cmd.substring(peerSnapshotNameArgKey.length());<a name="line.607"></a>
+<span class="sourceLineNo">608</span>          continue;<a name="line.608"></a>
+<span class="sourceLineNo">609</span>        }<a name="line.609"></a>
+<span class="sourceLineNo">610</span><a name="line.610"></a>
+<span class="sourceLineNo">611</span>        final String peerSnapshotTmpDirArgKey = "--peerSnapshotTmpDir=";<a name="line.611"></a>
+<span class="sourceLineNo">612</span>        if (cmd.startsWith(peerSnapshotTmpDirArgKey)) {<a name="line.612"></a>
+<span class="sourceLineNo">613</span>          peerSnapshotTmpDir = cmd.substring(peerSnapshotTmpDirArgKey.length());<a name="line.613"></a>
+<span class="sourceLineNo">614</span>          continue;<a name="line.614"></a>
+<span class="sourceLineNo">615</span>        }<a name="line.615"></a>
+<span class="sourceLineNo">616</span><a name="line.616"></a>
+<span class="sourceLineNo">617</span>        final String peerFSAddressArgKey = "--peerFSAddress=";<a name="line.617"></a>
+<span class="sourceLineNo">618</span>        if (cmd.startsWith(peerFSAddressArgKey)) {<a name="line.618"></a>
+<span class="sourceLineNo">619</span>          peerFSAddress = cmd.substring(peerFSAddressArgKey.length());<a name="line.619"></a>
+<span class="sourceLineNo">620</span>          continue;<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>        final String peerHBaseRootAddressArgKey = "--peerHBaseRootAddress=";<a name="line.623"></a>
+<span class="sourceLineNo">624</span>        if (cmd.startsWith(peerHBaseRootAddressArgKey)) {<a name="line.624"></a>
+<span class="sourceLineNo">625</span>          peerHBaseRootAddress = cmd.substring(peerHBaseRootAddressArgKey.length());<a name="line.625"></a>
+<span class="sourceLineNo">626</span>          continue;<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>        final String peerTableNameArgKey = "--peerTableName=";<a name="line.629"></a>
+<span class="sourceLineNo">630</span>        if (cmd.startsWith(peerTableNameArgKey)) {<a name="line.630"></a>
+<span class="sourceLineNo">631</span>          peerTableName = cmd.substring(peerTableNameArgKey.length());<a name="line.631"></a>
+<span class="sourceLineNo">632</span>          continue;<a name="line.632"></a>
+<span class="sourceLineNo">633</span>        }<a name="line.633"></a>
+<span class="sourceLineNo">634</span><a name="line.634"></a>
+<span class="sourceLineNo">635</span>        if (cmd.startsWith("--")) {<a name="line.635"></a>
+<span class="sourceLineNo">636</span>          printUsage("Invalid argument '" + cmd + "'");<a name="line.636"></a>
+<span class="sourceLineNo">637</span>          return false;<a name="line.637"></a>
+<span class="sourceLineNo">638</span>        }<a name="line.638"></a>
+<span class="sourceLineNo">639</span><a name="line.639"></a>
+<span class="sourceLineNo">640</span>        if (i == args.length-2) {<a name="line.640"></a>
+<span class="sourceLineNo">641</span>          if (isPeerQuorumAddress(cmd)) {<a name="line.641"></a>
+<span class="sourceLineNo">642</span>            peerQuorumAddress = cmd;<a name="line.642"></a>
+<span class="sourceLineNo">643</span>          } else {<a name="line.643"></a>
+<span class="sourceLineNo">644</span>            peerId = cmd;<a name="line.644"></a>
+<span class="sourceLineNo">645</span>          }<a name="line.645"></a>
+<span class="sourceLineNo">646</span>        }<a name="line.646"></a>
+<span class="sourceLineNo">647</span><a name="line.647"></a>
+<span class="sourceLineNo">648</span>        if (i == args.length-1) {<a name="line.648"></a>
+<span class="sourceLineNo">649</span>          tableName = cmd;<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><a name="line.652"></a>
+<span class="sourceLineNo">653</span>      if ((sourceSnapshotName != null &amp;&amp; sourceSnapshotTmpDir == null)<a name="line.653"></a>
+<span class="sourceLineNo">654</span>          || (sourceSnapshotName == null &amp;&amp; sourceSnapshotTmpDir != null)) {<a name="line.654"></a>
+<span class="sourceLineNo">655</span>        printUsage("Source snapshot name and snapshot temp location should be provided"<a name="line.655"></a>
+<span class="sourceLineNo">656</span>            + " to use snapshots in source cluster");<a name="line.656"></a>
+<span class="sourceLineNo">657</span>        return false;<a name="line.657"></a>
+<span class="sourceLineNo">658</span>      }<a name="line.658"></a>
+<span class="sourceLineNo">659</span><a name="line.659"></a>
+<span class="sourceLineNo">660</span>      if (peerSnapshotName != null || peerSnapshotTmpDir != null || peerFSAddress != null<a name="line.660"></a>
+<span class="sourceLineNo">661</span>          || peerHBaseRootAddress != null) {<a name="line.661"></a>
+<span class="sourceLineNo">662</span>        if (peerSnapshotName == null || peerSnapshotTmpDir == null || peerFSAddress == null<a name="line.662"></a>
+<span class="sourceLineNo">663</span>            || peerHBaseRootAddress == null) {<a name="line.663"></a>
+<span class="sourceLineNo">664</span>          printUsage(<a name="line.664"></a>
+<span class="sourceLineNo">665</span>            "Peer snapshot name, peer snapshot temp location, Peer HBase root address and  "<a name="line.665"></a>
+<span class="sourceLineNo">666</span>                + "peer FSAddress should be provided to use snapshots in peer cluster");<a name="line.666"></a>
+<span class="sourceLineNo">667</span>          return false;<a name="line.667"></a>
+<span class="sourceLineNo">668</span>        }<a name="line.668"></a>
+<span class="sourceLineNo">669</span>      }<a name="line.669"></a>
 <span class="sourceLineNo">670</span><a name="line.670"></a>
-<span class="sourceLineNo">671</span>  private boolean isPeerQuorumAddress(String cmd) {<a name="line.671"></a>
-<span class="sourceLineNo">672</span>    try {<a name="line.672"></a>
-<span class="sourceLineNo">673</span>      ZKConfig.validateClusterKey(cmd);<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    } catch (IOException e) {<a name="line.674"></a>
-<span class="sourceLineNo">675</span>      // not a quorum address<a name="line.675"></a>
-<span class="sourceLineNo">676</span>      return false;<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    }<a name="line.677"></a>
-<span class="sourceLineNo">678</span>    return true;<a name="line.678"></a>
-<span class="sourceLineNo">679</span>  }<a name="line.679"></a>
-<span class="sourceLineNo">680</span><a name="line.680"></a>
-<span class="sourceLineNo">681</span>  /*<a name="line.681"></a>
-<span class="sourceLineNo">682</span>   * @param errorMsg Error message.  Can be null.<a name="line.682"></a>
-<span class="sourceLineNo">683</span>   */<a name="line.683"></a>
-<span class="sourceLineNo">684</span>  private static void printUsage(final String errorMsg) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>    if (errorMsg != null &amp;&amp; errorMsg.length() &gt; 0) {<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      System.err.println("ERROR: " + errorMsg);<a name="line.686"></a>
-<span class="sourceLineNo">687</span>    }<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    System.err.println("Usage: verifyrep [--starttime=X]" +<a name="line.688"></a>
-<span class="sourceLineNo">689</span>        " [--endtime=Y] [--families=A] [--row-prefixes=B] [--delimiter=] [--recomparesleep=] " +<a name="line.689"></a>
-<span class="sourceLineNo">690</span>        "[--batch=] [--verbose] [--sourceSnapshotName=P] [--sourceSnapshotTmpDir=Q] "<a name="line.690"></a>
-<span class="sourceLineNo">691</span>      + "[--peerSnapshotName=R] [--peerSnapshotTmpDir=S] [--peerFSAddress=T] "<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      + "[--peerHBaseRootAddress=U] &lt;peerid|peerQuorumAddress&gt; &lt;tablename&gt;");<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    System.err.println();<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    System.err.println("Options:");<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    System.err.println(" starttime    beginning of the time range");<a name="line.695"></a>
-<span class="sourceLineNo">696</span>    System.err.println("              without endtime means from starttime to forever");<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    System.err.println(" endtime      end of the time range");<a name="line.697"></a>
-<span class="sourceLineNo">698</span>    System.err.println(" versions     number of cell versions to verify");<a name="line.698"></a>
-<span class="sourceLineNo">699</span>    System.err.println(" batch        batch count for scan, " +<a name="line.699"></a>
-<span class="sourceLineNo">700</span>        "note that result row counts will no longer be actual number of rows when you use this option");<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    System.err.println(" raw          includes raw scan if given in options");<a name="line.701"></a>
-<span class="sourceLineNo">702</span>    System.err.println(" families     comma-separated list of families to copy");<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    System.err.println(" row-prefixes comma-separated list of row key prefixes to filter on ");<a name="line.703"></a>
-<span class="sourceLineNo">704</span>    System.err.println(" delimiter    the delimiter used in display around rowkey");<a name="line.704"></a>
-<span class="sourceLineNo">705</span>    System.err.println(" recomparesleep   milliseconds to sleep before recompare row, " +<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        "default value is 0 which disables the recompare.");<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    System.err.println(" verbose      logs row keys of good rows");<a name="line.707"></a>
-<span class="sourceLineNo">708</span>    System.err.println(" sourceSnapshotName  Source Snapshot Name");<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    System.err.println(" sourceSnapshotTmpDir Tmp location to restore source table snapshot");<a name="line.709"></a>
-<span class="sourceLineNo">710</span>    System.err.println(" peerSnapshotName  Peer Snapshot Name");<a name="line.710"></a>
-<span class="sourceLineNo">711</span>    System.err.println(" peerSnapshotTmpDir Tmp location to restore peer table snapshot");<a name="line.711"></a>
-<span class="sourceLineNo">712</span>    System.err.println(" peerFSAddress      Peer cluster Hadoop FS address");<a name="line.712"></a>
-<span class="sourceLineNo">713</span>    System.err.println(" peerHBaseRootAddress  Peer cluster HBase root location");<a name="line.713"></a>
-<span class="sourceLineNo">714</span>    System.err.println();<a name="line.714"></a>
-<span class="sourceLineNo">715</span>    System.err.println("Args:");<a name="line.715"></a>
-<span class="sourceLineNo">716</span>    System.err.println(" peerid       Id of the peer used for verification, must match the one given for replication");<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    System.err.println(" peerQuorumAddress   quorumAdress of the peer used for verification. The "<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      + "format is zk_quorum:zk_port:zk_hbase_path");<a name="line.718"></a>
-<span class="sourceLineNo">719</span>    System.err.println(" tablename    Name of the table to verify");<a name="line.719"></a>
-<span class="sourceLineNo">720</span>    System.err.println();<a name="line.720"></a>
-<span class="sourceLineNo">721</span>    System.err.println("Examples:");<a name="line.721"></a>
-<span class="sourceLineNo">722</span>    System.err.println(" To verify the data replicated from TestTable for a 1 hour window with peer #5 ");<a name="line.722"></a>
-<span class="sourceLineNo">723</span>    System.err.println(" $ hbase " +<a name="line.723"></a>
-<span class="sourceLineNo">724</span>        "org.apache.hadoop.hbase.mapreduce.replication.VerifyReplication" +<a name="line.724"></a>
-<span class="sourceLineNo">725</span>        " --starttime=1265875194289 --endtime=1265878794289 5 TestTable ");<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>  @Override<a name="line.728"></a>
-<span class="sourceLineNo">729</span>  public int run(String[] args) throws Exception {<a name="line.729"></a>
-<span class="sourceLineNo">730</span>    Configuration conf = this.getConf();<a name="line.730"></a>
-<span class="sourceLineNo">731</span>    Job job = createSubmittableJob(conf, args);<a name="line.731"></a>
-<span class="sourceLineNo">732</span>    if (job != null) {<a name="line.732"></a>
-<span class="sourceLineNo">733</span>      return job.waitForCompletion(true) ? 0 : 1;<a name="line.733"></a>
-<span class="sourceLineNo">734</span>    }<a name="line.734"></a>
-<span class="sourceLineNo">735</span>    return 1;<a name="line.735"></a>
-<span class="sourceLineNo">736</span>  }<a name="line.736"></a>
-<span class="sourceLineNo">737</span><a name="line.737"></a>
-<span class="sourceLineNo">738</span>  /**<a name="line.738"></a>
-<span class="sourceLineNo">739</span>   * Main entry point.<a name="line.739"></a>
-<span class="sourceLineNo">740</span>   *<a name="line.740"></a>
-<span class="sourceLineNo">741</span>   * @param args  The command line parameters.<a name="line.741"></a>
-<span class="sourceLineNo">742</span>   * @throws Exception When running the job fails.<a name="line.742"></a>
-<span class="sourceLineNo">743</span>   */<a name="line.743"></a>
-<span class="sourceLineNo">744</span>  public static void main(String[] args) throws Exception {<a name="line.744"></a>
-<span class="sourceLineNo">745</span>    int res = ToolRunner.run(HBaseConfiguration.create(), new VerifyReplication(), args);<a name="line.745"></a>
-<span class="sourceLineNo">746</span>    System.exit(res);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>  }<a name="line.747"></a>
-<span class="sourceLineNo">748</span>}<a name="line.748"></a>
+<span class="sourceLineNo">671</span>      // This is to avoid making recompare calls to source/peer tables when snapshots are used<a name="line.671"></a>
+<span class="sourceLineNo">672</span>      if ((sourceSnapshotName != null || peerSnapshotName != null) &amp;&amp; sleepMsBeforeReCompare &gt; 0) {<a name="line.672"></a>
+<span class="sourceLineNo">673</span>        printUsage(<a name="line.673"></a>
+<span class="sourceLineNo">674</span>          "Using sleepMsBeforeReCompare along with snapshots is not allowed as snapshots are immutable");<a name="line.674"></a>
+<span class="sourceLineNo">675</span>        return false;<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>    } catch (Exception e) {<a name="line.678"></a>
+<span class="sourceLineNo">679</span>      LOG.error("Failed to parse commandLine arguments", e);<a name="line.679"></a>
+<span class="sourceLineNo">680</span>      printUsage("Can't start because " + e.getMessage());<a name="line.680"></a>
+<span class="sourceLineNo">681</span>      return false;<a name="line.681"></a>
+<span class="sourceLineNo">682</span>    }<a name="line.682"></a>
+<span class="sourceLineNo">683</span>    return true;<a name="line.683"></a>
+<span class="sourceLineNo">684</span>  }<a name="line.684"></a>
+<span class="sourceLineNo">685</span><a name="line.685"></a>
+<span class="sourceLineNo">686</span>  private boolean isPeerQuorumAddress(String cmd) {<a name="line.686"></a>
+<span class="sourceLineNo">687</span>    try {<a name="line.687"></a>
+<span class="sourceLineNo">688</span>      ZKConfig.validateClusterKey(cmd);<a name="line.688"></a>
+<span class="sourceLineNo">689</span>    } catch (IOException e) {<a name="line.689"></a>
+<span class="sourceLineNo">690</span>      // not a quorum address<a name="line.690"></a>
+<span class="sourceLineNo">691</span>      return false;<a name="line.691"></a>
+<span class="sourceLineNo">692</span>    }<a name="line.692"></a>
+<span class="sourceLineNo">693</span>    return true;<a name="line.693"></a>
+<span class="sourceLineNo">694</span>  }<a name="line.694"></a>
+<span class="sourceLineNo">695</span><a name="line.695"></a>
+<span class="sourceLineNo">696</span>  /*<a name="line.696"></a>
+<span class="sourceLineNo">697</span>   * @param errorMsg Error message.  Can be null.<a name="line.697"></a>
+<span class="sourceLineNo">698</span>   */<a name="line.698"></a>
+<span class="sourceLineNo">699</span>  private static void printUsage(final String errorMsg) {<a name="line.699"></a>
+<span class="sourceLineNo">700</span>    if (errorMsg != null &amp;&amp; errorMsg.length() &gt; 0) {<a name="line.700"></a>
+<span class="sourceLineNo">701</span>      System.err.println("ERROR: " + errorMsg);<a name="line.701"></a>
+<span class="sourceLineNo">702</span>    }<a name="line.702"></a>
+<span class="sourceLineNo">703</span>    System.err.println("Usage: verifyrep [--starttime=X]"<a name="line.703"></a>
+<span class="sourceLineNo">704</span>        + " [--endtime=Y] [--families=A] [--row-prefixes=B] [--delimiter=] [--recomparesleep=] "<a name="line.704"></a>
+<span class="sourceLineNo">705</span>        + "[--batch=] [--verbose] [--peerTableName=] [--sourceSnapshotName=P] "<a name="line.705"></a>
+<span class="sourceLineNo">706</span>        + "[--sourceSnapshotTmpDir=Q] [--peerSnapshotName=R] [--peerSnapshotTmpDir=S] "<a name="line.706"></a>
+<span class="sourceLineNo">707</span>        + "[--peerFSAddress=T] [--peerHBaseRootAddress=U] &lt;peerid|peerQuorumAddress&gt; &lt;tablename&gt;");<a name="line.707"></a>
+<span class="sourceLineNo">708</span>    System.err.println();<a name="line.708"></a>
+<span class="sourceLineNo">709</span>    System.err.println("Options:");<a name="line.709"></a>
+<span class="sourceLineNo">710</span>    System.err.println(" starttime    beginning of the time range");<a name="line.710"></a>
+<span class="sourceLineNo">711</span>    System.err.println("              without endtime means from starttime to forever");<a name="line.711"></a>
+<span class="sourceLineNo">712</span>    System.err.println(" endtime      end of the time range");<a name="line.712"></a>
+<span class="sourceLineNo">713</span>    System.err.println(" versions     number of cell versions to verify");<a name="line.713"></a>
+<span class="sourceLineNo">714</span>    System.err.println(" batch        batch count for scan, " +<a name="line.714"></a>
+<span class="sourceLineNo">715</span>        "note that result row counts will no longer be actual number of rows when you use this option");<a name="line.715"></a>
+<span class="sourceLineNo">716</span>    System.err.println(" raw          includes raw scan if given in options");<a name="line.716"></a>
+<span class="sourceLineNo">717</span>    System.err.println(" families     comma-separated list of families to copy");<a name="line.717"></a>
+<span class="sourceLineNo">718</span>    System.err.println(" row-prefixes comma-separated list of row key prefixes to filter on ");<a name="line.718"></a>
+<span class="sourceLineNo">719</span>    System.err.println(" delimiter    the delimiter used in display around rowkey");<a name="line.719"></a>
+<span class="sourceLineNo">720</span>    System.err.println(" recomparesleep   milliseconds to sleep before recompare row, " +<a name="line.720"></a>
+<span class="sourceLineNo">721</span>        "default value is 0 which disables the recompare.");<a name="line.721"></a>
+<span class="sourceLineNo">722</span>    System.err.println(" verbose      logs row keys of good rows");<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    System.err.println(" peerTableName  Peer Table Name");<a name="line.723"></a>
+<span class="sourceLineNo">724</span>    System.err.println(" sourceSnapshotName  Source Snapshot Name");<a name="line.724"></a>
+<span class="sourceLineNo">725</span>    System.err.println(" sourceSnapshotTmpDir Tmp location to restore source table snapshot");<a name="line.725"></a>
+<span class="sourceLineNo">726</span>    System.err.println(" peerSnapshotName  Peer Snapshot Name");<a name="line.726"></a>
+<span class="sourceLineNo">727</span>    System.err.println(" peerSnapshotTmpDir Tmp location to restore peer table snapshot");<a name="line.727"></a>
+<span class="sourceLineNo">728</span>    System.err.println(" peerFSAddress      Peer cluster Hadoop FS address");<a name="line.728"></a>
+<span class="sourceLineNo">729</span>    System.err.println(" peerHBaseRootAddress  Peer cluster HBase root location");<a name="line.729"></a>
+<span class="sourceLineNo">730</span>    System.err.println();<a name="line.730"></a>
+<span class="sourceLineNo">731</span>    System.err.println("Args:");<a name="line.731"></a>
+<span class="sourceLineNo">732</span>    System.err.println(" peerid       Id of the peer used for verification, must match the one given for replication");<a name="line.732"></a>
+<span class="sourceLineNo">733</span>    System.err.println(" peerQuorumAddress   quorumAdress of the peer used for verification. The "<a name="line.733"></a>
+<span class="sourceLineNo">734</span>      + "format is zk_quorum:zk_port:zk_hbase_path");<a name="line.734"></a>
+<span class="sourceLineNo">735</span>    System.err.println(" tablename    Name of the table to verify");<a name="line.735"></a>
+<span class="sourceLineNo">736</span>    System.err.println();<a name="line.736"></a>
+<span class="sourceLineNo">737</span>    System.err.println("Examples:");<a name="line.737"></a>
+<span class="sourceLineNo">738</span>    System.err.println(" To verify the data replicated from TestTable for a 1 hour window with peer #5 ");<a name="line.738"></a>
+<span class="sourceLineNo">739</span>    System.err.println(" $ hbase " +<a name="line.739"></a>
+<span class="sourceLineNo">740</span>        "org.apache.hadoop.hbase.mapreduce.replication.VerifyReplication" +<a name="line.740"></a>
+<span class="sourceLineNo">741</span>        " --starttime=1265875194289 --endtime=1265878794289 5 TestTable ");<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>  @Override<a name="line.744"></a>
+<span class="sourceLineNo">745</span>  public int run(String[] args) throws Exception {<a name="line.745"></a>
+<span class="sourceLineNo">746</span>    Configuration conf = this.getConf();<a name="line.746"></a>
+<span class="sourceLineNo">747</span>    Job job = createSubmittableJob(conf, args);<a name="line.747"></a>
+<span class="sourceLineNo">748</span>    if (job != null) {<a name="line.748"></a>
+<span class="sourceLineNo">749</span>      return job.waitForCompletion(true) ? 0 : 1;<a name="line.749"></a>
+<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
+<span class="sourceLineNo">751</span>    return 1;<a name="line.751"></a>
+<span class="sourceLineNo">752</span>  }<a name="line.752"></a>
+<span class="sourceLineNo">753</span><a name="line.753"></a>
+<span class="sourceLineNo">754</span>  /**<a name="line.754"></a>
+<span class="sourceLineNo">755</span>   * Main entry point.<a name="line.755"></a>
+<span class="sourceLineNo">756</span>   *<a name="line.756"></a>
+<span class="sourceLineNo">757</span>   * @param args  The command line parameters.<a name="line.757"></a>
+<span class="sourceLineNo">758</span>   * @throws Exception When running the job fails.<a name="line.758"></a>
+<span class="sourceLineNo">759</span>   */<a name="line.759"></a>
+<span class="sourceLineNo">760</span>  public static void main(String[] args) throws Exception {<a name="line.760"></a>
+<span class="sourceLineNo">761</span>    int res = ToolRunner.run(HBaseConfiguration.create(), new VerifyReplication(), args);<a name="line.761"></a>
+<span class="sourceLineNo">762</span>    System.exit(res);<a name="line.762"></a>
+<span class="sourceLineNo">763</span>  }<a name="line.763"></a>
+<span class="sourceLineNo">764</span>}<a name="line.764"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/rest/RESTServer.html b/devapidocs/src-html/org/apache/hadoop/hbase/rest/RESTServer.html
index 4f04d17..469a5c9 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/rest/RESTServer.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/rest/RESTServer.html
@@ -111,327 +111,330 @@
 <span class="sourceLineNo">103</span>    "hbase.rest-csrf.browser-useragents-regex";<a name="line.103"></a>
 <span class="sourceLineNo">104</span><a name="line.104"></a>
 <span class="sourceLineNo">105</span>  // HACK, making this static for AuthFilter to get at our configuration. Necessary for unit tests.<a name="line.105"></a>
-<span class="sourceLineNo">106</span>  public static Configuration conf = null;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>  private final UserProvider userProvider;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>  private Server server;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>  private InfoServer infoServer;<a name="line.109"></a>
-<span class="sourceLineNo">110</span><a name="line.110"></a>
-<span class="sourceLineNo">111</span>  public RESTServer(Configuration conf) {<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    RESTServer.conf = conf;<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    this.userProvider = UserProvider.instantiate(conf);<a name="line.113"></a>
-<span class="sourceLineNo">114</span>  }<a name="line.114"></a>
-<span class="sourceLineNo">115</span><a name="line.115"></a>
-<span class="sourceLineNo">116</span>  private static void printUsageAndExit(Options options, int exitCode) {<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    HelpFormatter formatter = new HelpFormatter();<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    formatter.printHelp("hbase rest start", "", options,<a name="line.118"></a>
-<span class="sourceLineNo">119</span>      "\nTo run the REST server as a daemon, execute " +<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      "hbase-daemon.sh start|stop rest [--infoport &lt;port&gt;] [-p &lt;port&gt;] [-ro]\n", true);<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    System.exit(exitCode);<a name="line.121"></a>
-<span class="sourceLineNo">122</span>  }<a name="line.122"></a>
-<span class="sourceLineNo">123</span><a name="line.123"></a>
-<span class="sourceLineNo">124</span>  void addCSRFFilter(ServletContextHandler ctxHandler, Configuration conf) {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    restCSRFEnabled = conf.getBoolean(REST_CSRF_ENABLED_KEY, REST_CSRF_ENABLED_DEFAULT);<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    if (restCSRFEnabled) {<a name="line.126"></a>
-<span class="sourceLineNo">127</span>      Map&lt;String, String&gt; restCsrfParams = RestCsrfPreventionFilter<a name="line.127"></a>
-<span class="sourceLineNo">128</span>          .getFilterParams(conf, "hbase.rest-csrf.");<a name="line.128"></a>
-<span class="sourceLineNo">129</span>      FilterHolder holder = new FilterHolder();<a name="line.129"></a>
-<span class="sourceLineNo">130</span>      holder.setName("csrf");<a name="line.130"></a>
-<span class="sourceLineNo">131</span>      holder.setClassName(RestCsrfPreventionFilter.class.getName());<a name="line.131"></a>
-<span class="sourceLineNo">132</span>      holder.setInitParameters(restCsrfParams);<a name="line.132"></a>
-<span class="sourceLineNo">133</span>      ctxHandler.addFilter(holder, PATH_SPEC_ANY, EnumSet.allOf(DispatcherType.class));<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    }<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  }<a name="line.135"></a>
-<span class="sourceLineNo">136</span><a name="line.136"></a>
-<span class="sourceLineNo">137</span>  // login the server principal (if using secure Hadoop)<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  private static Pair&lt;FilterHolder, Class&lt;? extends ServletContainer&gt;&gt; loginServerPrincipal(<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    UserProvider userProvider, Configuration conf) throws Exception {<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    Class&lt;? extends ServletContainer&gt; containerClass = ServletContainer.class;<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    if (userProvider.isHadoopSecurityEnabled() &amp;&amp; userProvider.isHBaseSecurityEnabled()) {<a name="line.141"></a>
-<span class="sourceLineNo">142</span>      String machineName = Strings.domainNamePointerToHostName(<a name="line.142"></a>
-<span class="sourceLineNo">143</span>        DNS.getDefaultHost(conf.get(REST_DNS_INTERFACE, "default"),<a name="line.143"></a>
-<span class="sourceLineNo">144</span>          conf.get(REST_DNS_NAMESERVER, "default")));<a name="line.144"></a>
-<span class="sourceLineNo">145</span>      String keytabFilename = conf.get(REST_KEYTAB_FILE);<a name="line.145"></a>
-<span class="sourceLineNo">146</span>      Preconditions.checkArgument(keytabFilename != null &amp;&amp; !keytabFilename.isEmpty(),<a name="line.146"></a>
-<span class="sourceLineNo">147</span>        REST_KEYTAB_FILE + " should be set if security is enabled");<a name="line.147"></a>
-<span class="sourceLineNo">148</span>      String principalConfig = conf.get(REST_KERBEROS_PRINCIPAL);<a name="line.148"></a>
-<span class="sourceLineNo">149</span>      Preconditions.checkArgument(principalConfig != null &amp;&amp; !principalConfig.isEmpty(),<a name="line.149"></a>
-<span class="sourceLineNo">150</span>        REST_KERBEROS_PRINCIPAL + " should be set if security is enabled");<a name="line.150"></a>
-<span class="sourceLineNo">151</span>      // Hook for unit tests, this will log out any other user and mess up tests.<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      if (!conf.getBoolean(SKIP_LOGIN_KEY, false)) {<a name="line.152"></a>
-<span class="sourceLineNo">153</span>        userProvider.login(REST_KEYTAB_FILE, REST_KERBEROS_PRINCIPAL, machineName);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>      }<a name="line.154"></a>
-<span class="sourceLineNo">155</span>      if (conf.get(REST_AUTHENTICATION_TYPE) != null) {<a name="line.155"></a>
-<span class="sourceLineNo">156</span>        containerClass = RESTServletContainer.class;<a name="line.156"></a>
-<span class="sourceLineNo">157</span>        FilterHolder authFilter = new FilterHolder();<a name="line.157"></a>
-<span class="sourceLineNo">158</span>        authFilter.setClassName(AuthFilter.class.getName());<a name="line.158"></a>
-<span class="sourceLineNo">159</span>        authFilter.setName("AuthenticationFilter");<a name="line.159"></a>
-<span class="sourceLineNo">160</span>        return new Pair&lt;&gt;(authFilter,containerClass);<a name="line.160"></a>
-<span class="sourceLineNo">161</span>      }<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    }<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    return new Pair&lt;&gt;(null, containerClass);<a name="line.163"></a>
-<span class="sourceLineNo">164</span>  }<a name="line.164"></a>
-<span class="sourceLineNo">165</span><a name="line.165"></a>
-<span class="sourceLineNo">166</span>  private static void parseCommandLine(String[] args, Configuration conf) {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    Options options = new Options();<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    options.addOption("p", "port", true, "Port to bind to [default: " + DEFAULT_LISTEN_PORT + "]");<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    options.addOption("ro", "readonly", false, "Respond only to GET HTTP " +<a name="line.169"></a>
-<span class="sourceLineNo">170</span>      "method requests [default: false]");<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    options.addOption(null, "infoport", true, "Port for web UI");<a name="line.171"></a>
-<span class="sourceLineNo">172</span><a name="line.172"></a>
-<span class="sourceLineNo">173</span>    CommandLine commandLine = null;<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    try {<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      commandLine = new PosixParser().parse(options, args);<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    } catch (ParseException e) {<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      LOG.error("Could not parse: ", e);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      printUsageAndExit(options, -1);<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    }<a name="line.179"></a>
-<span class="sourceLineNo">180</span><a name="line.180"></a>
-<span class="sourceLineNo">181</span>    // check for user-defined port setting, if so override the conf<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    if (commandLine != null &amp;&amp; commandLine.hasOption("port")) {<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      String val = commandLine.getOptionValue("port");<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      conf.setInt("hbase.rest.port", Integer.parseInt(val));<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      if (LOG.isDebugEnabled()) {<a name="line.185"></a>
-<span class="sourceLineNo">186</span>        LOG.debug("port set to " + val);<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      }<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    }<a name="line.188"></a>
-<span class="sourceLineNo">189</span><a name="line.189"></a>
-<span class="sourceLineNo">190</span>    // check if server should only process GET requests, if so override the conf<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    if (commandLine != null &amp;&amp; commandLine.hasOption("readonly")) {<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      conf.setBoolean("hbase.rest.readonly", true);<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      if (LOG.isDebugEnabled()) {<a name="line.193"></a>
-<span class="sourceLineNo">194</span>        LOG.debug("readonly set to true");<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      }<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    }<a name="line.196"></a>
-<span class="sourceLineNo">197</span><a name="line.197"></a>
-<span class="sourceLineNo">198</span>    // check for user-defined info server port setting, if so override the conf<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    if (commandLine != null &amp;&amp; commandLine.hasOption("infoport")) {<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      String val = commandLine.getOptionValue("infoport");<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      conf.setInt("hbase.rest.info.port", Integer.parseInt(val));<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      if (LOG.isDebugEnabled()) {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        LOG.debug("Web UI port set to " + val);<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      }<a name="line.204"></a>
-<span class="sourceLineNo">205</span>    }<a name="line.205"></a>
-<span class="sourceLineNo">206</span><a name="line.206"></a>
-<span class="sourceLineNo">207</span>    if (commandLine != null &amp;&amp; commandLine.hasOption("skipLogin")) {<a name="line.207"></a>
-<span class="sourceLineNo">208</span>      conf.setBoolean(SKIP_LOGIN_KEY, true);<a name="line.208"></a>
-<span class="sourceLineNo">209</span>      if (LOG.isDebugEnabled()) {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>        LOG.debug("Skipping Kerberos login for REST server");<a name="line.210"></a>
-<span class="sourceLineNo">211</span>      }<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    }<a name="line.212"></a>
-<span class="sourceLineNo">213</span><a name="line.213"></a>
-<span class="sourceLineNo">214</span>    List&lt;String&gt; remainingArgs = commandLine != null ? commandLine.getArgList() : new ArrayList&lt;&gt;();<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    if (remainingArgs.size() != 1) {<a name="line.215"></a>
-<span class="sourceLineNo">216</span>      printUsageAndExit(options, 1);<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    }<a name="line.217"></a>
-<span class="sourceLineNo">218</span><a name="line.218"></a>
-<span class="sourceLineNo">219</span>    String command = remainingArgs.get(0);<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    if ("start".equals(command)) {<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      // continue and start container<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    } else if ("stop".equals(command)) {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>      System.exit(1);<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    } else {<a name="line.224"></a>
-<span class="sourceLineNo">225</span>      printUsageAndExit(options, 1);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    }<a name="line.226"></a>
-<span class="sourceLineNo">227</span>  }<a name="line.227"></a>
-<span class="sourceLineNo">228</span><a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>  /**<a name="line.230"></a>
-<span class="sourceLineNo">231</span>   * Runs the REST server.<a name="line.231"></a>
-<span class="sourceLineNo">232</span>   */<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  public synchronized void run() throws Exception {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    Pair&lt;FilterHolder, Class&lt;? extends ServletContainer&gt;&gt; pair = loginServerPrincipal(<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      userProvider, conf);<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    FilterHolder authFilter = pair.getFirst();<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    Class&lt;? extends ServletContainer&gt; containerClass = pair.getSecond();<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    RESTServlet servlet = RESTServlet.getInstance(conf, userProvider);<a name="line.238"></a>
-<span class="sourceLineNo">239</span><a name="line.239"></a>
-<span class="sourceLineNo">240</span>    // set up the Jersey servlet container for Jetty<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    ResourceConfig application = new ResourceConfig().<a name="line.241"></a>
-<span class="sourceLineNo">242</span>        packages("org.apache.hadoop.hbase.rest").register(JacksonJaxbJsonProvider.class);<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    // Using our custom ServletContainer is tremendously important. This is what makes sure the<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    // UGI.doAs() is done for the remoteUser, and calls are not made as the REST server itself.<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    ServletContainer servletContainer = ReflectionUtils.newInstance(containerClass, application);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    ServletHolder sh = new ServletHolder(servletContainer);<a name="line.246"></a>
-<span class="sourceLineNo">247</span><a name="line.247"></a>
-<span class="sourceLineNo">248</span>    // Set the default max thread number to 100 to limit<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    // the number of concurrent requests so that REST server doesn't OOM easily.<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    // Jetty set the default max thread number to 250, if we don't set it.<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    //<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    // Our default min thread number 2 is the same as that used by Jetty.<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    int maxThreads = servlet.getConfiguration().getInt(REST_THREAD_POOL_THREADS_MAX, 100);<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    int minThreads = servlet.getConfiguration().getInt(REST_THREAD_POOL_THREADS_MIN, 2);<a name="line.254"></a>
-<span class="sourceLineNo">255</span>    // Use the default queue (unbounded with Jetty 9.3) if the queue size is negative, otherwise use<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    // bounded {@link ArrayBlockingQueue} with the given size<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    int queueSize = servlet.getConfiguration().getInt(REST_THREAD_POOL_TASK_QUEUE_SIZE, -1);<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    int idleTimeout = servlet.getConfiguration().getInt(REST_THREAD_POOL_THREAD_IDLE_TIMEOUT, 60000);<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    QueuedThreadPool threadPool = queueSize &gt; 0 ?<a name="line.259"></a>
-<span class="sourceLineNo">260</span>        new QueuedThreadPool(maxThreads, minThreads, idleTimeout, new ArrayBlockingQueue&lt;&gt;(queueSize)) :<a name="line.260"></a>
-<span class="sourceLineNo">261</span>        new QueuedThreadPool(maxThreads, minThreads, idleTimeout);<a name="line.261"></a>
-<span class="sourceLineNo">262</span><a name="line.262"></a>
-<span class="sourceLineNo">263</span>    this.server = new Server(threadPool);<a name="line.263"></a>
-<span class="sourceLineNo">264</span><a name="line.264"></a>
-<span class="sourceLineNo">265</span>    // Setup JMX<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    MBeanContainer mbContainer=new MBeanContainer(ManagementFactory.getPlatformMBeanServer());<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    server.addEventListener(mbContainer);<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    server.addBean(mbContainer);<a name="line.268"></a>
-<span class="sourceLineNo">269</span><a name="line.269"></a>
-<span class="sourceLineNo">270</span><a name="line.270"></a>
-<span class="sourceLineNo">271</span>    String host = servlet.getConfiguration().get("hbase.rest.host", "0.0.0.0");<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    int servicePort = servlet.getConfiguration().getInt("hbase.rest.port", 8080);<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    HttpConfiguration httpConfig = new HttpConfiguration();<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    httpConfig.setSecureScheme("https");<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    httpConfig.setSecurePort(servicePort);<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    httpConfig.setSendServerVersion(false);<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    httpConfig.setSendDateHeader(false);<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>    ServerConnector serverConnector;<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    if (conf.getBoolean(REST_SSL_ENABLED, false)) {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      HttpConfiguration httpsConfig = new HttpConfiguration(httpConfig);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      httpsConfig.addCustomizer(new SecureRequestCustomizer());<a name="line.282"></a>
-<span class="sourceLineNo">283</span><a name="line.283"></a>
-<span class="sourceLineNo">284</span>      SslContextFactory sslCtxFactory = new SslContextFactory();<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      String keystore = conf.get(REST_SSL_KEYSTORE_STORE);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      String password = HBaseConfiguration.getPassword(conf,<a name="line.286"></a>
-<span class="sourceLineNo">287</span>          REST_SSL_KEYSTORE_PASSWORD, null);<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      String keyPassword = HBaseConfiguration.getPassword(conf,<a name="line.288"></a>
-<span class="sourceLineNo">289</span>          REST_SSL_KEYSTORE_KEYPASSWORD, password);<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      sslCtxFactory.setKeyStorePath(keystore);<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      sslCtxFactory.setKeyStorePassword(password);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      sslCtxFactory.setKeyManagerPassword(keyPassword);<a name="line.292"></a>
-<span class="sourceLineNo">293</span><a name="line.293"></a>
-<span class="sourceLineNo">294</span>      String[] excludeCiphers = servlet.getConfiguration().getStrings(<a name="line.294"></a>
-<span class="sourceLineNo">295</span>          REST_SSL_EXCLUDE_CIPHER_SUITES, ArrayUtils.EMPTY_STRING_ARRAY);<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      if (excludeCiphers.length != 0) {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>        sslCtxFactory.setExcludeCipherSuites(excludeCiphers);<a name="line.297"></a>
-<span class="sourceLineNo">298</span>      }<a name="line.298"></a>
-<span class="sourceLineNo">299</span>      String[] includeCiphers = servlet.getConfiguration().getStrings(<a name="line.299"></a>
-<span class="sourceLineNo">300</span>          REST_SSL_INCLUDE_CIPHER_SUITES, ArrayUtils.EMPTY_STRING_ARRAY);<a name="line.300"></a>
-<span class="sourceLineNo">301</span>      if (includeCiphers.length != 0) {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>        sslCtxFactory.setIncludeCipherSuites(includeCiphers);<a name="line.302"></a>
-<span class="sourceLineNo">303</span>      }<a name="line.303"></a>
-<span class="sourceLineNo">304</span><a name="line.304"></a>
-<span class="sourceLineNo">305</span>      String[] excludeProtocols = servlet.getConfiguration().getStrings(<a name="line.305"></a>
-<span class="sourceLineNo">306</span>          REST_SSL_EXCLUDE_PROTOCOLS, ArrayUtils.EMPTY_STRING_ARRAY);<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      if (excludeProtocols.length != 0) {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>        sslCtxFactory.setExcludeProtocols(excludeProtocols);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      }<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      String[] includeProtocols = servlet.getConfiguration().getStrings(<a name="line.310"></a>
-<span class="sourceLineNo">311</span>          REST_SSL_INCLUDE_PROTOCOLS, ArrayUtils.EMPTY_STRING_ARRAY);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      if (includeProtocols.length != 0) {<a name="line.312"></a>
-<span class="sourceLineNo">313</span>        sslCtxFactory.setIncludeProtocols(includeProtocols);<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      }<a name="line.314"></a>
-<span class="sourceLineNo">315</span><a name="line.315"></a>
-<span class="sourceLineNo">316</span>      serverConnector = new ServerConnector(server,<a name="line.316"></a>
-<span class="sourceLineNo">317</span>          new SslConnectionFactory(sslCtxFactory, HttpVersion.HTTP_1_1.toString()),<a name="line.317"></a>
-<span class="sourceLineNo">318</span>          new HttpConnectionFactory(httpsConfig));<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    } else {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      serverConnector = new ServerConnector(server, new HttpConnectionFactory(httpConfig));<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    }<a name="line.321"></a>
-<span class="sourceLineNo">322</span><a name="line.322"></a>
-<span class="sourceLineNo">323</span>    int acceptQueueSize = servlet.getConfiguration().getInt(REST_CONNECTOR_ACCEPT_QUEUE_SIZE, -1);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    if (acceptQueueSize &gt;= 0) {<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      serverConnector.setAcceptQueueSize(acceptQueueSize);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    }<a name="line.326"></a>
-<span class="sourceLineNo">327</span><a name="line.327"></a>
-<span class="sourceLineNo">328</span>    serverConnector.setPort(servicePort);<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    serverConnector.setHost(host);<a name="line.329"></a>
+<span class="sourceLineNo">106</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    value={"ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD", "MS_CANNOT_BE_FINAL"},<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    justification="For testing")<a name="line.108"></a>
+<span class="sourceLineNo">109</span>  public static Configuration conf = null;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>  private final UserProvider userProvider;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  private Server server;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>  private InfoServer infoServer;<a name="line.112"></a>
+<span class="sourceLineNo">113</span><a name="line.113"></a>
+<span class="sourceLineNo">114</span>  public RESTServer(Configuration conf) {<a name="line.114"></a>
+<span class="sourceLineNo">115</span>    RESTServer.conf = conf;<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    this.userProvider = UserProvider.instantiate(conf);<a name="line.116"></a>
+<span class="sourceLineNo">117</span>  }<a name="line.117"></a>
+<span class="sourceLineNo">118</span><a name="line.118"></a>
+<span class="sourceLineNo">119</span>  private static void printUsageAndExit(Options options, int exitCode) {<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    HelpFormatter formatter = new HelpFormatter();<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    formatter.printHelp("hbase rest start", "", options,<a name="line.121"></a>
+<span class="sourceLineNo">122</span>      "\nTo run the REST server as a daemon, execute " +<a name="line.122"></a>
+<span class="sourceLineNo">123</span>      "hbase-daemon.sh start|stop rest [--infoport &lt;port&gt;] [-p &lt;port&gt;] [-ro]\n", true);<a name="line.123"></a>
+<span class="sourceLineNo">124</span>    System.exit(exitCode);<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  }<a name="line.125"></a>
+<span class="sourceLineNo">126</span><a name="line.126"></a>
+<span class="sourceLineNo">127</span>  void addCSRFFilter(ServletContextHandler ctxHandler, Configuration conf) {<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    restCSRFEnabled = conf.getBoolean(REST_CSRF_ENABLED_KEY, REST_CSRF_ENABLED_DEFAULT);<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    if (restCSRFEnabled) {<a name="line.129"></a>
+<span class="sourceLineNo">130</span>      Map&lt;String, String&gt; restCsrfParams = RestCsrfPreventionFilter<a name="line.130"></a>
+<span class="sourceLineNo">131</span>          .getFilterParams(conf, "hbase.rest-csrf.");<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      FilterHolder holder = new FilterHolder();<a name="line.132"></a>
+<span class="sourceLineNo">133</span>      holder.setName("csrf");<a name="line.133"></a>
+<span class="sourceLineNo">134</span>      holder.setClassName(RestCsrfPreventionFilter.class.getName());<a name="line.134"></a>
+<span class="sourceLineNo">135</span>      holder.setInitParameters(restCsrfParams);<a name="line.135"></a>
+<span class="sourceLineNo">136</span>      ctxHandler.addFilter(holder, PATH_SPEC_ANY, EnumSet.allOf(DispatcherType.class));<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    }<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
+<span class="sourceLineNo">139</span><a name="line.139"></a>
+<span class="sourceLineNo">140</span>  // login the server principal (if using secure Hadoop)<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  private static Pair&lt;FilterHolder, Class&lt;? extends ServletContainer&gt;&gt; loginServerPrincipal(<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    UserProvider userProvider, Configuration conf) throws Exception {<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    Class&lt;? extends ServletContainer&gt; containerClass = ServletContainer.class;<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    if (userProvider.isHadoopSecurityEnabled() &amp;&amp; userProvider.isHBaseSecurityEnabled()) {<a name="line.144"></a>
+<span class="sourceLineNo">145</span>      String machineName = Strings.domainNamePointerToHostName(<a name="line.145"></a>
+<span class="sourceLineNo">146</span>        DNS.getDefaultHost(conf.get(REST_DNS_INTERFACE, "default"),<a name="line.146"></a>
+<span class="sourceLineNo">147</span>          conf.get(REST_DNS_NAMESERVER, "default")));<a name="line.147"></a>
+<span class="sourceLineNo">148</span>      String keytabFilename = conf.get(REST_KEYTAB_FILE);<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      Preconditions.checkArgument(keytabFilename != null &amp;&amp; !keytabFilename.isEmpty(),<a name="line.149"></a>
+<span class="sourceLineNo">150</span>        REST_KEYTAB_FILE + " should be set if security is enabled");<a name="line.150"></a>
+<span class="sourceLineNo">151</span>      String principalConfig = conf.get(REST_KERBEROS_PRINCIPAL);<a name="line.151"></a>
+<span class="sourceLineNo">152</span>      Preconditions.checkArgument(principalConfig != null &amp;&amp; !principalConfig.isEmpty(),<a name="line.152"></a>
+<span class="sourceLineNo">153</span>        REST_KERBEROS_PRINCIPAL + " should be set if security is enabled");<a name="line.153"></a>
+<span class="sourceLineNo">154</span>      // Hook for unit tests, this will log out any other user and mess up tests.<a name="line.154"></a>
+<span class="sourceLineNo">155</span>      if (!conf.getBoolean(SKIP_LOGIN_KEY, false)) {<a name="line.155"></a>
+<span class="sourceLineNo">156</span>        userProvider.login(REST_KEYTAB_FILE, REST_KERBEROS_PRINCIPAL, machineName);<a name="line.156"></a>
+<span class="sourceLineNo">157</span>      }<a name="line.157"></a>
+<span class="sourceLineNo">158</span>      if (conf.get(REST_AUTHENTICATION_TYPE) != null) {<a name="line.158"></a>
+<span class="sourceLineNo">159</span>        containerClass = RESTServletContainer.class;<a name="line.159"></a>
+<span class="sourceLineNo">160</span>        FilterHolder authFilter = new FilterHolder();<a name="line.160"></a>
+<span class="sourceLineNo">161</span>        authFilter.setClassName(AuthFilter.class.getName());<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        authFilter.setName("AuthenticationFilter");<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        return new Pair&lt;&gt;(authFilter,containerClass);<a name="line.163"></a>
+<span class="sourceLineNo">164</span>      }<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    }<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    return new Pair&lt;&gt;(null, containerClass);<a name="line.166"></a>
+<span class="sourceLineNo">167</span>  }<a name="line.167"></a>
+<span class="sourceLineNo">168</span><a name="line.168"></a>
+<span class="sourceLineNo">169</span>  private static void parseCommandLine(String[] args, Configuration conf) {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    Options options = new Options();<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    options.addOption("p", "port", true, "Port to bind to [default: " + DEFAULT_LISTEN_PORT + "]");<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    options.addOption("ro", "readonly", false, "Respond only to GET HTTP " +<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      "method requests [default: false]");<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    options.addOption(null, "infoport", true, "Port for web UI");<a name="line.174"></a>
+<span class="sourceLineNo">175</span><a name="line.175"></a>
+<span class="sourceLineNo">176</span>    CommandLine commandLine = null;<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    try {<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      commandLine = new PosixParser().parse(options, args);<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    } catch (ParseException e) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      LOG.error("Could not parse: ", e);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      printUsageAndExit(options, -1);<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    }<a name="line.182"></a>
+<span class="sourceLineNo">183</span><a name="line.183"></a>
+<span class="sourceLineNo">184</span>    // check for user-defined port setting, if so override the conf<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    if (commandLine != null &amp;&amp; commandLine.hasOption("port")) {<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      String val = commandLine.getOptionValue("port");<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      conf.setInt("hbase.rest.port", Integer.parseInt(val));<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      if (LOG.isDebugEnabled()) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>        LOG.debug("port set to " + val);<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      }<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    }<a name="line.191"></a>
+<span class="sourceLineNo">192</span><a name="line.192"></a>
+<span class="sourceLineNo">193</span>    // check if server should only process GET requests, if so override the conf<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    if (commandLine != null &amp;&amp; commandLine.hasOption("readonly")) {<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      conf.setBoolean("hbase.rest.readonly", true);<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      if (LOG.isDebugEnabled()) {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>        LOG.debug("readonly set to true");<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      }<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    }<a name="line.199"></a>
+<span class="sourceLineNo">200</span><a name="line.200"></a>
+<span class="sourceLineNo">201</span>    // check for user-defined info server port setting, if so override the conf<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    if (commandLine != null &amp;&amp; commandLine.hasOption("infoport")) {<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      String val = commandLine.getOptionValue("infoport");<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      conf.setInt("hbase.rest.info.port", Integer.parseInt(val));<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      if (LOG.isDebugEnabled()) {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>        LOG.debug("Web UI port set to " + val);<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      }<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    }<a name="line.208"></a>
+<span class="sourceLineNo">209</span><a name="line.209"></a>
+<span class="sourceLineNo">210</span>    if (commandLine != null &amp;&amp; commandLine.hasOption("skipLogin")) {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>      conf.setBoolean(SKIP_LOGIN_KEY, true);<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      if (LOG.isDebugEnabled()) {<a name="line.212"></a>
+<span class="sourceLineNo">213</span>        LOG.debug("Skipping Kerberos login for REST server");<a name="line.213"></a>
+<span class="sourceLineNo">214</span>      }<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    }<a name="line.215"></a>
+<span class="sourceLineNo">216</span><a name="line.216"></a>
+<span class="sourceLineNo">217</span>    List&lt;String&gt; remainingArgs = commandLine != null ? commandLine.getArgList() : new ArrayList&lt;&gt;();<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    if (remainingArgs.size() != 1) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      printUsageAndExit(options, 1);<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    }<a name="line.220"></a>
+<span class="sourceLineNo">221</span><a name="line.221"></a>
+<span class="sourceLineNo">222</span>    String command = remainingArgs.get(0);<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    if ("start".equals(command)) {<a name="line.223"></a>
+<span class="sourceLineNo">224</span>      // continue and start container<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    } else if ("stop".equals(command)) {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>      System.exit(1);<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    } else {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      printUsageAndExit(options, 1);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
+<span class="sourceLineNo">230</span>  }<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span><a name="line.232"></a>
+<span class="sourceLineNo">233</span>  /**<a name="line.233"></a>
+<span class="sourceLineNo">234</span>   * Runs the REST server.<a name="line.234"></a>
+<span class="sourceLineNo">235</span>   */<a name="line.235"></a>
+<span class="sourceLineNo">236</span>  public synchronized void run() throws Exception {<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    Pair&lt;FilterHolder, Class&lt;? extends ServletContainer&gt;&gt; pair = loginServerPrincipal(<a name="line.237"></a>
+<span class="sourceLineNo">238</span>      userProvider, conf);<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    FilterHolder authFilter = pair.getFirst();<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    Class&lt;? extends ServletContainer&gt; containerClass = pair.getSecond();<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    RESTServlet servlet = RESTServlet.getInstance(conf, userProvider);<a name="line.241"></a>
+<span class="sourceLineNo">242</span><a name="line.242"></a>
+<span class="sourceLineNo">243</span>    // set up the Jersey servlet container for Jetty<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    ResourceConfig application = new ResourceConfig().<a name="line.244"></a>
+<span class="sourceLineNo">245</span>        packages("org.apache.hadoop.hbase.rest").register(JacksonJaxbJsonProvider.class);<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    // Using our custom ServletContainer is tremendously important. This is what makes sure the<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    // UGI.doAs() is done for the remoteUser, and calls are not made as the REST server itself.<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    ServletContainer servletContainer = ReflectionUtils.newInstance(containerClass, application);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    ServletHolder sh = new ServletHolder(servletContainer);<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>    // Set the default max thread number to 100 to limit<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    // the number of concurrent requests so that REST server doesn't OOM easily.<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    // Jetty set the default max thread number to 250, if we don't set it.<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    //<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    // Our default min thread number 2 is the same as that used by Jetty.<a name="line.255"></a>
+<span class="sourceLineNo">256</span>    int maxThreads = servlet.getConfiguration().getInt(REST_THREAD_POOL_THREADS_MAX, 100);<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    int minThreads = servlet.getConfiguration().getInt(REST_THREAD_POOL_THREADS_MIN, 2);<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    // Use the default queue (unbounded with Jetty 9.3) if the queue size is negative, otherwise use<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    // bounded {@link ArrayBlockingQueue} with the given size<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    int queueSize = servlet.getConfiguration().getInt(REST_THREAD_POOL_TASK_QUEUE_SIZE, -1);<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    int idleTimeout = servlet.getConfiguration().getInt(REST_THREAD_POOL_THREAD_IDLE_TIMEOUT, 60000);<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    QueuedThreadPool threadPool = queueSize &gt; 0 ?<a name="line.262"></a>
+<span class="sourceLineNo">263</span>        new QueuedThreadPool(maxThreads, minThreads, idleTimeout, new ArrayBlockingQueue&lt;&gt;(queueSize)) :<a name="line.263"></a>
+<span class="sourceLineNo">264</span>        new QueuedThreadPool(maxThreads, minThreads, idleTimeout);<a name="line.264"></a>
+<span class="sourceLineNo">265</span><a name="line.265"></a>
+<span class="sourceLineNo">266</span>    this.server = new Server(threadPool);<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>    // Setup JMX<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    MBeanContainer mbContainer=new MBeanContainer(ManagementFactory.getPlatformMBeanServer());<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    server.addEventListener(mbContainer);<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    server.addBean(mbContainer);<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
+<span class="sourceLineNo">274</span>    String host = servlet.getConfiguration().get("hbase.rest.host", "0.0.0.0");<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    int servicePort = servlet.getConfiguration().getInt("hbase.rest.port", 8080);<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    HttpConfiguration httpConfig = new HttpConfiguration();<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    httpConfig.setSecureScheme("https");<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    httpConfig.setSecurePort(servicePort);<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    httpConfig.setSendServerVersion(false);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    httpConfig.setSendDateHeader(false);<a name="line.280"></a>
+<span class="sourceLineNo">281</span><a name="line.281"></a>
+<span class="sourceLineNo">282</span>    ServerConnector serverConnector;<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    if (conf.getBoolean(REST_SSL_ENABLED, false)) {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      HttpConfiguration httpsConfig = new HttpConfiguration(httpConfig);<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      httpsConfig.addCustomizer(new SecureRequestCustomizer());<a name="line.285"></a>
+<span class="sourceLineNo">286</span><a name="line.286"></a>
+<span class="sourceLineNo">287</span>      SslContextFactory sslCtxFactory = new SslContextFactory();<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      String keystore = conf.get(REST_SSL_KEYSTORE_STORE);<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      String password = HBaseConfiguration.getPassword(conf,<a name="line.289"></a>
+<span class="sourceLineNo">290</span>          REST_SSL_KEYSTORE_PASSWORD, null);<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      String keyPassword = HBaseConfiguration.getPassword(conf,<a name="line.291"></a>
+<span class="sourceLineNo">292</span>          REST_SSL_KEYSTORE_KEYPASSWORD, password);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      sslCtxFactory.setKeyStorePath(keystore);<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      sslCtxFactory.setKeyStorePassword(password);<a name="line.294"></a>
+<span class="sourceLineNo">295</span>      sslCtxFactory.setKeyManagerPassword(keyPassword);<a name="line.295"></a>
+<span class="sourceLineNo">296</span><a name="line.296"></a>
+<span class="sourceLineNo">297</span>      String[] excludeCiphers = servlet.getConfiguration().getStrings(<a name="line.297"></a>
+<span class="sourceLineNo">298</span>          REST_SSL_EXCLUDE_CIPHER_SUITES, ArrayUtils.EMPTY_STRING_ARRAY);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>      if (excludeCiphers.length != 0) {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>        sslCtxFactory.setExcludeCipherSuites(excludeCiphers);<a name="line.300"></a>
+<span class="sourceLineNo">301</span>      }<a name="line.301"></a>
+<span class="sourceLineNo">302</span>      String[] includeCiphers = servlet.getConfiguration().getStrings(<a name="line.302"></a>
+<span class="sourceLineNo">303</span>          REST_SSL_INCLUDE_CIPHER_SUITES, ArrayUtils.EMPTY_STRING_ARRAY);<a name="line.303"></a>
+<span class="sourceLineNo">304</span>      if (includeCiphers.length != 0) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        sslCtxFactory.setIncludeCipherSuites(includeCiphers);<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>      String[] excludeProtocols = servlet.getConfiguration().getStrings(<a name="line.308"></a>
+<span class="sourceLineNo">309</span>          REST_SSL_EXCLUDE_PROTOCOLS, ArrayUtils.EMPTY_STRING_ARRAY);<a name="line.309"></a>
+<span class="sourceLineNo">310</span>      if (excludeProtocols.length != 0) {<a name="line.310"></a>
+<span class="sourceLineNo">311</span>        sslCtxFactory.setExcludeProtocols(excludeProtocols);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      }<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      String[] includeProtocols = servlet.getConfiguration().getStrings(<a name="line.313"></a>
+<span class="sourceLineNo">314</span>          REST_SSL_INCLUDE_PROTOCOLS, ArrayUtils.EMPTY_STRING_ARRAY);<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      if (includeProtocols.length != 0) {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>        sslCtxFactory.setIncludeProtocols(includeProtocols);<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      }<a name="line.317"></a>
+<span class="sourceLineNo">318</span><a name="line.318"></a>
+<span class="sourceLineNo">319</span>      serverConnector = new ServerConnector(server,<a name="line.319"></a>
+<span class="sourceLineNo">320</span>          new SslConnectionFactory(sslCtxFactory, HttpVersion.HTTP_1_1.toString()),<a name="line.320"></a>
+<span class="sourceLineNo">321</span>          new HttpConnectionFactory(httpsConfig));<a name="line.321"></a>
+<span class="sourceLineNo">322</span>    } else {<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      serverConnector = new ServerConnector(server, new HttpConnectionFactory(httpConfig));<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>    int acceptQueueSize = servlet.getConfiguration().getInt(REST_CONNECTOR_ACCEPT_QUEUE_SIZE, -1);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    if (acceptQueueSize &gt;= 0) {<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      serverConnector.setAcceptQueueSize(acceptQueueSize);<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>    server.addConnector(serverConnector);<a name="line.331"></a>
-<span class="sourceLineNo">332</span>    server.setStopAtShutdown(true);<a name="line.332"></a>
+<span class="sourceLineNo">331</span>    serverConnector.setPort(servicePort);<a name="line.331"></a>
+<span class="sourceLineNo">332</span>    serverConnector.setHost(host);<a name="line.332"></a>
 <span class="sourceLineNo">333</span><a name="line.333"></a>
-<span class="sourceLineNo">334</span>    // set up context<a name="line.334"></a>
-<span class="sourceLineNo">335</span>    ServletContextHandler ctxHandler = new ServletContextHandler(server, "/", ServletContextHandler.SESSIONS);<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    ctxHandler.addServlet(sh, PATH_SPEC_ANY);<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    if (authFilter != null) {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      ctxHandler.addFilter(authFilter, PATH_SPEC_ANY, EnumSet.of(DispatcherType.REQUEST));<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    }<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    // Load filters from configuration.<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    String[] filterClasses = servlet.getConfiguration().getStrings(FILTER_CLASSES,<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        GzipFilter.class.getName());<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    for (String filter : filterClasses) {<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      filter = filter.trim();<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      ctxHandler.addFilter(filter, PATH_SPEC_ANY, EnumSet.of(DispatcherType.REQUEST));<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    }<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    addCSRFFilter(ctxHandler, conf);<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    HttpServerUtil.constrainHttpMethods(ctxHandler, servlet.getConfiguration()<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        .getBoolean(REST_HTTP_ALLOW_OPTIONS_METHOD, REST_HTTP_ALLOW_OPTIONS_METHOD_DEFAULT));<a name="line.350"></a>
-<span class="sourceLineNo">351</span><a name="line.351"></a>
-<span class="sourceLineNo">352</span>    // Put up info server.<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    int port = conf.getInt("hbase.rest.info.port", 8085);<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    if (port &gt;= 0) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      conf.setLong("startcode", System.currentTimeMillis());<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      String a = conf.get("hbase.rest.info.bindAddress", "0.0.0.0");<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      this.infoServer = new InfoServer("rest", a, port, false, conf);<a name="line.357"></a>
-<span class="sourceLineNo">358</span>      this.infoServer.setAttribute("hbase.conf", conf);<a name="line.358"></a>
-<span class="sourceLineNo">359</span>      this.infoServer.start();<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    }<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    try {<a name="line.361"></a>
-<span class="sourceLineNo">362</span>      // start server<a name="line.362"></a>
-<span class="sourceLineNo">363</span>      server.start();<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    } catch (Exception e) {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      LOG.error(HBaseMarkers.FATAL, "Failed to start server", e);<a name="line.365"></a>
-<span class="sourceLineNo">366</span>      throw e;<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    }<a name="line.367"></a>
-<span class="sourceLineNo">368</span>  }<a name="line.368"></a>
-<span class="sourceLineNo">369</span><a name="line.369"></a>
-<span class="sourceLineNo">370</span>  public synchronized void join() throws Exception {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    if (server == null) {<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      throw new IllegalStateException("Server is not running");<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    server.join();<a name="line.374"></a>
-<span class="sourceLineNo">375</span>  }<a name="line.375"></a>
-<span class="sourceLineNo">376</span><a name="line.376"></a>
-<span class="sourceLineNo">377</span>  public synchronized void stop() throws Exception {<a name="line.377"></a>
-<span class="sourceLineNo">378</span>    if (server == null) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      throw new IllegalStateException("Server is not running");<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    }<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    server.stop();<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    server = null;<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    RESTServlet.stop();<a name="line.383"></a>
-<span class="sourceLineNo">384</span>  }<a name="line.384"></a>
-<span class="sourceLineNo">385</span><a name="line.385"></a>
-<span class="sourceLineNo">386</span>  public synchronized int getPort() {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    if (server == null) {<a name="line.387"></a>
-<span class="sourceLineNo">388</span>      throw new IllegalStateException("Server is not running");<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    }<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    return ((ServerConnector) server.getConnectors()[0]).getLocalPort();<a name="line.390"></a>
-<span class="sourceLineNo">391</span>  }<a name="line.391"></a>
-<span class="sourceLineNo">392</span><a name="line.392"></a>
-<span class="sourceLineNo">393</span>  @SuppressWarnings("deprecation")<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  public synchronized int getInfoPort() {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    if (infoServer == null) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>      throw new IllegalStateException("InfoServer is not running");<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    }<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    return infoServer.getPort();<a name="line.398"></a>
-<span class="sourceLineNo">399</span>  }<a name="line.399"></a>
-<span class="sourceLineNo">400</span><a name="line.400"></a>
-<span class="sourceLineNo">401</span>  public Configuration getConf() {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    return conf;<a name="line.402"></a>
-<span class="sourceLineNo">403</span>  }<a name="line.403"></a>
-<span class="sourceLineNo">404</span><a name="line.404"></a>
-<span class="sourceLineNo">405</span>  /**<a name="line.405"></a>
-<span class="sourceLineNo">406</span>   * The main method for the HBase rest server.<a name="line.406"></a>
-<span class="sourceLineNo">407</span>   * @param args command-line arguments<a name="line.407"></a>
-<span class="sourceLineNo">408</span>   * @throws Exception exception<a name="line.408"></a>
-<span class="sourceLineNo">409</span>   */<a name="line.409"></a>
-<span class="sourceLineNo">410</span>  public static void main(String[] args) throws Exception {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    LOG.info("***** STARTING service '" + RESTServer.class.getSimpleName() + "' *****");<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    VersionInfo.logVersion();<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    final Configuration conf = HBaseConfiguration.create();<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    parseCommandLine(args, conf);<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    RESTServer server = new RESTServer(conf);<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>    try {<a name="line.417"></a>
-<span class="sourceLineNo">418</span>      server.run();<a name="line.418"></a>
-<span class="sourceLineNo">419</span>      server.join();<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    } catch (Exception e) {<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      System.exit(1);<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>    LOG.info("***** STOPPING service '" + RESTServer.class.getSimpleName() + "' *****");<a name="line.424"></a>
-<span class="sourceLineNo">425</span>  }<a name="line.425"></a>
-<span class="sourceLineNo">426</span>}<a name="line.426"></a>
+<span class="sourceLineNo">334</span>    server.addConnector(serverConnector);<a name="line.334"></a>
+<span class="sourceLineNo">335</span>    server.setStopAtShutdown(true);<a name="line.335"></a>
+<span class="sourceLineNo">336</span><a name="line.336"></a>
+<span class="sourceLineNo">337</span>    // set up context<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    ServletContextHandler ctxHandler = new ServletContextHandler(server, "/", ServletContextHandler.SESSIONS);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    ctxHandler.addServlet(sh, PATH_SPEC_ANY);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    if (authFilter != null) {<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      ctxHandler.addFilter(authFilter, PATH_SPEC_ANY, EnumSet.of(DispatcherType.REQUEST));<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>    // Load filters from configuration.<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    String[] filterClasses = servlet.getConfiguration().getStrings(FILTER_CLASSES,<a name="line.345"></a>
+<span class="sourceLineNo">346</span>        GzipFilter.class.getName());<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    for (String filter : filterClasses) {<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      filter = filter.trim();<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      ctxHandler.addFilter(filter, PATH_SPEC_ANY, EnumSet.of(DispatcherType.REQUEST));<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    }<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    addCSRFFilter(ctxHandler, conf);<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    HttpServerUtil.constrainHttpMethods(ctxHandler, servlet.getConfiguration()<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        .getBoolean(REST_HTTP_ALLOW_OPTIONS_METHOD, REST_HTTP_ALLOW_OPTIONS_METHOD_DEFAULT));<a name="line.353"></a>
+<span class="sourceLineNo">354</span><a name="line.354"></a>
+<span class="sourceLineNo">355</span>    // Put up info server.<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    int port = conf.getInt("hbase.rest.info.port", 8085);<a name="line.356"></a>
+<span class="sourceLineNo">357</span>    if (port &gt;= 0) {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      conf.setLong("startcode", System.currentTimeMillis());<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      String a = conf.get("hbase.rest.info.bindAddress", "0.0.0.0");<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      this.infoServer = new InfoServer("rest", a, port, false, conf);<a name="line.360"></a>
+<span class="sourceLineNo">361</span>      this.infoServer.setAttribute("hbase.conf", conf);<a name="line.361"></a>
+<span class="sourceLineNo">362</span>      this.infoServer.start();<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    }<a name="line.363"></a>
+<span class="sourceLineNo">364</span>    try {<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      // start server<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      server.start();<a name="line.366"></a>
+<span class="sourceLineNo">367</span>    } catch (Exception e) {<a name="line.367"></a>
+<span class="sourceLineNo">368</span>      LOG.error(HBaseMarkers.FATAL, "Failed to start server", e);<a name="line.368"></a>
+<span class="sourceLineNo">369</span>      throw e;<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  }<a name="line.371"></a>
+<span class="sourceLineNo">372</span><a name="line.372"></a>
+<span class="sourceLineNo">373</span>  public synchronized void join() throws Exception {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>    if (server == null) {<a name="line.374"></a>
+<span class="sourceLineNo">375</span>      throw new IllegalStateException("Server is not running");<a name="line.375"></a>
+<span class="sourceLineNo">376</span>    }<a name="line.376"></a>
+<span class="sourceLineNo">377</span>    server.join();<a name="line.377"></a>
+<span class="sourceLineNo">378</span>  }<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>  public synchronized void stop() throws Exception {<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    if (server == null) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      throw new IllegalStateException("Server is not running");<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    }<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    server.stop();<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    server = null;<a name="line.385"></a>
+<span class="sourceLineNo">386</span>    RESTServlet.stop();<a name="line.386"></a>
+<span class="sourceLineNo">387</span>  }<a name="line.387"></a>
+<span class="sourceLineNo">388</span><a name="line.388"></a>
+<span class="sourceLineNo">389</span>  public synchronized int getPort() {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    if (server == null) {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      throw new IllegalStateException("Server is not running");<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    return ((ServerConnector) server.getConnectors()[0]).getLocalPort();<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>  @SuppressWarnings("deprecation")<a name="line.396"></a>
+<span class="sourceLineNo">397</span>  public synchronized int getInfoPort() {<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    if (infoServer == null) {<a name="line.398"></a>
+<span class="sourceLineNo">399</span>      throw new IllegalStateException("InfoServer is not running");<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    }<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    return infoServer.getPort();<a name="line.401"></a>
+<span class="sourceLineNo">402</span>  }<a name="line.402"></a>
+<span class="sourceLineNo">403</span><a name="line.403"></a>
+<span class="sourceLineNo">404</span>  public Configuration getConf() {<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    return conf;<a name="line.405"></a>
+<span class="sourceLineNo">406</span>  }<a name="line.406"></a>
+<span class="sourceLineNo">407</span><a name="line.407"></a>
+<span class="sourceLineNo">408</span>  /**<a name="line.408"></a>
+<span class="sourceLineNo">409</span>   * The main method for the HBase rest server.<a name="line.409"></a>
+<span class="sourceLineNo">410</span>   * @param args command-line arguments<a name="line.410"></a>
+<span class="sourceLineNo">411</span>   * @throws Exception exception<a name="line.411"></a>
+<span class="sourceLineNo">412</span>   */<a name="line.412"></a>
+<span class="sourceLineNo">413</span>  public static void main(String[] args) throws Exception {<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    LOG.info("***** STARTING service '" + RESTServer.class.getSimpleName() + "' *****");<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    VersionInfo.logVersion();<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    final Configuration conf = HBaseConfiguration.create();<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    parseCommandLine(args, conf);<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    RESTServer server = new RESTServer(conf);<a name="line.418"></a>
+<span class="sourceLineNo">419</span><a name="line.419"></a>
+<span class="sourceLineNo">420</span>    try {<a name="line.420"></a>
+<span class="sourceLineNo">421</span>      server.run();<a name="line.421"></a>
+<span class="sourceLineNo">422</span>      server.join();<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    } catch (Exception e) {<a name="line.423"></a>
+<span class="sourceLineNo">424</span>      System.exit(1);<a name="line.424"></a>
+<span class="sourceLineNo">425</span>    }<a name="line.425"></a>
+<span class="sourceLineNo">426</span><a name="line.426"></a>
+<span class="sourceLineNo">427</span>    LOG.info("***** STOPPING service '" + RESTServer.class.getSimpleName() + "' *****");<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>
 
 
 
diff --git a/downloads.html b/downloads.html
index 9bcd6f4..8139d33 100644
--- a/downloads.html
+++ b/downloads.html
@@ -335,7 +335,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-05</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-06</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 7b35498..afcf6f8 100644
--- a/export_control.html
+++ b/export_control.html
@@ -187,7 +187,7 @@ for more details.</p>
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-05</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-06</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 a080aea..d04ad74 100644
--- a/index.html
+++ b/index.html
@@ -267,7 +267,7 @@ Apache HBase is an open-source, distributed, versioned, non-relational database
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-05</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-06</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 0ba5010..0434e27 100644
--- a/issue-management.html
+++ b/issue-management.html
@@ -159,7 +159,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-05</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-06</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 71fc36e..6a88b40 100644
--- a/licenses.html
+++ b/licenses.html
@@ -362,7 +362,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-05</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-06</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 0570de4..fd694a6 100644
--- a/mailing-lists.html
+++ b/mailing-lists.html
@@ -212,7 +212,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-05</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-06</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 c8bf68a..d384c09 100644
--- a/metrics.html
+++ b/metrics.html
@@ -315,7 +315,7 @@ export HBASE_REGIONSERVER_OPTS=&quot;$HBASE_JMX_OPTS -Dcom.sun.management.jmxrem
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-05</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-06</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 612860b..4b181e0 100644
--- a/old_news.html
+++ b/old_news.html
@@ -296,7 +296,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-05</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-06</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 8da6be5..06ca0b9 100644
--- a/plugin-management.html
+++ b/plugin-management.html
@@ -319,7 +319,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-05</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-06</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 25edf37..6e50709 100644
--- a/plugins.html
+++ b/plugins.html
@@ -238,7 +238,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-05</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-06</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 598a01a..3b6b693 100644
--- a/poweredbyhbase.html
+++ b/poweredbyhbase.html
@@ -625,7 +625,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-05</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-06</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 28db5e5..5d36ab7 100644
--- a/project-info.html
+++ b/project-info.html
@@ -203,7 +203,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-05</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-06</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 4c7f489..d18b8c5 100644
--- a/project-reports.html
+++ b/project-reports.html
@@ -176,7 +176,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-05</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-06</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 9822a4b..6c857fe 100644
--- a/pseudo-distributed.html
+++ b/pseudo-distributed.html
@@ -164,7 +164,7 @@ Running Apache HBase (TM) in pseudo-distributed mode
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-05</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-06</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 6c1549d..617b2d1 100644
--- a/replication.html
+++ b/replication.html
@@ -159,7 +159,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-05</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-06</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 48fa2ff..9e8f868 100644
--- a/resources.html
+++ b/resources.html
@@ -187,7 +187,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-05</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-06</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 cdabe5a..981e6cd 100644
--- a/scm.html
+++ b/scm.html
@@ -170,7 +170,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-05</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-06</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 0affd78..827dd31 100644
--- a/sponsors.html
+++ b/sponsors.html
@@ -189,7 +189,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-05</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-06</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 9c27138..4039d01 100644
--- a/summary.html
+++ b/summary.html
@@ -202,7 +202,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-05</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-06</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 a1a6502..8f0e169 100644
--- a/supportingprojects.html
+++ b/supportingprojects.html
@@ -376,7 +376,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-05</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-06</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 5b45747..576297e 100644
--- a/team.html
+++ b/team.html
@@ -643,7 +643,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-05</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-03-06</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 881878d..dc7f78f 100644
--- a/testdevapidocs/index-all.html
+++ b/testdevapidocs/index-all.html
@@ -21358,6 +21358,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/TestReplicationWithTags.html#htable2">htable2</a></span> - Static variable in class org.apache.hadoop.hbase.replication.<a href="org/apache/hadoop/hbase/replication/TestReplicationWithTags.html" title="class in org.apache.hadoop.hbase.replication">TestReplicationWithTags</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/TestVerifyReplication.html#htable3">htable3</a></span> - Static variable in class org.apache.hadoop.hbase.replication.<a href="org/apache/hadoop/hbase/replication/TestVerifyReplication.html" title="class in org.apache.hadoop.hbase.replication">TestVerifyReplication</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/coprocessor/TestIncrementTimeRange.html#hTableInterface">hTableInterface</a></span> - Variable in class org.apache.hadoop.hbase.coprocessor.<a href="org/apache/hadoop/hbase/coprocessor/TestIncrementTimeRange.html" title="class in org.apache.hadoop.hbase.coprocessor">TestIncrementTimeRange</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/hbck/OfflineMetaRebuildTestCore.html#htbl">htbl</a></span> - Variable in class org.apache.hadoop.hbase.util.hbck.<a href="org/apache/hadoop/hbase/util/hbck/OfflineMetaRebuildTestCore.html" title="class in org.apache.hadoop.hbase.util.hbck">OfflineMetaRebuildTestCore</a></dt>
@@ -24202,6 +24204,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/TestReplicationBase.html#loadData-java.lang.String-byte:A-">loadData(String, byte[])</a></span> - Static method in class org.apache.hadoop.hbase.replication.<a href="org/apache/hadoop/hbase/replication/TestReplicationBase.html" title="class in org.apache.hadoop.hbase.replication">TestReplicationBase</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/TestReplicationBase.html#loadData-java.lang.String-byte:A-byte:A-">loadData(String, byte[], byte[])</a></span> - Static method in class org.apache.hadoop.hbase.replication.<a href="org/apache/hadoop/hbase/replication/TestReplicationBase.html" title="class in org.apache.hadoop.hbase.replication">TestReplicationBase</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/SnapshotTestingUtils.html#loadData-org.apache.hadoop.hbase.HBaseTestingUtility-org.apache.hadoop.hbase.TableName-int-byte:A...-">loadData(HBaseTestingUtility, TableName, int, byte[]...)</a></span> - Static method in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/SnapshotTestingUtils.html" title="class in org.apache.hadoop.hbase.snapshot">SnapshotTestingUtils</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/SnapshotTestingUtils.html#loadData-org.apache.hadoop.hbase.HBaseTestingUtility-org.apache.hadoop.hbase.client.BufferedMutator-int-byte:A...-">loadData(HBaseTestingUtility, BufferedMutator, int, byte[]...)</a></span> - Static method in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/SnapshotTestingUtils.html" title="class in org.apache.hadoop.hbase.snapshot">SnapshotTestingUtils</a></dt>
@@ -30716,6 +30720,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestMasterProcedureScheduler.TestPeerProcedure.html#peerId">peerId</a></span> - Variable in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestMasterProcedureScheduler.TestPeerProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">TestMasterProcedureScheduler.TestPeerProcedure</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/TestVerifyReplication.html#peerTableName">peerTableName</a></span> - Static variable in class org.apache.hadoop.hbase.replication.<a href="org/apache/hadoop/hbase/replication/TestVerifyReplication.html" title="class in org.apache.hadoop.hbase.replication">TestVerifyReplication</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/rest/PerformanceEvaluation.PeInputFormat.html#PeInputFormat--">PeInputFormat()</a></span> - Constructor for class org.apache.hadoop.hbase.rest.<a href="org/apache/hadoop/hbase/rest/PerformanceEvaluation.PeInputFormat.html" title="class in org.apache.hadoop.hbase.rest">PerformanceEvaluation.PeInputFormat</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/rest/PerformanceEvaluation.PeInputSplit.html#PeInputSplit--">PeInputSplit()</a></span> - Constructor for class org.apache.hadoop.hbase.rest.<a href="org/apache/hadoop/hbase/rest/PerformanceEvaluation.PeInputSplit.html" title="class in org.apache.hadoop.hbase.rest">PerformanceEvaluation.PeInputSplit</a></dt>
@@ -36791,6 +36797,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/backup/TestBackupRepair.html#runBackupAndFailAtStageWithRestore-int-">runBackupAndFailAtStageWithRestore(int)</a></span> - Method in class org.apache.hadoop.hbase.backup.<a href="org/apache/hadoop/hbase/backup/TestBackupRepair.html" title="class in org.apache.hadoop.hbase.backup">TestBackupRepair</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/TestVerifyReplication.html#runBatchCopyTest--">runBatchCopyTest()</a></span> - Static method in class org.apache.hadoop.hbase.replication.<a href="org/apache/hadoop/hbase/replication/TestVerifyReplication.html" title="class in org.apache.hadoop.hbase.replication">TestVerifyReplication</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/HFilePerformanceEvaluation.html#runBenchmark-org.apache.hadoop.hbase.HFilePerformanceEvaluation.RowOrientedBenchmark-int-java.lang.String-java.lang.String-">runBenchmark(HFilePerformanceEvaluation.RowOrientedBenchmark, int, String, String)</a></span> - Method in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/HFilePerformanceEvaluation.html" title="class in org.apache.hadoop.hbase">HFilePerformanceEvaluation [...]
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/WALPerformanceEvaluation.html#runBenchmark-java.lang.Runnable:A-int-">runBenchmark(Runnable[], int)</a></span> - Method in class org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/WALPerformanceEvaluation.html" title="class in org.apache.hadoop.hbase.wal">WALPerformanceEvaluation</a></dt>
@@ -39957,6 +39965,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/TestReplicationWithTags.html#setUpBeforeClass--">setUpBeforeClass()</a></span> - Static method in class org.apache.hadoop.hbase.replication.<a href="org/apache/hadoop/hbase/replication/TestReplicationWithTags.html" title="class in org.apache.hadoop.hbase.replication">TestReplicationWithTags</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/TestVerifyReplication.html#setUpBeforeClass--">setUpBeforeClass()</a></span> - Static method in class org.apache.hadoop.hbase.replication.<a href="org/apache/hadoop/hbase/replication/TestVerifyReplication.html" title="class in org.apache.hadoop.hbase.replication">TestVerifyReplication</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/TestVerifyReplicationCrossDiffHdfs.html#setUpBeforeClass--">setUpBeforeClass()</a></span> - Static method in class org.apache.hadoop.hbase.replication.<a href="org/apache/hadoop/hbase/replication/TestVerifyReplicationCrossDiffHdfs.html" title="class in org.apache.hadoop.hbase.replication">TestVerifyReplicationCrossDiffHdfs</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/rest/client/TestRemoteTable.html#setUpBeforeClass--">setUpBeforeClass()</a></span> - Static method in class org.apache.hadoop.hbase.rest.client.<a href="org/apache/hadoop/hbase/rest/client/TestRemoteTable.html" title="class in org.apache.hadoop.hbase.rest.client">TestRemoteTable</a></dt>
@@ -45264,6 +45274,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/TestReplicationWithTags.html#tearDownAfterClass--">tearDownAfterClass()</a></span> - Static method in class org.apache.hadoop.hbase.replication.<a href="org/apache/hadoop/hbase/replication/TestReplicationWithTags.html" title="class in org.apache.hadoop.hbase.replication">TestReplicationWithTags</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/TestVerifyReplication.html#tearDownAfterClass--">tearDownAfterClass()</a></span> - Static method in class org.apache.hadoop.hbase.replication.<a href="org/apache/hadoop/hbase/replication/TestVerifyReplication.html" title="class in org.apache.hadoop.hbase.replication">TestVerifyReplication</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/rest/client/TestRemoteHTableRetries.html#tearDownAfterClass--">tearDownAfterClass()</a></span> - Method in class org.apache.hadoop.hbase.rest.client.<a href="org/apache/hadoop/hbase/rest/client/TestRemoteHTableRetries.html" title="class in org.apache.hadoop.hbase.rest.client">TestRemoteHTableRetries</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/rest/client/TestRemoteTable.html#tearDownAfterClass--">tearDownAfterClass()</a></span> - Static method in class org.apache.hadoop.hbase.rest.client.<a href="org/apache/hadoop/hbase/rest/client/TestRemoteTable.html" title="class in org.apache.hadoop.hbase.rest.client">TestRemoteTable</a></dt>
@@ -68066,6 +68078,10 @@
 <div class="block">Do a small loading into a table, make sure the data is really the same, then run the
  VerifyReplication job to check the results.</div>
 </dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/TestVerifyReplication.html#testVerifyRepJobWithPeerTableName--">testVerifyRepJobWithPeerTableName()</a></span> - Method in class org.apache.hadoop.hbase.replication.<a href="org/apache/hadoop/hbase/replication/TestVerifyReplication.html" title="class in org.apache.hadoop.hbase.replication">TestVerifyReplication</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/TestVerifyReplication.html#testVerifyRepJobWithPeerTableNameAndSnapshotSupport--">testVerifyRepJobWithPeerTableNameAndSnapshotSupport()</a></span> - Method in class org.apache.hadoop.hbase.replication.<a href="org/apache/hadoop/hbase/replication/TestVerifyReplication.html" title="class in org.apache.hadoop.hbase.replication">TestVerifyReplication</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/TestVerifyReplication.html#testVerifyRepJobWithQuorumAddress--">testVerifyRepJobWithQuorumAddress()</a></span> - Method in class org.apache.hadoop.hbase.replication.<a href="org/apache/hadoop/hbase/replication/TestVerifyReplication.html" title="class in org.apache.hadoop.hbase.replication">TestVerifyReplication</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/TestVerifyReplication.html#testVerifyRepJobWithQuorumAddressAndSnapshotSupport--">testVerifyRepJobWithQuorumAddressAndSnapshotSupport()</a></span> - Method in class org.apache.hadoop.hbase.replication.<a href="org/apache/hadoop/hbase/replication/TestVerifyReplication.html" title="class in org.apache.hadoop.hbase.replication">TestVerifyReplication</a></dt>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/TestHBaseTestingUtility.html b/testdevapidocs/org/apache/hadoop/hbase/TestHBaseTestingUtility.html
index ee6f8a0..22ef93a 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/TestHBaseTestingUtility.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/TestHBaseTestingUtility.html
@@ -484,7 +484,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testMiniDFSCluster</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestHBaseTestingUtility.html#line.370">testMiniDFSCluster</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestHBaseTestingUtility.html#line.372">testMiniDFSCluster</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>
@@ -498,7 +498,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testSetupClusterTestBuildDir</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestHBaseTestingUtility.html#line.383">testSetupClusterTestBuildDir</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestHBaseTestingUtility.html#line.385">testSetupClusterTestBuildDir</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>
@@ -512,7 +512,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testTestDir</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestHBaseTestingUtility.html#line.398">testTestDir</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestHBaseTestingUtility.html#line.400">testTestDir</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>
@@ -526,7 +526,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testResolvePortConflict</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestHBaseTestingUtility.html#line.408">testResolvePortConflict</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestHBaseTestingUtility.html#line.410">testResolvePortConflict</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>
@@ -540,7 +540,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testOverridingOfDefaultPorts</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestHBaseTestingUtility.html#line.438">testOverridingOfDefaultPorts</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestHBaseTestingUtility.html#line.440">testOverridingOfDefaultPorts</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>
@@ -554,7 +554,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testKillMiniHBaseCluster</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestHBaseTestingUtility.html#line.477">testKillMiniHBaseCluster</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestHBaseTestingUtility.html#line.479">testKillMiniHBaseCluster</a>()
                               throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/backup/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/backup/package-tree.html
index b726ce9..7e63870 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/backup/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/backup/package-tree.html
@@ -146,8 +146,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">TestIncrementalBackupMergeWithFailures.FailurePhase</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupDeleteWithFailures.Failure.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">TestBackupDeleteWithFailures.Failure</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">TestIncrementalBackupMergeWithFailures.FailurePhase</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/client/replication/TestReplicationAdminWithClusters.html b/testdevapidocs/org/apache/hadoop/hbase/client/replication/TestReplicationAdminWithClusters.html
index ea0f34d..2f69a7f 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/client/replication/TestReplicationAdminWithClusters.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/client/replication/TestReplicationAdminWithClusters.html
@@ -283,7 +283,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/replication/TestRepli
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.replication.<a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html" title="class in org.apache.hadoop.hbase.replication">TestReplicationBase</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#cleanUp--">cleanUp</a>, <a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#configureClusters--">configureClusters</a>, <a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSerialPeer--">isSerialPeer</a>, <a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSyncPeer--">isSyncPeer</a>, <a [...]
+<code><a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#cleanUp--">cleanUp</a>, <a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#configureClusters--">configureClusters</a>, <a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSerialPeer--">isSerialPeer</a>, <a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSyncPeer--">isSyncPeer</a>, <a [...]
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
diff --git a/testdevapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
index f9b0ab1..95e74d8 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
@@ -158,8 +158,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/TestCacheOnWrite.CacheOnWriteType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">TestCacheOnWrite.CacheOnWriteType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/TagUsage.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">TagUsage</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/TestCacheOnWrite.CacheOnWriteType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">TestCacheOnWrite.CacheOnWriteType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
index c403d2b..5a01ac3 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
@@ -580,14 +580,14 @@
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <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/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/RESTApiClusterManager.Service.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">RESTApiClusterManager.Service</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ScanPerformanceEvaluation.ScanCounter.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ScanPerformanceEvaluation.ScanCounter</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/IntegrationTestRegionReplicaPerf.Stat.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">IntegrationTestRegionReplicaPerf.Stat</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ResourceChecker.Phase.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ResourceChecker.Phase</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/IntegrationTestDDLMasterFailover.ACTION.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">IntegrationTestDDLMasterFailover.ACTION</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/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.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/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/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/PerformanceEvaluation.Counter.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">PerformanceEvaluation.Counter</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 3adc0f1..f9d55c2 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
@@ -241,10 +241,10 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<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>
 <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/TestStateMachineProcedure.TestSMProcedureState.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestStateMachineProcedure.TestSMProcedureState</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
index d10429b..c83dbfb 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -702,11 +702,11 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<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/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/TestCacheOnWriteInSchema.CacheOnWriteType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestCacheOnWriteInSchema.CacheOnWriteType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestMultiLogThreshold.ActionType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestMultiLogThreshold.ActionType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestRegionServerReadRequestMetrics.Metric.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestRegionServerReadRequestMetrics.Metric</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DataBlockEncodingTool.Manipulation.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">DataBlockEncodingTool.Manipulation</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/replication/TestNamespaceReplication.html b/testdevapidocs/org/apache/hadoop/hbase/replication/TestNamespaceReplication.html
index 2fc74f0..5781c60 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/replication/TestNamespaceReplication.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/replication/TestNamespaceReplication.html
@@ -279,7 +279,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.replication.<a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html" title="class in org.apache.hadoop.hbase.replication">TestReplicationBase</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#cleanUp--">cleanUp</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#configureClusters--">configureClusters</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSyncPeer--">isSyncPeer</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#loadData-java.lang.String-byte:A-">loadData</a>, [...]
+<code><a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#cleanUp--">cleanUp</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#configureClusters--">configureClusters</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSyncPeer--">isSyncPeer</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#loadData-java.lang.String-byte:A-">loadData</a>, [...]
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
diff --git a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationBase.html b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationBase.html
index e66c34d..d7423ae 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationBase.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationBase.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":9,"i2":10,"i3":10,"i4":9,"i5":10,"i6":9,"i7":9,"i8":10,"i9":9,"i10":9,"i11":9,"i12":10,"i13":9};
+var methods = {"i0":10,"i1":9,"i2":10,"i3":10,"i4":9,"i5":9,"i6":10,"i7":9,"i8":9,"i9":10,"i10":9,"i11":9,"i12":9,"i13":10,"i14":9};
 var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -279,38 +279,44 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
         byte[]&nbsp;row)</code>&nbsp;</td>
 </tr>
 <tr id="i5" class="rowColor">
+<td class="colFirst"><code>protected static void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#loadData-java.lang.String-byte:A-byte:A-">loadData</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;prefix,
+        byte[]&nbsp;row,
+        byte[]&nbsp;familyName)</code>&nbsp;</td>
+</tr>
+<tr id="i6" class="altColor">
 <td class="colFirst"><code>private boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#peerExist-java.lang.String-">peerExist</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;peerId)</code>&nbsp;</td>
 </tr>
-<tr id="i6" class="altColor">
+<tr id="i7" class="rowColor">
 <td class="colFirst"><code>protected static void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#runSimplePutDeleteTest--">runSimplePutDeleteTest</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i7" class="rowColor">
+<tr id="i8" class="altColor">
 <td class="colFirst"><code>protected static void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#runSmallBatchTest--">runSmallBatchTest</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i8" class="altColor">
+<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/replication/TestReplicationBase.html#setUpBase--">setUpBase</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i9" class="rowColor">
+<tr id="i10" class="altColor">
 <td class="colFirst"><code>static void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#setUpBeforeClass--">setUpBeforeClass</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i10" class="altColor">
+<tr id="i11" class="rowColor">
 <td class="colFirst"><code>protected static void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#startClusters--">startClusters</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i11" class="rowColor">
+<tr id="i12" class="altColor">
 <td class="colFirst"><code>static void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#tearDownAfterClass--">tearDownAfterClass</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i12" class="altColor">
+<tr id="i13" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#tearDownBase--">tearDownBase</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i13" class="rowColor">
+<tr id="i14" class="altColor">
 <td class="colFirst"><code>protected static void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#waitForReplication-int-int-">waitForReplication</a></span>(int&nbsp;expectedRows,
                   int&nbsp;retries)</code>&nbsp;</td>
@@ -646,13 +652,29 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </dl>
 </li>
 </ul>
+<a name="loadData-java.lang.String-byte:A-byte:A-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>loadData</h4>
+<pre>protected static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationBase.html#line.170">loadData</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;prefix,
+                               byte[]&nbsp;row,
+                               byte[]&nbsp;familyName)
+                        throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
+<dl>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd>
+</dl>
+</li>
+</ul>
 <a name="configureClusters--">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>configureClusters</h4>
-<pre>protected static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationBase.html#line.176">configureClusters</a>()</pre>
+<pre>protected static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationBase.html#line.180">configureClusters</a>()</pre>
 </li>
 </ul>
 <a name="startClusters--">
@@ -661,7 +683,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>startClusters</h4>
-<pre>protected static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationBase.html#line.208">startClusters</a>()
+<pre>protected static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationBase.html#line.212">startClusters</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>
@@ -675,7 +697,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setUpBeforeClass</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationBase.html#line.253">setUpBeforeClass</a>()
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationBase.html#line.257">setUpBeforeClass</a>()
                              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -689,7 +711,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>peerExist</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationBase.html#line.258">peerExist</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;peerId)
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationBase.html#line.262">peerExist</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;peerId)
                    throws <a href="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>
@@ -703,7 +725,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setUpBase</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationBase.html#line.263">setUpBase</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationBase.html#line.267">setUpBase</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>
@@ -717,7 +739,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>tearDownBase</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationBase.html#line.282">tearDownBase</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationBase.html#line.286">tearDownBase</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>
@@ -731,7 +753,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>runSimplePutDeleteTest</h4>
-<pre>protected static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationBase.html#line.288">runSimplePutDeleteTest</a>()
+<pre>protected static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationBase.html#line.292">runSimplePutDeleteTest</a>()
                                       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
                                              <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <dl>
@@ -747,7 +769,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>runSmallBatchTest</h4>
-<pre>protected static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationBase.html#line.328">runSmallBatchTest</a>()
+<pre>protected static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationBase.html#line.332">runSmallBatchTest</a>()
                                  throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
                                         <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <dl>
@@ -763,7 +785,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>tearDownAfterClass</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationBase.html#line.343">tearDownAfterClass</a>()
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationBase.html#line.347">tearDownAfterClass</a>()
                                throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationChangingPeerRegionservers.html b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationChangingPeerRegionservers.html
index d8341ba..88a886b 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationChangingPeerRegionservers.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationChangingPeerRegionservers.html
@@ -220,7 +220,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.replication.<a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html" title="class in org.apache.hadoop.hbase.replication">TestReplicationBase</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#cleanUp--">cleanUp</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#configureClusters--">configureClusters</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#loadData-java.lang.String-byte:A-">loadData</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#runSimplePutDeleteTest--">run [...]
+<code><a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#cleanUp--">cleanUp</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#configureClusters--">configureClusters</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#loadData-java.lang.String-byte:A-">loadData</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#loadData-java.lang.String-byt [...]
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
diff --git a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationDisableInactivePeer.html b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationDisableInactivePeer.html
index 37e9e73..fe3904b 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationDisableInactivePeer.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationDisableInactivePeer.html
@@ -193,7 +193,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.replication.<a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html" title="class in org.apache.hadoop.hbase.replication">TestReplicationBase</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#cleanUp--">cleanUp</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#configureClusters--">configureClusters</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSerialPeer--">isSerialPeer</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSyncPeer--">isSyncPeer</a>, <a href="../.. [...]
+<code><a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#cleanUp--">cleanUp</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#configureClusters--">configureClusters</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSerialPeer--">isSerialPeer</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSyncPeer--">isSyncPeer</a>, <a href="../.. [...]
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
diff --git a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationDroppedTables.html b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationDroppedTables.html
index 07c5473..f8d5a2e 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationDroppedTables.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationDroppedTables.html
@@ -232,7 +232,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.replication.<a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html" title="class in org.apache.hadoop.hbase.replication">TestReplicationBase</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#cleanUp--">cleanUp</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#configureClusters--">configureClusters</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSerialPeer--">isSerialPeer</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSyncPeer--">isSyncPeer</a>, <a href="../.. [...]
+<code><a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#cleanUp--">cleanUp</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#configureClusters--">configureClusters</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSerialPeer--">isSerialPeer</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSyncPeer--">isSyncPeer</a>, <a href="../.. [...]
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
diff --git a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationEmptyWALRecovery.html b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationEmptyWALRecovery.html
index 9d76519..69755c0 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationEmptyWALRecovery.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationEmptyWALRecovery.html
@@ -197,7 +197,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.replication.<a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html" title="class in org.apache.hadoop.hbase.replication">TestReplicationBase</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#cleanUp--">cleanUp</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#configureClusters--">configureClusters</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSerialPeer--">isSerialPeer</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSyncPeer--">isSyncPeer</a>, <a href="../.. [...]
+<code><a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#cleanUp--">cleanUp</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#configureClusters--">configureClusters</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSerialPeer--">isSerialPeer</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSyncPeer--">isSyncPeer</a>, <a href="../.. [...]
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
diff --git a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html
index 5f65c47..41729f9 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html
@@ -288,7 +288,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.replication.<a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html" title="class in org.apache.hadoop.hbase.replication">TestReplicationBase</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#cleanUp--">cleanUp</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#configureClusters--">configureClusters</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSerialPeer--">isSerialPeer</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSyncPeer--">isSyncPeer</a>, <a href="../.. [...]
+<code><a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#cleanUp--">cleanUp</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#configureClusters--">configureClusters</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSerialPeer--">isSerialPeer</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSyncPeer--">isSyncPeer</a>, <a href="../.. [...]
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
diff --git a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationKillMasterRS.html b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationKillMasterRS.html
index 7353f90..33692ee 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationKillMasterRS.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationKillMasterRS.html
@@ -205,7 +205,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.replication.<a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html" title="class in org.apache.hadoop.hbase.replication">TestReplicationBase</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#cleanUp--">cleanUp</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#configureClusters--">configureClusters</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSerialPeer--">isSerialPeer</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSyncPeer--">isSyncPeer</a>, <a href="../.. [...]
+<code><a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#cleanUp--">cleanUp</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#configureClusters--">configureClusters</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSerialPeer--">isSerialPeer</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSyncPeer--">isSyncPeer</a>, <a href="../.. [...]
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
diff --git a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationKillMasterRSCompressed.html b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationKillMasterRSCompressed.html
index 8e8677b..34c9112 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationKillMasterRSCompressed.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationKillMasterRSCompressed.html
@@ -217,7 +217,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.replication.<a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html" title="class in org.apache.hadoop.hbase.replication">TestReplicationBase</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#cleanUp--">cleanUp</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#configureClusters--">configureClusters</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSerialPeer--">isSerialPeer</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSyncPeer--">isSyncPeer</a>, <a href="../.. [...]
+<code><a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#cleanUp--">cleanUp</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#configureClusters--">configureClusters</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSerialPeer--">isSerialPeer</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSyncPeer--">isSyncPeer</a>, <a href="../.. [...]
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
diff --git a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationKillMasterRSWithSeparateOldWALs.html b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationKillMasterRSWithSeparateOldWALs.html
index 87bbe36..7d7bc22 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationKillMasterRSWithSeparateOldWALs.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationKillMasterRSWithSeparateOldWALs.html
@@ -203,7 +203,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.replication.<a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html" title="class in org.apache.hadoop.hbase.replication">TestReplicationBase</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#cleanUp--">cleanUp</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#configureClusters--">configureClusters</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSerialPeer--">isSerialPeer</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSyncPeer--">isSyncPeer</a>, <a href="../.. [...]
+<code><a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#cleanUp--">cleanUp</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#configureClusters--">configureClusters</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSerialPeer--">isSerialPeer</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSyncPeer--">isSyncPeer</a>, <a href="../.. [...]
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
diff --git a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationKillRS.html b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationKillRS.html
index 9ce5b00..829b761 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationKillRS.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationKillRS.html
@@ -203,7 +203,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.replication.<a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html" title="class in org.apache.hadoop.hbase.replication">TestReplicationBase</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#cleanUp--">cleanUp</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#configureClusters--">configureClusters</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSerialPeer--">isSerialPeer</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSyncPeer--">isSyncPeer</a>, <a href="../.. [...]
+<code><a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#cleanUp--">cleanUp</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#configureClusters--">configureClusters</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSerialPeer--">isSerialPeer</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSyncPeer--">isSyncPeer</a>, <a href="../.. [...]
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
diff --git a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationKillSlaveRS.html b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationKillSlaveRS.html
index c81cbc0..7137e57 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationKillSlaveRS.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationKillSlaveRS.html
@@ -201,7 +201,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.replication.<a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html" title="class in org.apache.hadoop.hbase.replication">TestReplicationBase</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#cleanUp--">cleanUp</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#configureClusters--">configureClusters</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSerialPeer--">isSerialPeer</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSyncPeer--">isSyncPeer</a>, <a href="../.. [...]
+<code><a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#cleanUp--">cleanUp</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#configureClusters--">configureClusters</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSerialPeer--">isSerialPeer</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSyncPeer--">isSyncPeer</a>, <a href="../.. [...]
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
diff --git a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationKillSlaveRSWithSeparateOldWALs.html b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationKillSlaveRSWithSeparateOldWALs.html
index a3a3df7..a8b3346 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationKillSlaveRSWithSeparateOldWALs.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationKillSlaveRSWithSeparateOldWALs.html
@@ -203,7 +203,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.replication.<a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html" title="class in org.apache.hadoop.hbase.replication">TestReplicationBase</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#cleanUp--">cleanUp</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#configureClusters--">configureClusters</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSerialPeer--">isSerialPeer</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSyncPeer--">isSyncPeer</a>, <a href="../.. [...]
+<code><a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#cleanUp--">cleanUp</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#configureClusters--">configureClusters</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSerialPeer--">isSerialPeer</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSyncPeer--">isSyncPeer</a>, <a href="../.. [...]
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
diff --git a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationMetricsforUI.html b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationMetricsforUI.html
index fbcdc29..d0c8b9f 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationMetricsforUI.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationMetricsforUI.html
@@ -191,7 +191,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.replication.<a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html" title="class in org.apache.hadoop.hbase.replication">TestReplicationBase</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#cleanUp--">cleanUp</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#configureClusters--">configureClusters</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSerialPeer--">isSerialPeer</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSyncPeer--">isSyncPeer</a>, <a href="../.. [...]
+<code><a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#cleanUp--">cleanUp</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#configureClusters--">configureClusters</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSerialPeer--">isSerialPeer</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSyncPeer--">isSyncPeer</a>, <a href="../.. [...]
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
diff --git a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationSmallTests.html b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationSmallTests.html
index cea4d96..cbaf508 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationSmallTests.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationSmallTests.html
@@ -261,7 +261,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.replication.<a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html" title="class in org.apache.hadoop.hbase.replication">TestReplicationBase</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#cleanUp--">cleanUp</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#configureClusters--">configureClusters</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSyncPeer--">isSyncPeer</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#loadData-java.lang.String-byte:A-">loadData</a>, [...]
+<code><a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#cleanUp--">cleanUp</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#configureClusters--">configureClusters</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSyncPeer--">isSyncPeer</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#loadData-java.lang.String-byte:A-">loadData</a>, [...]
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
diff --git a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationSmallTestsSync.html b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationSmallTestsSync.html
index 7e49fd1..05bfc5b 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationSmallTestsSync.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationSmallTestsSync.html
@@ -206,7 +206,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.replication.<a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html" title="class in org.apache.hadoop.hbase.replication">TestReplicationBase</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#cleanUp--">cleanUp</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#configureClusters--">configureClusters</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#loadData-java.lang.String-byte:A-">loadData</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#runSimplePutDeleteTest--">run [...]
+<code><a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#cleanUp--">cleanUp</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#configureClusters--">configureClusters</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#loadData-java.lang.String-byte:A-">loadData</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#loadData-java.lang.String-byt [...]
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
diff --git a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationStatus.html b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationStatus.html
index e84b038..124a09c 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationStatus.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationStatus.html
@@ -238,7 +238,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.replication.<a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html" title="class in org.apache.hadoop.hbase.replication">TestReplicationBase</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#cleanUp--">cleanUp</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#configureClusters--">configureClusters</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSerialPeer--">isSerialPeer</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSyncPeer--">isSyncPeer</a>, <a href="../.. [...]
+<code><a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#cleanUp--">cleanUp</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#configureClusters--">configureClusters</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSerialPeer--">isSerialPeer</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSyncPeer--">isSyncPeer</a>, <a href="../.. [...]
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
diff --git a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationSyncUpTool.html b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationSyncUpTool.html
index 2f5b86c..a195ee2 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationSyncUpTool.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationSyncUpTool.html
@@ -279,7 +279,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.replication.<a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html" title="class in org.apache.hadoop.hbase.replication">TestReplicationBase</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#cleanUp--">cleanUp</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#configureClusters--">configureClusters</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSerialPeer--">isSerialPeer</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSyncPeer--">isSyncPeer</a>, <a href="../.. [...]
+<code><a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#cleanUp--">cleanUp</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#configureClusters--">configureClusters</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSerialPeer--">isSerialPeer</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSyncPeer--">isSyncPeer</a>, <a href="../.. [...]
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
diff --git a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationSyncUpToolWithBulkLoadedData.html b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationSyncUpToolWithBulkLoadedData.html
index 670607b..1910ff0 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationSyncUpToolWithBulkLoadedData.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationSyncUpToolWithBulkLoadedData.html
@@ -242,7 +242,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.replication.<a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html" title="class in org.apache.hadoop.hbase.replication">TestReplicationBase</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#cleanUp--">cleanUp</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#configureClusters--">configureClusters</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSerialPeer--">isSerialPeer</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSyncPeer--">isSyncPeer</a>, <a href="../.. [...]
+<code><a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#cleanUp--">cleanUp</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#configureClusters--">configureClusters</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSerialPeer--">isSerialPeer</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSyncPeer--">isSyncPeer</a>, <a href="../.. [...]
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
diff --git a/testdevapidocs/org/apache/hadoop/hbase/replication/TestVerifyReplication.html b/testdevapidocs/org/apache/hadoop/hbase/replication/TestVerifyReplication.html
index 92f01a7..58f1078 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/replication/TestVerifyReplication.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/replication/TestVerifyReplication.html
@@ -18,8 +18,8 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10};
-var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
+var methods = {"i0":10,"i1":9,"i2":10,"i3":10,"i4":9,"i5":9,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10};
+var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
 var tableTab = "tableTab";
@@ -114,7 +114,7 @@ var activeTableTab = "activeTableTab";
 <li class="blockList">
 <hr>
 <br>
-<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestVerifyReplication.html#line.72">TestVerifyReplication</a>
+<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestVerifyReplication.html#line.77">TestVerifyReplication</a>
 extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html" title="class in org.apache.hadoop.hbase.replication">TestReplicationBase</a></pre>
 </li>
 </ul>
@@ -139,17 +139,25 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/replication/TestVerifyReplication.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
+<td class="colFirst"><code>private static org.apache.hadoop.hbase.client.Table</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/replication/TestVerifyReplication.html#htable3">htable3</a></span></code>&nbsp;</td>
+</tr>
+<tr class="altColor">
 <td class="colFirst"><code>private static org.slf4j.Logger</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/replication/TestVerifyReplication.html#LOG">LOG</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>org.junit.rules.TestName</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/replication/TestVerifyReplication.html#name">name</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/replication/TestVerifyReplication.html#PEER_ID">PEER_ID</a></span></code>&nbsp;</td>
 </tr>
+<tr class="rowColor">
+<td class="colFirst"><code>private static org.apache.hadoop.hbase.TableName</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/replication/TestVerifyReplication.html#peerTableName">peerTableName</a></span></code>&nbsp;</td>
+</tr>
 </table>
 <ul class="blockList">
 <li class="blockList"><a name="fields.inherited.from.class.org.apache.hadoop.hbase.replication.TestReplicationBase">
@@ -184,7 +192,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
 </a>
 <h3>Method Summary</h3>
 <table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Method Summary table, listing methods, and an explanation">
-<caption><span id="t0" class="activeTableTab"><span>All Methods</span><span class="tabEnd">&nbsp;</span></span><span id="t2" class="tableTab"><span><a href="javascript:show(2);">Instance Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t4" class="tableTab"><span><a href="javascript:show(8);">Concrete Methods</a></span><span class="tabEnd">&nbsp;</span></span></caption>
+<caption><span id="t0" class="activeTableTab"><span>All Methods</span><span class="tabEnd">&nbsp;</span></span><span id="t1" class="tableTab"><span><a href="javascript:show(1);">Static Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t2" class="tableTab"><span><a href="javascript:show(2);">Instance Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t4" class="tableTab"><span><a href="javascript:show(8);">Concrete Methods</a></span><span class="tabEnd [...]
 <tr>
 <th class="colFirst" scope="col">Modifier and Type</th>
 <th class="colLast" scope="col">Method and Description</th>
@@ -196,54 +204,74 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
                   int&nbsp;expectedCount)</code>&nbsp;</td>
 </tr>
 <tr id="i1" class="rowColor">
+<td class="colFirst"><code>private static void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/replication/TestVerifyReplication.html#runBatchCopyTest--">runBatchCopyTest</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i2" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/replication/TestVerifyReplication.html#runVerifyReplication-java.lang.String:A-int-int-">runVerifyReplication</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args,
                     int&nbsp;expectedGoodRows,
                     int&nbsp;expectedBadRows)</code>&nbsp;</td>
 </tr>
-<tr id="i2" class="altColor">
+<tr id="i3" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/replication/TestVerifyReplication.html#setUp--">setUp</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i3" class="rowColor">
+<tr id="i4" class="altColor">
+<td class="colFirst"><code>static void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/replication/TestVerifyReplication.html#setUpBeforeClass--">setUpBeforeClass</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i5" class="rowColor">
+<td class="colFirst"><code>static void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/replication/TestVerifyReplication.html#tearDownAfterClass--">tearDownAfterClass</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i6" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/replication/TestVerifyReplication.html#testHBase14905--">testHBase14905</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i4" class="altColor">
+<tr id="i7" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/replication/TestVerifyReplication.html#testVerifyRepJob--">testVerifyRepJob</a></span>()</code>
 <div class="block">Do a small loading into a table, make sure the data is really the same, then run the
  VerifyReplication job to check the results.</div>
 </td>
 </tr>
-<tr id="i5" class="rowColor">
+<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/replication/TestVerifyReplication.html#testVerifyRepJobWithPeerTableName--">testVerifyRepJobWithPeerTableName</a></span>()</code>&nbsp;</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/replication/TestVerifyReplication.html#testVerifyRepJobWithPeerTableNameAndSnapshotSupport--">testVerifyRepJobWithPeerTableNameAndSnapshotSupport</a></span>()</code>&nbsp;</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/replication/TestVerifyReplication.html#testVerifyRepJobWithQuorumAddress--">testVerifyRepJobWithQuorumAddress</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i6" class="altColor">
+<tr id="i11" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/replication/TestVerifyReplication.html#testVerifyRepJobWithQuorumAddressAndSnapshotSupport--">testVerifyRepJobWithQuorumAddressAndSnapshotSupport</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i7" class="rowColor">
+<tr id="i12" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/replication/TestVerifyReplication.html#testVerifyRepJobWithRawOptions--">testVerifyRepJobWithRawOptions</a></span>()</code>
 <div class="block">Load a row into a table, make sure the data is really the same, delete the row, make sure the
  delete marker is replicated, run verify replication with and without raw to check the results.</div>
 </td>
 </tr>
-<tr id="i8" class="altColor">
+<tr id="i13" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/replication/TestVerifyReplication.html#testVerifyReplicationPrefixFiltering--">testVerifyReplicationPrefixFiltering</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i9" class="rowColor">
+<tr id="i14" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/replication/TestVerifyReplication.html#testVerifyReplicationSnapshotArguments--">testVerifyReplicationSnapshotArguments</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i10" class="altColor">
+<tr id="i15" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/replication/TestVerifyReplication.html#testVerifyReplicationWithSnapshotSupport--">testVerifyReplicationWithSnapshotSupport</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i11" class="rowColor">
+<tr id="i16" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/replication/TestVerifyReplication.html#testVersionMismatchHBase14905--">testVersionMismatchHBase14905</a></span>()</code>&nbsp;</td>
 </tr>
@@ -253,7 +281,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.replication.<a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html" title="class in org.apache.hadoop.hbase.replication">TestReplicationBase</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#cleanUp--">cleanUp</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#configureClusters--">configureClusters</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSerialPeer--">isSerialPeer</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSyncPeer--">isSyncPeer</a>, <a href="../.. [...]
+<code><a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#cleanUp--">cleanUp</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#configureClusters--">configureClusters</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSerialPeer--">isSerialPeer</a>, <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSyncPeer--">isSyncPeer</a>, <a href="../.. [...]
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
@@ -282,7 +310,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
 <ul class="blockList">
 <li class="blockList">
 <h4>CLASS_RULE</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestVerifyReplication.html#line.75">CLASS_RULE</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestVerifyReplication.html#line.80">CLASS_RULE</a></pre>
 </li>
 </ul>
 <a name="LOG">
@@ -291,7 +319,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
 <ul class="blockList">
 <li class="blockList">
 <h4>LOG</h4>
-<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestVerifyReplication.html#line.78">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestVerifyReplication.html#line.83">LOG</a></pre>
 </li>
 </ul>
 <a name="PEER_ID">
@@ -300,20 +328,38 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
 <ul class="blockList">
 <li class="blockList">
 <h4>PEER_ID</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestVerifyReplication.html#line.80">PEER_ID</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestVerifyReplication.html#line.85">PEER_ID</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.replication.TestVerifyReplication.PEER_ID">Constant Field Values</a></dd>
 </dl>
 </li>
 </ul>
+<a name="peerTableName">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>peerTableName</h4>
+<pre>private static final&nbsp;org.apache.hadoop.hbase.TableName <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestVerifyReplication.html#line.86">peerTableName</a></pre>
+</li>
+</ul>
+<a name="htable3">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>htable3</h4>
+<pre>private static&nbsp;org.apache.hadoop.hbase.client.Table <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestVerifyReplication.html#line.87">htable3</a></pre>
+</li>
+</ul>
 <a name="name">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>name</h4>
-<pre>public&nbsp;org.junit.rules.TestName <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestVerifyReplication.html#line.83">name</a></pre>
+<pre>public&nbsp;org.junit.rules.TestName <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestVerifyReplication.html#line.90">name</a></pre>
 </li>
 </ul>
 </li>
@@ -330,7 +376,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TestVerifyReplication</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestVerifyReplication.html#line.72">TestVerifyReplication</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestVerifyReplication.html#line.77">TestVerifyReplication</a>()</pre>
 </li>
 </ul>
 </li>
@@ -347,7 +393,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
 <ul class="blockList">
 <li class="blockList">
 <h4>setUp</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestVerifyReplication.html#line.86">setUp</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestVerifyReplication.html#line.93">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>
@@ -355,13 +401,27 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
 </dl>
 </li>
 </ul>
+<a name="setUpBeforeClass--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>setUpBeforeClass</h4>
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestVerifyReplication.html#line.99">setUpBeforeClass</a>()
+                             throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
+<dl>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></code></dd>
+</dl>
+</li>
+</ul>
 <a name="runVerifyReplication-java.lang.String:A-int-int-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>runVerifyReplication</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestVerifyReplication.html#line.90">runVerifyReplication</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestVerifyReplication.html#line.113">runVerifyReplication</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args,
                                   int&nbsp;expectedGoodRows,
                                   int&nbsp;expectedBadRows)
                            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>,
@@ -381,7 +441,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
 <ul class="blockList">
 <li class="blockList">
 <h4>testVerifyRepJob</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestVerifyReplication.html#line.111">testVerifyRepJob</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestVerifyReplication.html#line.134">testVerifyRepJob</a>()
                       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <div class="block">Do a small loading into a table, make sure the data is really the same, then run the
  VerifyReplication job to check the results. Do a second comparison where all the cells are
@@ -398,7 +458,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
 <ul class="blockList">
 <li class="blockList">
 <h4>testVerifyRepJobWithRawOptions</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestVerifyReplication.html#line.139">testVerifyRepJobWithRawOptions</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestVerifyReplication.html#line.162">testVerifyRepJobWithRawOptions</a>()
                                     throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <div class="block">Load a row into a table, make sure the data is really the same, delete the row, make sure the
  delete marker is replicated, run verify replication with and without raw to check the results.</div>
@@ -414,7 +474,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
 <ul class="blockList">
 <li class="blockList">
 <h4>testHBase14905</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestVerifyReplication.html#line.228">testHBase14905</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestVerifyReplication.html#line.251">testHBase14905</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>
@@ -428,7 +488,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
 <ul class="blockList">
 <li class="blockList">
 <h4>testVersionMismatchHBase14905</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestVerifyReplication.html#line.291">testVersionMismatchHBase14905</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestVerifyReplication.html#line.314">testVersionMismatchHBase14905</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>
@@ -442,7 +502,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
 <ul class="blockList">
 <li class="blockList">
 <h4>testVerifyReplicationPrefixFiltering</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestVerifyReplication.html#line.359">testVerifyReplicationPrefixFiltering</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestVerifyReplication.html#line.382">testVerifyReplicationPrefixFiltering</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>
@@ -456,7 +516,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
 <ul class="blockList">
 <li class="blockList">
 <h4>testVerifyReplicationSnapshotArguments</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestVerifyReplication.html#line.373">testVerifyReplicationSnapshotArguments</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestVerifyReplication.html#line.396">testVerifyReplicationSnapshotArguments</a>()</pre>
 </li>
 </ul>
 <a name="checkRestoreTmpDir-org.apache.hadoop.conf.Configuration-java.lang.String-int-">
@@ -465,7 +525,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
 <ul class="blockList">
 <li class="blockList">
 <h4>checkRestoreTmpDir</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestVerifyReplication.html#line.403">checkRestoreTmpDir</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestVerifyReplication.html#line.426">checkRestoreTmpDir</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                                 <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;restoreTmpDir,
                                 int&nbsp;expectedCount)
                          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>
@@ -481,7 +541,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
 <ul class="blockList">
 <li class="blockList">
 <h4>testVerifyReplicationWithSnapshotSupport</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestVerifyReplication.html#line.415">testVerifyReplicationWithSnapshotSupport</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestVerifyReplication.html#line.438">testVerifyReplicationWithSnapshotSupport</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>
@@ -495,7 +555,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
 <ul class="blockList">
 <li class="blockList">
 <h4>testVerifyRepJobWithQuorumAddress</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestVerifyReplication.html#line.477">testVerifyRepJobWithQuorumAddress</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestVerifyReplication.html#line.500">testVerifyRepJobWithQuorumAddress</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>
@@ -506,10 +566,52 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
 <a name="testVerifyRepJobWithQuorumAddressAndSnapshotSupport--">
 <!--   -->
 </a>
-<ul class="blockListLast">
+<ul class="blockList">
 <li class="blockList">
 <h4>testVerifyRepJobWithQuorumAddressAndSnapshotSupport</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestVerifyReplication.html#line.502">testVerifyRepJobWithQuorumAddressAndSnapshotSupport</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestVerifyReplication.html#line.525">testVerifyRepJobWithQuorumAddressAndSnapshotSupport</a>()
+                                                         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
+<dl>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></code></dd>
+</dl>
+</li>
+</ul>
+<a name="runBatchCopyTest--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>runBatchCopyTest</h4>
+<pre>private static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestVerifyReplication.html#line.588">runBatchCopyTest</a>()
+                              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
+<dl>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></code></dd>
+</dl>
+</li>
+</ul>
+<a name="testVerifyRepJobWithPeerTableName--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>testVerifyRepJobWithPeerTableName</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestVerifyReplication.html#line.617">testVerifyRepJobWithPeerTableName</a>()
+                                       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
+<dl>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></code></dd>
+</dl>
+</li>
+</ul>
+<a name="testVerifyRepJobWithPeerTableNameAndSnapshotSupport--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>testVerifyRepJobWithPeerTableNameAndSnapshotSupport</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestVerifyReplication.html#line.631">testVerifyRepJobWithPeerTableNameAndSnapshotSupport</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>
@@ -517,6 +619,20 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
 </dl>
 </li>
 </ul>
+<a name="tearDownAfterClass--">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>tearDownAfterClass</h4>
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestVerifyReplication.html#line.696">tearDownAfterClass</a>()
+                               throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
+<dl>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></code></dd>
+</dl>
+</li>
+</ul>
 </li>
 </ul>
 </li>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/replication/multiwal/TestReplicationEndpointWithMultipleAsyncWAL.html b/testdevapidocs/org/apache/hadoop/hbase/replication/multiwal/TestReplicationEndpointWithMultipleAsyncWAL.html
index b6f5ef8..88bc69e 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/replication/multiwal/TestReplicationEndpointWithMultipleAsyncWAL.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/replication/multiwal/TestReplicationEndpointWithMultipleAsyncWAL.html
@@ -214,7 +214,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/replication/TestRepli
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.replication.<a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html" title="class in org.apache.hadoop.hbase.replication">TestReplicationBase</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#cleanUp--">cleanUp</a>, <a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#configureClusters--">configureClusters</a>, <a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSerialPeer--">isSerialPeer</a>, <a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSyncPeer--">isSyncPeer</a>, <a [...]
+<code><a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#cleanUp--">cleanUp</a>, <a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#configureClusters--">configureClusters</a>, <a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSerialPeer--">isSerialPeer</a>, <a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSyncPeer--">isSyncPeer</a>, <a [...]
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
diff --git a/testdevapidocs/org/apache/hadoop/hbase/replication/multiwal/TestReplicationEndpointWithMultipleWAL.html b/testdevapidocs/org/apache/hadoop/hbase/replication/multiwal/TestReplicationEndpointWithMultipleWAL.html
index 2741792..010bae7 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/replication/multiwal/TestReplicationEndpointWithMultipleWAL.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/replication/multiwal/TestReplicationEndpointWithMultipleWAL.html
@@ -214,7 +214,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/replication/TestRepli
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.replication.<a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html" title="class in org.apache.hadoop.hbase.replication">TestReplicationBase</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#cleanUp--">cleanUp</a>, <a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#configureClusters--">configureClusters</a>, <a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSerialPeer--">isSerialPeer</a>, <a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSyncPeer--">isSyncPeer</a>, <a [...]
+<code><a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#cleanUp--">cleanUp</a>, <a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#configureClusters--">configureClusters</a>, <a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSerialPeer--">isSerialPeer</a>, <a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSyncPeer--">isSyncPeer</a>, <a [...]
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
diff --git a/testdevapidocs/org/apache/hadoop/hbase/replication/multiwal/TestReplicationKillMasterRSCompressedWithMultipleAsyncWAL.html b/testdevapidocs/org/apache/hadoop/hbase/replication/multiwal/TestReplicationKillMasterRSCompressedWithMultipleAsyncWAL.html
index 7873eee..517e735 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/replication/multiwal/TestReplicationKillMasterRSCompressedWithMultipleAsyncWAL.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/replication/multiwal/TestReplicationKillMasterRSCompressedWithMultipleAsyncWAL.html
@@ -216,7 +216,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/replication/TestRepli
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.replication.<a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html" title="class in org.apache.hadoop.hbase.replication">TestReplicationBase</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#cleanUp--">cleanUp</a>, <a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#configureClusters--">configureClusters</a>, <a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSerialPeer--">isSerialPeer</a>, <a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSyncPeer--">isSyncPeer</a>, <a [...]
+<code><a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#cleanUp--">cleanUp</a>, <a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#configureClusters--">configureClusters</a>, <a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSerialPeer--">isSerialPeer</a>, <a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSyncPeer--">isSyncPeer</a>, <a [...]
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
diff --git a/testdevapidocs/org/apache/hadoop/hbase/replication/multiwal/TestReplicationKillMasterRSCompressedWithMultipleWAL.html b/testdevapidocs/org/apache/hadoop/hbase/replication/multiwal/TestReplicationKillMasterRSCompressedWithMultipleWAL.html
index 81c876b..7e20eed 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/replication/multiwal/TestReplicationKillMasterRSCompressedWithMultipleWAL.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/replication/multiwal/TestReplicationKillMasterRSCompressedWithMultipleWAL.html
@@ -216,7 +216,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/replication/TestRepli
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.replication.<a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html" title="class in org.apache.hadoop.hbase.replication">TestReplicationBase</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#cleanUp--">cleanUp</a>, <a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#configureClusters--">configureClusters</a>, <a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSerialPeer--">isSerialPeer</a>, <a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSyncPeer--">isSyncPeer</a>, <a [...]
+<code><a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#cleanUp--">cleanUp</a>, <a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#configureClusters--">configureClusters</a>, <a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSerialPeer--">isSerialPeer</a>, <a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSyncPeer--">isSyncPeer</a>, <a [...]
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
diff --git a/testdevapidocs/org/apache/hadoop/hbase/replication/multiwal/TestReplicationSyncUpToolWithMultipleAsyncWAL.html b/testdevapidocs/org/apache/hadoop/hbase/replication/multiwal/TestReplicationSyncUpToolWithMultipleAsyncWAL.html
index 6fa3771..1c284e6 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/replication/multiwal/TestReplicationSyncUpToolWithMultipleAsyncWAL.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/replication/multiwal/TestReplicationSyncUpToolWithMultipleAsyncWAL.html
@@ -206,7 +206,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/replication/TestRepli
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.replication.<a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html" title="class in org.apache.hadoop.hbase.replication">TestReplicationBase</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#cleanUp--">cleanUp</a>, <a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#configureClusters--">configureClusters</a>, <a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSerialPeer--">isSerialPeer</a>, <a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSyncPeer--">isSyncPeer</a>, <a [...]
+<code><a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#cleanUp--">cleanUp</a>, <a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#configureClusters--">configureClusters</a>, <a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSerialPeer--">isSerialPeer</a>, <a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSyncPeer--">isSyncPeer</a>, <a [...]
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
diff --git a/testdevapidocs/org/apache/hadoop/hbase/replication/multiwal/TestReplicationSyncUpToolWithMultipleWAL.html b/testdevapidocs/org/apache/hadoop/hbase/replication/multiwal/TestReplicationSyncUpToolWithMultipleWAL.html
index d38442f..31c1975 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/replication/multiwal/TestReplicationSyncUpToolWithMultipleWAL.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/replication/multiwal/TestReplicationSyncUpToolWithMultipleWAL.html
@@ -206,7 +206,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/replication/TestRepli
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.replication.<a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html" title="class in org.apache.hadoop.hbase.replication">TestReplicationBase</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#cleanUp--">cleanUp</a>, <a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#configureClusters--">configureClusters</a>, <a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSerialPeer--">isSerialPeer</a>, <a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSyncPeer--">isSyncPeer</a>, <a [...]
+<code><a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#cleanUp--">cleanUp</a>, <a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#configureClusters--">configureClusters</a>, <a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSerialPeer--">isSerialPeer</a>, <a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSyncPeer--">isSyncPeer</a>, <a [...]
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
diff --git a/testdevapidocs/org/apache/hadoop/hbase/replication/regionserver/TestReplicator.html b/testdevapidocs/org/apache/hadoop/hbase/replication/regionserver/TestReplicator.html
index ff29f32..05b2748 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/replication/regionserver/TestReplicator.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/replication/regionserver/TestReplicator.html
@@ -235,7 +235,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/replication/TestRepli
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.replication.<a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html" title="class in org.apache.hadoop.hbase.replication">TestReplicationBase</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#cleanUp--">cleanUp</a>, <a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#configureClusters--">configureClusters</a>, <a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSerialPeer--">isSerialPeer</a>, <a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSyncPeer--">isSyncPeer</a>, <a [...]
+<code><a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#cleanUp--">cleanUp</a>, <a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#configureClusters--">configureClusters</a>, <a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSerialPeer--">isSerialPeer</a>, <a href="../../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html#isSyncPeer--">isSyncPeer</a>, <a [...]
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
diff --git a/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
index 9863adc..5d7e588 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
@@ -253,9 +253,9 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Verify.Counts.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestBigLinkedList.Verify.Counts</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestWithCellVisibilityLoadAndVerify.Counters.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestWithCellVisibilityLoadAndVerify.Counters</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/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>
+<li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Verify.Counts.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestBigLinkedList.Verify.Counts</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Generator.Counts.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestBigLinkedList.Generator.Counts</span></a></li>
 </ul>
 </li>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
index f4cae08..a9f83d0 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
@@ -148,9 +148,9 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/FaultyFSLog.FailureType.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">FaultyFSLog.FailureType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">IOTestProvider.AllowedOperations</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/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/IOTestProvider.AllowedOperations.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">IOTestProvider.AllowedOperations</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/FaultyFSLog.FailureType.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">FaultyFSLog.FailureType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/TestHBaseTestingUtility.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/TestHBaseTestingUtility.html
index 25ea240..3778f26 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/TestHBaseTestingUtility.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/TestHBaseTestingUtility.html
@@ -283,230 +283,232 @@
 <span class="sourceLineNo">275</span>      List&lt;Integer&gt; clientPortListInCluster = cluster1.getClientPortList();<a name="line.275"></a>
 <span class="sourceLineNo">276</span><a name="line.276"></a>
 <span class="sourceLineNo">277</span>      for (i = 0; i &lt; clientPortListInCluster.size(); i++) {<a name="line.277"></a>
-<span class="sourceLineNo">278</span>        assertEquals(clientPortListInCluster.get(i).intValue(), clientPortList1[i]);<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      }<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    } finally {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      hbt.shutdownMiniZKCluster();<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    }<a name="line.282"></a>
-<span class="sourceLineNo">283</span><a name="line.283"></a>
-<span class="sourceLineNo">284</span>    // Test 2 - set up zookeeper cluster with more ZK servers than specified client ports<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    hbt.getConfiguration().setInt("test.hbase.zookeeper.property.clientPort", defaultClientPort);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    int [] clientPortList2 = {2222, 2223};<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    MiniZooKeeperCluster cluster2 =<a name="line.287"></a>
-<span class="sourceLineNo">288</span>        hbt.startMiniZKCluster(clientPortList2.length + 2, clientPortList2);<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span>    try {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      List&lt;Integer&gt; clientPortListInCluster = cluster2.getClientPortList();<a name="line.291"></a>
-<span class="sourceLineNo">292</span><a name="line.292"></a>
-<span class="sourceLineNo">293</span>      for (i = 0, j = 0; i &lt; clientPortListInCluster.size(); i++) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        if (i &lt; clientPortList2.length) {<a name="line.294"></a>
-<span class="sourceLineNo">295</span>          assertEquals(clientPortListInCluster.get(i).intValue(), clientPortList2[i]);<a name="line.295"></a>
-<span class="sourceLineNo">296</span>        } else {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>          // servers with no specified client port will use defaultClientPort or some other ports<a name="line.297"></a>
-<span class="sourceLineNo">298</span>          // based on defaultClientPort<a name="line.298"></a>
-<span class="sourceLineNo">299</span>          assertEquals(clientPortListInCluster.get(i).intValue(), defaultClientPort + j);<a name="line.299"></a>
-<span class="sourceLineNo">300</span>          j++;<a name="line.300"></a>
-<span class="sourceLineNo">301</span>        }<a name="line.301"></a>
-<span class="sourceLineNo">302</span>      }<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    } finally {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>      hbt.shutdownMiniZKCluster();<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>    // Test 3 - set up zookeeper cluster with invalid client ports<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    hbt.getConfiguration().setInt("test.hbase.zookeeper.property.clientPort", defaultClientPort);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    int [] clientPortList3 = {3333, -3334, 3335, 0};<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    MiniZooKeeperCluster cluster3 =<a name="line.310"></a>
-<span class="sourceLineNo">311</span>        hbt.startMiniZKCluster(clientPortList3.length + 1, clientPortList3);<a name="line.311"></a>
-<span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>    try {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      List&lt;Integer&gt; clientPortListInCluster = cluster3.getClientPortList();<a name="line.314"></a>
-<span class="sourceLineNo">315</span><a name="line.315"></a>
-<span class="sourceLineNo">316</span>      for (i = 0, j = 0; i &lt; clientPortListInCluster.size(); i++) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        // Servers will only use valid client ports; if ports are not specified or invalid,<a name="line.317"></a>
-<span class="sourceLineNo">318</span>        // the default port or a port based on default port will be used.<a name="line.318"></a>
-<span class="sourceLineNo">319</span>        if (i &lt; clientPortList3.length &amp;&amp; clientPortList3[i] &gt; 0) {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>          assertEquals(clientPortListInCluster.get(i).intValue(), clientPortList3[i]);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>        } else {<a name="line.321"></a>
-<span class="sourceLineNo">322</span>          assertEquals(clientPortListInCluster.get(i).intValue(), defaultClientPort + j);<a name="line.322"></a>
-<span class="sourceLineNo">323</span>          j++;<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>    } finally {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      hbt.shutdownMiniZKCluster();<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>    // Test 4 - set up zookeeper cluster with default port and some other ports used<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    // This test tests that the defaultClientPort and defaultClientPort+2 are used, so<a name="line.331"></a>
-<span class="sourceLineNo">332</span>    // the algorithm should choice defaultClientPort+1 and defaultClientPort+3 to fill<a name="line.332"></a>
-<span class="sourceLineNo">333</span>    // out the ports for servers without ports specified.<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    hbt.getConfiguration().setInt("test.hbase.zookeeper.property.clientPort", defaultClientPort);<a name="line.334"></a>
-<span class="sourceLineNo">335</span>    int [] clientPortList4 = {-4444, defaultClientPort+2, 4446, defaultClientPort};<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    MiniZooKeeperCluster cluster4 =<a name="line.336"></a>
-<span class="sourceLineNo">337</span>        hbt.startMiniZKCluster(clientPortList4.length + 1, clientPortList4);<a name="line.337"></a>
-<span class="sourceLineNo">338</span><a name="line.338"></a>
-<span class="sourceLineNo">339</span>    try {<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      List&lt;Integer&gt; clientPortListInCluster = cluster4.getClientPortList();<a name="line.340"></a>
-<span class="sourceLineNo">341</span><a name="line.341"></a>
-<span class="sourceLineNo">342</span>      for (i = 0, j = 1; i &lt; clientPortListInCluster.size(); i++) {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        // Servers will only use valid client ports; if ports are not specified or invalid,<a name="line.343"></a>
-<span class="sourceLineNo">344</span>        // the default port or a port based on default port will be used.<a name="line.344"></a>
-<span class="sourceLineNo">345</span>        if (i &lt; clientPortList4.length &amp;&amp; clientPortList4[i] &gt; 0) {<a name="line.345"></a>
-<span class="sourceLineNo">346</span>          assertEquals(clientPortListInCluster.get(i).intValue(), clientPortList4[i]);<a name="line.346"></a>
-<span class="sourceLineNo">347</span>        } else {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>          assertEquals(clientPortListInCluster.get(i).intValue(), defaultClientPort + j);<a name="line.348"></a>
-<span class="sourceLineNo">349</span>          j +=2;<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        }<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      }<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    } finally {<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      hbt.shutdownMiniZKCluster();<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    }<a name="line.354"></a>
-<span class="sourceLineNo">355</span><a name="line.355"></a>
-<span class="sourceLineNo">356</span>    // Test 5 - set up zookeeper cluster with same ports specified - fail is expected.<a name="line.356"></a>
-<span class="sourceLineNo">357</span>    int [] clientPortList5 = {5555, 5556, 5556};<a name="line.357"></a>
-<span class="sourceLineNo">358</span><a name="line.358"></a>
-<span class="sourceLineNo">359</span>    try {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>      MiniZooKeeperCluster cluster5 =<a name="line.360"></a>
-<span class="sourceLineNo">361</span>          hbt.startMiniZKCluster(clientPortList5.length, clientPortList5);<a name="line.361"></a>
-<span class="sourceLineNo">362</span>      assertTrue(cluster5.getClientPort() == -1); // expected failure<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    } catch (Exception e) {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>      // exception is acceptable<a name="line.364"></a>
-<span class="sourceLineNo">365</span>    } finally {<a name="line.365"></a>
-<span class="sourceLineNo">366</span>      hbt.shutdownMiniZKCluster();<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    }<a name="line.367"></a>
-<span class="sourceLineNo">368</span>  }<a name="line.368"></a>
-<span class="sourceLineNo">369</span><a name="line.369"></a>
-<span class="sourceLineNo">370</span>  @Test public void testMiniDFSCluster() throws Exception {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    HBaseTestingUtility hbt = new HBaseTestingUtility();<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    MiniDFSCluster cluster = hbt.startMiniDFSCluster(null);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    FileSystem dfs = cluster.getFileSystem();<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    Path dir = new Path("dir");<a name="line.374"></a>
-<span class="sourceLineNo">375</span>    Path qualifiedDir = dfs.makeQualified(dir);<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    LOG.info("dir=" + dir + ", qualifiedDir=" + qualifiedDir);<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    assertFalse(dfs.exists(qualifiedDir));<a name="line.377"></a>
-<span class="sourceLineNo">378</span>    assertTrue(dfs.mkdirs(qualifiedDir));<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    assertTrue(dfs.delete(qualifiedDir, true));<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    hbt.shutdownMiniCluster();<a name="line.380"></a>
-<span class="sourceLineNo">381</span>  }<a name="line.381"></a>
-<span class="sourceLineNo">382</span><a name="line.382"></a>
-<span class="sourceLineNo">383</span>  @Test public void testSetupClusterTestBuildDir() throws Exception {<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    HBaseTestingUtility hbt = new HBaseTestingUtility();<a name="line.384"></a>
-<span class="sourceLineNo">385</span>    Path testdir = hbt.getClusterTestDir();<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    LOG.info("uuid-subdir=" + testdir);<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    FileSystem fs = hbt.getTestFileSystem();<a name="line.387"></a>
-<span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>    assertFalse(fs.exists(testdir));<a name="line.389"></a>
+<span class="sourceLineNo">278</span>        // cannot assert the specific port due to the port conflict in which situation<a name="line.278"></a>
+<span class="sourceLineNo">279</span>        // it always chooses a bigger port by +1. The below is the same.<a name="line.279"></a>
+<span class="sourceLineNo">280</span>        assertTrue(clientPortListInCluster.get(i).intValue() &gt;= clientPortList1[i]);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      }<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    } finally {<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      hbt.shutdownMiniZKCluster();<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    }<a name="line.284"></a>
+<span class="sourceLineNo">285</span><a name="line.285"></a>
+<span class="sourceLineNo">286</span>    // Test 2 - set up zookeeper cluster with more ZK servers than specified client ports<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    hbt.getConfiguration().setInt("test.hbase.zookeeper.property.clientPort", defaultClientPort);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    int [] clientPortList2 = {2222, 2223};<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    MiniZooKeeperCluster cluster2 =<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        hbt.startMiniZKCluster(clientPortList2.length + 2, clientPortList2);<a name="line.290"></a>
+<span class="sourceLineNo">291</span><a name="line.291"></a>
+<span class="sourceLineNo">292</span>    try {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      List&lt;Integer&gt; clientPortListInCluster = cluster2.getClientPortList();<a name="line.293"></a>
+<span class="sourceLineNo">294</span><a name="line.294"></a>
+<span class="sourceLineNo">295</span>      for (i = 0, j = 0; i &lt; clientPortListInCluster.size(); i++) {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>        if (i &lt; clientPortList2.length) {<a name="line.296"></a>
+<span class="sourceLineNo">297</span>          assertTrue(clientPortListInCluster.get(i).intValue() &gt;= clientPortList2[i]);<a name="line.297"></a>
+<span class="sourceLineNo">298</span>        } else {<a name="line.298"></a>
+<span class="sourceLineNo">299</span>          // servers with no specified client port will use defaultClientPort or some other ports<a name="line.299"></a>
+<span class="sourceLineNo">300</span>          // based on defaultClientPort<a name="line.300"></a>
+<span class="sourceLineNo">301</span>          assertTrue(clientPortListInCluster.get(i).intValue() &gt;= defaultClientPort + j);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>          j++;<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        }<a name="line.303"></a>
+<span class="sourceLineNo">304</span>      }<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    } finally {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>      hbt.shutdownMiniZKCluster();<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>    // Test 3 - set up zookeeper cluster with invalid client ports<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    hbt.getConfiguration().setInt("test.hbase.zookeeper.property.clientPort", defaultClientPort);<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    int [] clientPortList3 = {3333, -3334, 3335, 0};<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    MiniZooKeeperCluster cluster3 =<a name="line.312"></a>
+<span class="sourceLineNo">313</span>        hbt.startMiniZKCluster(clientPortList3.length + 1, clientPortList3);<a name="line.313"></a>
+<span class="sourceLineNo">314</span><a name="line.314"></a>
+<span class="sourceLineNo">315</span>    try {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>      List&lt;Integer&gt; clientPortListInCluster = cluster3.getClientPortList();<a name="line.316"></a>
+<span class="sourceLineNo">317</span><a name="line.317"></a>
+<span class="sourceLineNo">318</span>      for (i = 0, j = 0; i &lt; clientPortListInCluster.size(); i++) {<a name="line.318"></a>
+<span class="sourceLineNo">319</span>        // Servers will only use valid client ports; if ports are not specified or invalid,<a name="line.319"></a>
+<span class="sourceLineNo">320</span>        // the default port or a port based on default port will be used.<a name="line.320"></a>
+<span class="sourceLineNo">321</span>        if (i &lt; clientPortList3.length &amp;&amp; clientPortList3[i] &gt; 0) {<a name="line.321"></a>
+<span class="sourceLineNo">322</span>          assertTrue(clientPortListInCluster.get(i).intValue() &gt;= clientPortList3[i]);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>        } else {<a name="line.323"></a>
+<span class="sourceLineNo">324</span>          assertTrue(clientPortListInCluster.get(i).intValue() &gt;= defaultClientPort + j);<a name="line.324"></a>
+<span class="sourceLineNo">325</span>          j++;<a name="line.325"></a>
+<span class="sourceLineNo">326</span>        }<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      }<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    } finally {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      hbt.shutdownMiniZKCluster();<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 4 - set up zookeeper cluster with default port and some other ports used<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    // This test tests that the defaultClientPort and defaultClientPort+2 are used, so<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    // the algorithm should choice defaultClientPort+1 and defaultClientPort+3 to fill<a name="line.334"></a>
+<span class="sourceLineNo">335</span>    // out the ports for servers without ports specified.<a name="line.335"></a>
+<span class="sourceLineNo">336</span>    hbt.getConfiguration().setInt("test.hbase.zookeeper.property.clientPort", defaultClientPort);<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    int [] clientPortList4 = {-4444, defaultClientPort+2, 4446, defaultClientPort};<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    MiniZooKeeperCluster cluster4 =<a name="line.338"></a>
+<span class="sourceLineNo">339</span>        hbt.startMiniZKCluster(clientPortList4.length + 1, clientPortList4);<a name="line.339"></a>
+<span class="sourceLineNo">340</span><a name="line.340"></a>
+<span class="sourceLineNo">341</span>    try {<a name="line.341"></a>
+<span class="sourceLineNo">342</span>      List&lt;Integer&gt; clientPortListInCluster = cluster4.getClientPortList();<a name="line.342"></a>
+<span class="sourceLineNo">343</span><a name="line.343"></a>
+<span class="sourceLineNo">344</span>      for (i = 0, j = 1; i &lt; clientPortListInCluster.size(); i++) {<a name="line.344"></a>
+<span class="sourceLineNo">345</span>        // Servers will only use valid client ports; if ports are not specified or invalid,<a name="line.345"></a>
+<span class="sourceLineNo">346</span>        // the default port or a port based on default port will be used.<a name="line.346"></a>
+<span class="sourceLineNo">347</span>        if (i &lt; clientPortList4.length &amp;&amp; clientPortList4[i] &gt; 0) {<a name="line.347"></a>
+<span class="sourceLineNo">348</span>          assertTrue(clientPortListInCluster.get(i).intValue() &gt;= clientPortList4[i]);<a name="line.348"></a>
+<span class="sourceLineNo">349</span>        } else {<a name="line.349"></a>
+<span class="sourceLineNo">350</span>          assertTrue(clientPortListInCluster.get(i).intValue() &gt;= defaultClientPort + j);<a name="line.350"></a>
+<span class="sourceLineNo">351</span>          j +=2;<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>    } finally {<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      hbt.shutdownMiniZKCluster();<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    }<a name="line.356"></a>
+<span class="sourceLineNo">357</span><a name="line.357"></a>
+<span class="sourceLineNo">358</span>    // Test 5 - set up zookeeper cluster with same ports specified - fail is expected.<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    int [] clientPortList5 = {5555, 5556, 5556};<a name="line.359"></a>
+<span class="sourceLineNo">360</span><a name="line.360"></a>
+<span class="sourceLineNo">361</span>    try {<a name="line.361"></a>
+<span class="sourceLineNo">362</span>      MiniZooKeeperCluster cluster5 =<a name="line.362"></a>
+<span class="sourceLineNo">363</span>          hbt.startMiniZKCluster(clientPortList5.length, clientPortList5);<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      assertTrue(cluster5.getClientPort() == -1); // expected failure<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    } catch (Exception e) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      // exception is acceptable<a name="line.366"></a>
+<span class="sourceLineNo">367</span>    } finally {<a name="line.367"></a>
+<span class="sourceLineNo">368</span>      hbt.shutdownMiniZKCluster();<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    }<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>  @Test public void testMiniDFSCluster() throws Exception {<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    HBaseTestingUtility hbt = new HBaseTestingUtility();<a name="line.373"></a>
+<span class="sourceLineNo">374</span>    MiniDFSCluster cluster = hbt.startMiniDFSCluster(null);<a name="line.374"></a>
+<span class="sourceLineNo">375</span>    FileSystem dfs = cluster.getFileSystem();<a name="line.375"></a>
+<span class="sourceLineNo">376</span>    Path dir = new Path("dir");<a name="line.376"></a>
+<span class="sourceLineNo">377</span>    Path qualifiedDir = dfs.makeQualified(dir);<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    LOG.info("dir=" + dir + ", qualifiedDir=" + qualifiedDir);<a name="line.378"></a>
+<span class="sourceLineNo">379</span>    assertFalse(dfs.exists(qualifiedDir));<a name="line.379"></a>
+<span class="sourceLineNo">380</span>    assertTrue(dfs.mkdirs(qualifiedDir));<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    assertTrue(dfs.delete(qualifiedDir, true));<a name="line.381"></a>
+<span class="sourceLineNo">382</span>    hbt.shutdownMiniCluster();<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>  @Test public void testSetupClusterTestBuildDir() throws Exception {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>    HBaseTestingUtility hbt = new HBaseTestingUtility();<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    Path testdir = hbt.getClusterTestDir();<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    LOG.info("uuid-subdir=" + testdir);<a name="line.388"></a>
+<span class="sourceLineNo">389</span>    FileSystem fs = hbt.getTestFileSystem();<a name="line.389"></a>
 <span class="sourceLineNo">390</span><a name="line.390"></a>
-<span class="sourceLineNo">391</span>    hbt.startMiniDFSCluster(null);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    assertTrue(fs.exists(testdir));<a name="line.392"></a>
-<span class="sourceLineNo">393</span><a name="line.393"></a>
-<span class="sourceLineNo">394</span>    hbt.shutdownMiniCluster();<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    assertFalse(fs.exists(testdir));<a name="line.395"></a>
-<span class="sourceLineNo">396</span>  }<a name="line.396"></a>
-<span class="sourceLineNo">397</span><a name="line.397"></a>
-<span class="sourceLineNo">398</span>  @Test public void testTestDir() throws Exception {<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    HBaseTestingUtility hbt = new HBaseTestingUtility();<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    Path testdir = hbt.getDataTestDir();<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    LOG.info("testdir=" + testdir);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    FileSystem fs = hbt.getTestFileSystem();<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    assertTrue(!fs.exists(testdir));<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    assertTrue(fs.mkdirs(testdir));<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    assertTrue(hbt.cleanupTestDir());<a name="line.405"></a>
-<span class="sourceLineNo">406</span>  }<a name="line.406"></a>
-<span class="sourceLineNo">407</span><a name="line.407"></a>
-<span class="sourceLineNo">408</span>  @Test public void testResolvePortConflict() throws Exception {<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    // raises port conflict between 1st call and 2nd call of randomPort() by mocking Random object<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    Random random = mock(Random.class);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    when(random.nextInt(anyInt()))<a name="line.411"></a>
-<span class="sourceLineNo">412</span>      .thenAnswer(new Answer&lt;Integer&gt;() {<a name="line.412"></a>
-<span class="sourceLineNo">413</span>        int[] numbers = { 1, 1, 2 };<a name="line.413"></a>
-<span class="sourceLineNo">414</span>        int count = 0;<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>        @Override<a name="line.416"></a>
-<span class="sourceLineNo">417</span>        public Integer answer(InvocationOnMock invocation) {<a name="line.417"></a>
-<span class="sourceLineNo">418</span>          int ret = numbers[count];<a name="line.418"></a>
-<span class="sourceLineNo">419</span>          count++;<a name="line.419"></a>
-<span class="sourceLineNo">420</span>          return ret;<a name="line.420"></a>
-<span class="sourceLineNo">421</span>        }<a name="line.421"></a>
-<span class="sourceLineNo">422</span>      });<a name="line.422"></a>
-<span class="sourceLineNo">423</span><a name="line.423"></a>
-<span class="sourceLineNo">424</span>    HBaseTestingUtility.PortAllocator.AvailablePortChecker portChecker =<a name="line.424"></a>
-<span class="sourceLineNo">425</span>      mock(HBaseTestingUtility.PortAllocator.AvailablePortChecker.class);<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    when(portChecker.available(anyInt())).thenReturn(true);<a name="line.426"></a>
-<span class="sourceLineNo">427</span><a name="line.427"></a>
-<span class="sourceLineNo">428</span>    HBaseTestingUtility.PortAllocator portAllocator =<a name="line.428"></a>
-<span class="sourceLineNo">429</span>      new HBaseTestingUtility.PortAllocator(random, portChecker);<a name="line.429"></a>
-<span class="sourceLineNo">430</span><a name="line.430"></a>
-<span class="sourceLineNo">431</span>    int port1 = portAllocator.randomFreePort();<a name="line.431"></a>
-<span class="sourceLineNo">432</span>    int port2 = portAllocator.randomFreePort();<a name="line.432"></a>
-<span class="sourceLineNo">433</span>    assertNotEquals(port1, port2);<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    Mockito.verify(random, Mockito.times(3)).nextInt(anyInt());<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  }<a name="line.435"></a>
-<span class="sourceLineNo">436</span><a name="line.436"></a>
-<span class="sourceLineNo">437</span>  @Test<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  public void testOverridingOfDefaultPorts() throws Exception {<a name="line.438"></a>
-<span class="sourceLineNo">439</span><a name="line.439"></a>
-<span class="sourceLineNo">440</span>    // confirm that default port properties being overridden to random<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    Configuration defaultConfig = HBaseConfiguration.create();<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    defaultConfig.setInt(HConstants.MASTER_INFO_PORT, HConstants.DEFAULT_MASTER_INFOPORT);<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    defaultConfig.setInt(HConstants.REGIONSERVER_INFO_PORT,<a name="line.443"></a>
-<span class="sourceLineNo">444</span>        HConstants.DEFAULT_REGIONSERVER_INFOPORT);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    HBaseTestingUtility htu = new HBaseTestingUtility(defaultConfig);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    try {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      MiniHBaseCluster defaultCluster = htu.startMiniCluster();<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      assertNotEquals(HConstants.DEFAULT_MASTER_INFOPORT,<a name="line.448"></a>
-<span class="sourceLineNo">449</span>          defaultCluster.getConfiguration().getInt(HConstants.MASTER_INFO_PORT, 0));<a name="line.449"></a>
-<span class="sourceLineNo">450</span>      assertNotEquals(HConstants.DEFAULT_REGIONSERVER_INFOPORT,<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          defaultCluster.getConfiguration().getInt(HConstants.REGIONSERVER_INFO_PORT, 0));<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    } finally {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      htu.shutdownMiniCluster();<a name="line.453"></a>
-<span class="sourceLineNo">454</span>    }<a name="line.454"></a>
-<span class="sourceLineNo">455</span><a name="line.455"></a>
-<span class="sourceLineNo">456</span>    // confirm that nonDefault (custom) port settings are NOT overridden<a name="line.456"></a>
-<span class="sourceLineNo">457</span>    Configuration altConfig = HBaseConfiguration.create();<a name="line.457"></a>
-<span class="sourceLineNo">458</span>    final int nonDefaultMasterInfoPort = 3333;<a name="line.458"></a>
-<span class="sourceLineNo">459</span>    final int nonDefaultRegionServerPort = 4444;<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    altConfig.setInt(HConstants.MASTER_INFO_PORT, nonDefaultMasterInfoPort);<a name="line.460"></a>
-<span class="sourceLineNo">461</span>    altConfig.setInt(HConstants.REGIONSERVER_INFO_PORT, nonDefaultRegionServerPort);<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    htu = new HBaseTestingUtility(altConfig);<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    try {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      MiniHBaseCluster customCluster = htu.startMiniCluster();<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      assertEquals(nonDefaultMasterInfoPort,<a name="line.465"></a>
-<span class="sourceLineNo">466</span>              customCluster.getConfiguration().getInt(HConstants.MASTER_INFO_PORT, 0));<a name="line.466"></a>
-<span class="sourceLineNo">467</span>      assertEquals(nonDefaultRegionServerPort,<a name="line.467"></a>
-<span class="sourceLineNo">468</span>          customCluster.getConfiguration().getInt(HConstants.REGIONSERVER_INFO_PORT, 0));<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    } finally {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      htu.shutdownMiniCluster();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>    }<a name="line.471"></a>
-<span class="sourceLineNo">472</span>  }<a name="line.472"></a>
-<span class="sourceLineNo">473</span><a name="line.473"></a>
-<span class="sourceLineNo">474</span>  // This test demonstrates how long killHBTU takes vs. shutdownHBTU takes<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  // for realistic results, adjust NUMROWS, NUMTABLES to much larger number.<a name="line.475"></a>
-<span class="sourceLineNo">476</span>  @Test<a name="line.476"></a>
-<span class="sourceLineNo">477</span>  public void testKillMiniHBaseCluster() throws Exception {<a name="line.477"></a>
-<span class="sourceLineNo">478</span><a name="line.478"></a>
-<span class="sourceLineNo">479</span>    HBaseTestingUtility htu = new HBaseTestingUtility();<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    htu.startMiniZKCluster();<a name="line.480"></a>
-<span class="sourceLineNo">481</span><a name="line.481"></a>
-<span class="sourceLineNo">482</span>    try {<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      htu.startMiniHBaseCluster();<a name="line.483"></a>
-<span class="sourceLineNo">484</span><a name="line.484"></a>
-<span class="sourceLineNo">485</span>      TableName tableName;<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      byte[] FAM_NAME;<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>      for(int i = 0; i &lt; NUMTABLES; i++) {<a name="line.488"></a>
-<span class="sourceLineNo">489</span>        tableName = TableName.valueOf(name.getMethodName() + i);<a name="line.489"></a>
-<span class="sourceLineNo">490</span>        FAM_NAME = Bytes.toBytes("fam" + i);<a name="line.490"></a>
-<span class="sourceLineNo">491</span><a name="line.491"></a>
-<span class="sourceLineNo">492</span>        try (Table table = htu.createMultiRegionTable(tableName, FAM_NAME, NUMREGIONS)) {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>          htu.loadRandomRows(table, FAM_NAME, 100, NUMROWS);<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        }<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      }<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    } finally {<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      htu.killMiniHBaseCluster();<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      htu.shutdownMiniZKCluster();<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    }<a name="line.499"></a>
-<span class="sourceLineNo">500</span>  }<a name="line.500"></a>
-<span class="sourceLineNo">501</span>}<a name="line.501"></a>
+<span class="sourceLineNo">391</span>    assertFalse(fs.exists(testdir));<a name="line.391"></a>
+<span class="sourceLineNo">392</span><a name="line.392"></a>
+<span class="sourceLineNo">393</span>    hbt.startMiniDFSCluster(null);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>    assertTrue(fs.exists(testdir));<a name="line.394"></a>
+<span class="sourceLineNo">395</span><a name="line.395"></a>
+<span class="sourceLineNo">396</span>    hbt.shutdownMiniCluster();<a name="line.396"></a>
+<span class="sourceLineNo">397</span>    assertFalse(fs.exists(testdir));<a name="line.397"></a>
+<span class="sourceLineNo">398</span>  }<a name="line.398"></a>
+<span class="sourceLineNo">399</span><a name="line.399"></a>
+<span class="sourceLineNo">400</span>  @Test public void testTestDir() throws Exception {<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    HBaseTestingUtility hbt = new HBaseTestingUtility();<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    Path testdir = hbt.getDataTestDir();<a name="line.402"></a>
+<span class="sourceLineNo">403</span>    LOG.info("testdir=" + testdir);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    FileSystem fs = hbt.getTestFileSystem();<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    assertTrue(!fs.exists(testdir));<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    assertTrue(fs.mkdirs(testdir));<a name="line.406"></a>
+<span class="sourceLineNo">407</span>    assertTrue(hbt.cleanupTestDir());<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>  @Test public void testResolvePortConflict() throws Exception {<a name="line.410"></a>
+<span class="sourceLineNo">411</span>    // raises port conflict between 1st call and 2nd call of randomPort() by mocking Random object<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    Random random = mock(Random.class);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    when(random.nextInt(anyInt()))<a name="line.413"></a>
+<span class="sourceLineNo">414</span>      .thenAnswer(new Answer&lt;Integer&gt;() {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>        int[] numbers = { 1, 1, 2 };<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        int count = 0;<a name="line.416"></a>
+<span class="sourceLineNo">417</span><a name="line.417"></a>
+<span class="sourceLineNo">418</span>        @Override<a name="line.418"></a>
+<span class="sourceLineNo">419</span>        public Integer answer(InvocationOnMock invocation) {<a name="line.419"></a>
+<span class="sourceLineNo">420</span>          int ret = numbers[count];<a name="line.420"></a>
+<span class="sourceLineNo">421</span>          count++;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>          return ret;<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><a name="line.425"></a>
+<span class="sourceLineNo">426</span>    HBaseTestingUtility.PortAllocator.AvailablePortChecker portChecker =<a name="line.426"></a>
+<span class="sourceLineNo">427</span>      mock(HBaseTestingUtility.PortAllocator.AvailablePortChecker.class);<a name="line.427"></a>
+<span class="sourceLineNo">428</span>    when(portChecker.available(anyInt())).thenReturn(true);<a name="line.428"></a>
+<span class="sourceLineNo">429</span><a name="line.429"></a>
+<span class="sourceLineNo">430</span>    HBaseTestingUtility.PortAllocator portAllocator =<a name="line.430"></a>
+<span class="sourceLineNo">431</span>      new HBaseTestingUtility.PortAllocator(random, portChecker);<a name="line.431"></a>
+<span class="sourceLineNo">432</span><a name="line.432"></a>
+<span class="sourceLineNo">433</span>    int port1 = portAllocator.randomFreePort();<a name="line.433"></a>
+<span class="sourceLineNo">434</span>    int port2 = portAllocator.randomFreePort();<a name="line.434"></a>
+<span class="sourceLineNo">435</span>    assertNotEquals(port1, port2);<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    Mockito.verify(random, Mockito.times(3)).nextInt(anyInt());<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>  @Test<a name="line.439"></a>
+<span class="sourceLineNo">440</span>  public void testOverridingOfDefaultPorts() throws Exception {<a name="line.440"></a>
+<span class="sourceLineNo">441</span><a name="line.441"></a>
+<span class="sourceLineNo">442</span>    // confirm that default port properties being overridden to random<a name="line.442"></a>
+<span class="sourceLineNo">443</span>    Configuration defaultConfig = HBaseConfiguration.create();<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    defaultConfig.setInt(HConstants.MASTER_INFO_PORT, HConstants.DEFAULT_MASTER_INFOPORT);<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    defaultConfig.setInt(HConstants.REGIONSERVER_INFO_PORT,<a name="line.445"></a>
+<span class="sourceLineNo">446</span>        HConstants.DEFAULT_REGIONSERVER_INFOPORT);<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    HBaseTestingUtility htu = new HBaseTestingUtility(defaultConfig);<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    try {<a name="line.448"></a>
+<span class="sourceLineNo">449</span>      MiniHBaseCluster defaultCluster = htu.startMiniCluster();<a name="line.449"></a>
+<span class="sourceLineNo">450</span>      assertNotEquals(HConstants.DEFAULT_MASTER_INFOPORT,<a name="line.450"></a>
+<span class="sourceLineNo">451</span>          defaultCluster.getConfiguration().getInt(HConstants.MASTER_INFO_PORT, 0));<a name="line.451"></a>
+<span class="sourceLineNo">452</span>      assertNotEquals(HConstants.DEFAULT_REGIONSERVER_INFOPORT,<a name="line.452"></a>
+<span class="sourceLineNo">453</span>          defaultCluster.getConfiguration().getInt(HConstants.REGIONSERVER_INFO_PORT, 0));<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    } finally {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      htu.shutdownMiniCluster();<a name="line.455"></a>
+<span class="sourceLineNo">456</span>    }<a name="line.456"></a>
+<span class="sourceLineNo">457</span><a name="line.457"></a>
+<span class="sourceLineNo">458</span>    // confirm that nonDefault (custom) port settings are NOT overridden<a name="line.458"></a>
+<span class="sourceLineNo">459</span>    Configuration altConfig = HBaseConfiguration.create();<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    final int nonDefaultMasterInfoPort = 3333;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>    final int nonDefaultRegionServerPort = 4444;<a name="line.461"></a>
+<span class="sourceLineNo">462</span>    altConfig.setInt(HConstants.MASTER_INFO_PORT, nonDefaultMasterInfoPort);<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    altConfig.setInt(HConstants.REGIONSERVER_INFO_PORT, nonDefaultRegionServerPort);<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    htu = new HBaseTestingUtility(altConfig);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>    try {<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      MiniHBaseCluster customCluster = htu.startMiniCluster();<a name="line.466"></a>
+<span class="sourceLineNo">467</span>      assertEquals(nonDefaultMasterInfoPort,<a name="line.467"></a>
+<span class="sourceLineNo">468</span>              customCluster.getConfiguration().getInt(HConstants.MASTER_INFO_PORT, 0));<a name="line.468"></a>
+<span class="sourceLineNo">469</span>      assertEquals(nonDefaultRegionServerPort,<a name="line.469"></a>
+<span class="sourceLineNo">470</span>          customCluster.getConfiguration().getInt(HConstants.REGIONSERVER_INFO_PORT, 0));<a name="line.470"></a>
+<span class="sourceLineNo">471</span>    } finally {<a name="line.471"></a>
+<span class="sourceLineNo">472</span>      htu.shutdownMiniCluster();<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
+<span class="sourceLineNo">474</span>  }<a name="line.474"></a>
+<span class="sourceLineNo">475</span><a name="line.475"></a>
+<span class="sourceLineNo">476</span>  // This test demonstrates how long killHBTU takes vs. shutdownHBTU takes<a name="line.476"></a>
+<span class="sourceLineNo">477</span>  // for realistic results, adjust NUMROWS, NUMTABLES to much larger number.<a name="line.477"></a>
+<span class="sourceLineNo">478</span>  @Test<a name="line.478"></a>
+<span class="sourceLineNo">479</span>  public void testKillMiniHBaseCluster() throws Exception {<a name="line.479"></a>
+<span class="sourceLineNo">480</span><a name="line.480"></a>
+<span class="sourceLineNo">481</span>    HBaseTestingUtility htu = new HBaseTestingUtility();<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    htu.startMiniZKCluster();<a name="line.482"></a>
+<span class="sourceLineNo">483</span><a name="line.483"></a>
+<span class="sourceLineNo">484</span>    try {<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      htu.startMiniHBaseCluster();<a name="line.485"></a>
+<span class="sourceLineNo">486</span><a name="line.486"></a>
+<span class="sourceLineNo">487</span>      TableName tableName;<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      byte[] FAM_NAME;<a name="line.488"></a>
+<span class="sourceLineNo">489</span><a name="line.489"></a>
+<span class="sourceLineNo">490</span>      for(int i = 0; i &lt; NUMTABLES; i++) {<a name="line.490"></a>
+<span class="sourceLineNo">491</span>        tableName = TableName.valueOf(name.getMethodName() + i);<a name="line.491"></a>
+<span class="sourceLineNo">492</span>        FAM_NAME = Bytes.toBytes("fam" + i);<a name="line.492"></a>
+<span class="sourceLineNo">493</span><a name="line.493"></a>
+<span class="sourceLineNo">494</span>        try (Table table = htu.createMultiRegionTable(tableName, FAM_NAME, NUMREGIONS)) {<a name="line.494"></a>
+<span class="sourceLineNo">495</span>          htu.loadRandomRows(table, FAM_NAME, 100, NUMROWS);<a name="line.495"></a>
+<span class="sourceLineNo">496</span>        }<a name="line.496"></a>
+<span class="sourceLineNo">497</span>      }<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    } finally {<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      htu.killMiniHBaseCluster();<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      htu.shutdownMiniZKCluster();<a name="line.500"></a>
+<span class="sourceLineNo">501</span>    }<a name="line.501"></a>
+<span class="sourceLineNo">502</span>  }<a name="line.502"></a>
+<span class="sourceLineNo">503</span>}<a name="line.503"></a>
 
 
 
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/replication/TestReplicationBase.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/replication/TestReplicationBase.html
index a5196ae..ba01d9f 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/replication/TestReplicationBase.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/replication/TestReplicationBase.html
@@ -172,190 +172,194 @@
 <span class="sourceLineNo">164</span>  }<a name="line.164"></a>
 <span class="sourceLineNo">165</span><a name="line.165"></a>
 <span class="sourceLineNo">166</span>  protected static void loadData(String prefix, byte[] row) throws IOException {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    List&lt;Put&gt; puts = new ArrayList&lt;&gt;(NB_ROWS_IN_BATCH);<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    for (int i = 0; i &lt; NB_ROWS_IN_BATCH; i++) {<a name="line.168"></a>
-<span class="sourceLineNo">169</span>      Put put = new Put(Bytes.toBytes(prefix + Integer.toString(i)));<a name="line.169"></a>
-<span class="sourceLineNo">170</span>      put.addColumn(famName, row, row);<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      puts.add(put);<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    }<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    htable1.put(puts);<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>  protected static void configureClusters(){<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    conf1.set(HConstants.ZOOKEEPER_ZNODE_PARENT, "/1");<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    // We don't want too many edits per batch sent to the ReplicationEndpoint to trigger<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    // sufficient number of events. But we don't want to go too low because<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    // HBaseInterClusterReplicationEndpoint partitions entries into batches and we want<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    // more than one batch sent to the peer cluster for better testing.<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    conf1.setInt("replication.source.size.capacity", 102400);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    conf1.setLong("replication.source.sleepforretries", 100);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    conf1.setInt("hbase.regionserver.maxlogs", 10);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    conf1.setLong("hbase.master.logcleaner.ttl", 10);<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    conf1.setInt("zookeeper.recovery.retry", 1);<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    conf1.setInt("zookeeper.recovery.retry.intervalmill", 10);<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    conf1.setLong(HConstants.THREAD_WAKE_FREQUENCY, 100);<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    conf1.setInt("replication.stats.thread.period.seconds", 5);<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    conf1.setBoolean("hbase.tests.use.shortcircuit.reads", false);<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    conf1.setLong("replication.sleep.before.failover", 2000);<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    conf1.setInt("replication.source.maxretriesmultiplier", 10);<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    conf1.setFloat("replication.source.ratio", 1.0f);<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    conf1.setBoolean("replication.source.eof.autorecovery", true);<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    conf1.setLong("hbase.serial.replication.waiting.ms", 100);<a name="line.195"></a>
-<span class="sourceLineNo">196</span><a name="line.196"></a>
-<span class="sourceLineNo">197</span>    utility1 = new HBaseTestingUtility(conf1);<a name="line.197"></a>
-<span class="sourceLineNo">198</span><a name="line.198"></a>
-<span class="sourceLineNo">199</span>    // Base conf2 on conf1 so it gets the right zk cluster.<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    conf2 = HBaseConfiguration.create(conf1);<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    conf2.set(HConstants.ZOOKEEPER_ZNODE_PARENT, "/2");<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    conf2.setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, 6);<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    conf2.setBoolean("hbase.tests.use.shortcircuit.reads", false);<a name="line.203"></a>
-<span class="sourceLineNo">204</span><a name="line.204"></a>
-<span class="sourceLineNo">205</span>    utility2 = new HBaseTestingUtility(conf2);<a name="line.205"></a>
-<span class="sourceLineNo">206</span>  }<a name="line.206"></a>
-<span class="sourceLineNo">207</span><a name="line.207"></a>
-<span class="sourceLineNo">208</span>  protected static void startClusters() throws Exception{<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    utility1.startMiniZKCluster();<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    MiniZooKeeperCluster miniZK = utility1.getZkCluster();<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    // Have to reget conf1 in case zk cluster location different<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    // than default<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    conf1 = utility1.getConfiguration();<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    zkw1 = new ZKWatcher(conf1, "cluster1", null, true);<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    admin = new ReplicationAdmin(conf1);<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    LOG.info("Setup first Zk");<a name="line.216"></a>
-<span class="sourceLineNo">217</span><a name="line.217"></a>
-<span class="sourceLineNo">218</span>    utility2.setZkCluster(miniZK);<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    zkw2 = new ZKWatcher(conf2, "cluster2", null, true);<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    LOG.info("Setup second Zk");<a name="line.220"></a>
+<span class="sourceLineNo">167</span>    loadData(prefix, row, famName);<a name="line.167"></a>
+<span class="sourceLineNo">168</span>  }<a name="line.168"></a>
+<span class="sourceLineNo">169</span><a name="line.169"></a>
+<span class="sourceLineNo">170</span>  protected static void loadData(String prefix, byte[] row, byte[] familyName) throws IOException {<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    List&lt;Put&gt; puts = new ArrayList&lt;&gt;(NB_ROWS_IN_BATCH);<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    for (int i = 0; i &lt; NB_ROWS_IN_BATCH; i++) {<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      Put put = new Put(Bytes.toBytes(prefix + Integer.toString(i)));<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      put.addColumn(familyName, row, row);<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      puts.add(put);<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    }<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    htable1.put(puts);<a name="line.177"></a>
+<span class="sourceLineNo">178</span>  }<a name="line.178"></a>
+<span class="sourceLineNo">179</span><a name="line.179"></a>
+<span class="sourceLineNo">180</span>  protected static void configureClusters(){<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    conf1.set(HConstants.ZOOKEEPER_ZNODE_PARENT, "/1");<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    // We don't want too many edits per batch sent to the ReplicationEndpoint to trigger<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    // sufficient number of events. But we don't want to go too low because<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    // HBaseInterClusterReplicationEndpoint partitions entries into batches and we want<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    // more than one batch sent to the peer cluster for better testing.<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    conf1.setInt("replication.source.size.capacity", 102400);<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    conf1.setLong("replication.source.sleepforretries", 100);<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    conf1.setInt("hbase.regionserver.maxlogs", 10);<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    conf1.setLong("hbase.master.logcleaner.ttl", 10);<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    conf1.setInt("zookeeper.recovery.retry", 1);<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    conf1.setInt("zookeeper.recovery.retry.intervalmill", 10);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    conf1.setLong(HConstants.THREAD_WAKE_FREQUENCY, 100);<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    conf1.setInt("replication.stats.thread.period.seconds", 5);<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    conf1.setBoolean("hbase.tests.use.shortcircuit.reads", false);<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    conf1.setLong("replication.sleep.before.failover", 2000);<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    conf1.setInt("replication.source.maxretriesmultiplier", 10);<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    conf1.setFloat("replication.source.ratio", 1.0f);<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    conf1.setBoolean("replication.source.eof.autorecovery", true);<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    conf1.setLong("hbase.serial.replication.waiting.ms", 100);<a name="line.199"></a>
+<span class="sourceLineNo">200</span><a name="line.200"></a>
+<span class="sourceLineNo">201</span>    utility1 = new HBaseTestingUtility(conf1);<a name="line.201"></a>
+<span class="sourceLineNo">202</span><a name="line.202"></a>
+<span class="sourceLineNo">203</span>    // Base conf2 on conf1 so it gets the right zk cluster.<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    conf2 = HBaseConfiguration.create(conf1);<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    conf2.set(HConstants.ZOOKEEPER_ZNODE_PARENT, "/2");<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    conf2.setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, 6);<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    conf2.setBoolean("hbase.tests.use.shortcircuit.reads", false);<a name="line.207"></a>
+<span class="sourceLineNo">208</span><a name="line.208"></a>
+<span class="sourceLineNo">209</span>    utility2 = new HBaseTestingUtility(conf2);<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  }<a name="line.210"></a>
+<span class="sourceLineNo">211</span><a name="line.211"></a>
+<span class="sourceLineNo">212</span>  protected static void startClusters() throws Exception{<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    utility1.startMiniZKCluster();<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    MiniZooKeeperCluster miniZK = utility1.getZkCluster();<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    // Have to reget conf1 in case zk cluster location different<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    // than default<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    conf1 = utility1.getConfiguration();<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    zkw1 = new ZKWatcher(conf1, "cluster1", null, true);<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    admin = new ReplicationAdmin(conf1);<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    LOG.info("Setup first Zk");<a name="line.220"></a>
 <span class="sourceLineNo">221</span><a name="line.221"></a>
-<span class="sourceLineNo">222</span>    CONF_WITH_LOCALFS = HBaseConfiguration.create(conf1);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    utility1.startMiniCluster(2);<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    // Have a bunch of slave servers, because inter-cluster shipping logic uses number of sinks<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    // as a component in deciding maximum number of parallel batches to send to the peer cluster.<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    utility2.startMiniCluster(4);<a name="line.226"></a>
-<span class="sourceLineNo">227</span><a name="line.227"></a>
-<span class="sourceLineNo">228</span>    hbaseAdmin = ConnectionFactory.createConnection(conf1).getAdmin();<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>    TableDescriptor table = TableDescriptorBuilder.newBuilder(tableName)<a name="line.230"></a>
-<span class="sourceLineNo">231</span>        .setColumnFamily(ColumnFamilyDescriptorBuilder.newBuilder(famName).setMaxVersions(100)<a name="line.231"></a>
-<span class="sourceLineNo">232</span>            .setScope(HConstants.REPLICATION_SCOPE_GLOBAL).build())<a name="line.232"></a>
-<span class="sourceLineNo">233</span>        .setColumnFamily(ColumnFamilyDescriptorBuilder.of(noRepfamName)).build();<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    scopes = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    for (ColumnFamilyDescriptor f : table.getColumnFamilies()) {<a name="line.235"></a>
-<span class="sourceLineNo">236</span>      scopes.put(f.getName(), f.getScope());<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    }<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    Connection connection1 = ConnectionFactory.createConnection(conf1);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    Connection connection2 = ConnectionFactory.createConnection(conf2);<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    try (Admin admin1 = connection1.getAdmin()) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>      admin1.createTable(table, HBaseTestingUtility.KEYS_FOR_HBA_CREATE_TABLE);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    }<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    try (Admin admin2 = connection2.getAdmin()) {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      admin2.createTable(table, HBaseTestingUtility.KEYS_FOR_HBA_CREATE_TABLE);<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    }<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    utility1.waitUntilAllRegionsAssigned(tableName);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    utility2.waitUntilAllRegionsAssigned(tableName);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    htable1 = connection1.getTable(tableName);<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    htable2 = connection2.getTable(tableName);<a name="line.249"></a>
-<span class="sourceLineNo">250</span>  }<a name="line.250"></a>
-<span class="sourceLineNo">251</span><a name="line.251"></a>
-<span class="sourceLineNo">252</span>  @BeforeClass<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  public static void setUpBeforeClass() throws Exception {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    configureClusters();<a name="line.254"></a>
-<span class="sourceLineNo">255</span>    startClusters();<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>  private boolean peerExist(String peerId) throws IOException {<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    return hbaseAdmin.listReplicationPeers().stream().anyMatch(p -&gt; peerId.equals(p.getPeerId()));<a name="line.259"></a>
+<span class="sourceLineNo">222</span>    utility2.setZkCluster(miniZK);<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    zkw2 = new ZKWatcher(conf2, "cluster2", null, true);<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    LOG.info("Setup second Zk");<a name="line.224"></a>
+<span class="sourceLineNo">225</span><a name="line.225"></a>
+<span class="sourceLineNo">226</span>    CONF_WITH_LOCALFS = HBaseConfiguration.create(conf1);<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    utility1.startMiniCluster(2);<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    // Have a bunch of slave servers, because inter-cluster shipping logic uses number of sinks<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    // as a component in deciding maximum number of parallel batches to send to the peer cluster.<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    utility2.startMiniCluster(4);<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>    hbaseAdmin = ConnectionFactory.createConnection(conf1).getAdmin();<a name="line.232"></a>
+<span class="sourceLineNo">233</span><a name="line.233"></a>
+<span class="sourceLineNo">234</span>    TableDescriptor table = TableDescriptorBuilder.newBuilder(tableName)<a name="line.234"></a>
+<span class="sourceLineNo">235</span>        .setColumnFamily(ColumnFamilyDescriptorBuilder.newBuilder(famName).setMaxVersions(100)<a name="line.235"></a>
+<span class="sourceLineNo">236</span>            .setScope(HConstants.REPLICATION_SCOPE_GLOBAL).build())<a name="line.236"></a>
+<span class="sourceLineNo">237</span>        .setColumnFamily(ColumnFamilyDescriptorBuilder.of(noRepfamName)).build();<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    scopes = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    for (ColumnFamilyDescriptor f : table.getColumnFamilies()) {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      scopes.put(f.getName(), f.getScope());<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    }<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    Connection connection1 = ConnectionFactory.createConnection(conf1);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    Connection connection2 = ConnectionFactory.createConnection(conf2);<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    try (Admin admin1 = connection1.getAdmin()) {<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      admin1.createTable(table, HBaseTestingUtility.KEYS_FOR_HBA_CREATE_TABLE);<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    }<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    try (Admin admin2 = connection2.getAdmin()) {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      admin2.createTable(table, HBaseTestingUtility.KEYS_FOR_HBA_CREATE_TABLE);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    }<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    utility1.waitUntilAllRegionsAssigned(tableName);<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    utility2.waitUntilAllRegionsAssigned(tableName);<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    htable1 = connection1.getTable(tableName);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    htable2 = connection2.getTable(tableName);<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>  @BeforeClass<a name="line.256"></a>
+<span class="sourceLineNo">257</span>  public static void setUpBeforeClass() throws Exception {<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    configureClusters();<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    startClusters();<a name="line.259"></a>
 <span class="sourceLineNo">260</span>  }<a name="line.260"></a>
 <span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>  @Before<a name="line.262"></a>
-<span class="sourceLineNo">263</span>  public void setUpBase() throws Exception {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    if (!peerExist(PEER_ID2)) {<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      ReplicationPeerConfigBuilder builder = ReplicationPeerConfig.newBuilder()<a name="line.265"></a>
-<span class="sourceLineNo">266</span>        .setClusterKey(utility2.getClusterKey()).setSerial(isSerialPeer());<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      if (isSyncPeer()) {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>        FileSystem fs2 = utility2.getTestFileSystem();<a name="line.268"></a>
-<span class="sourceLineNo">269</span>        // The remote wal dir is not important as we do not use it in DA state, here we only need to<a name="line.269"></a>
-<span class="sourceLineNo">270</span>        // confirm that a sync peer in DA state can still replicate data to remote cluster<a name="line.270"></a>
-<span class="sourceLineNo">271</span>        // asynchronously.<a name="line.271"></a>
-<span class="sourceLineNo">272</span>        builder.setReplicateAllUserTables(false)<a name="line.272"></a>
-<span class="sourceLineNo">273</span>          .setTableCFsMap(ImmutableMap.of(tableName, ImmutableList.of()))<a name="line.273"></a>
-<span class="sourceLineNo">274</span>          .setRemoteWALDir(new Path("/RemoteWAL")<a name="line.274"></a>
-<span class="sourceLineNo">275</span>            .makeQualified(fs2.getUri(), fs2.getWorkingDirectory()).toUri().toString());<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      }<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      hbaseAdmin.addReplicationPeer(PEER_ID2, builder.build());<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    }<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  }<a name="line.279"></a>
-<span class="sourceLineNo">280</span><a name="line.280"></a>
-<span class="sourceLineNo">281</span>  @After<a name="line.281"></a>
-<span class="sourceLineNo">282</span>  public void tearDownBase() throws Exception {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    if (peerExist(PEER_ID2)) {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      hbaseAdmin.removeReplicationPeer(PEER_ID2);<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    }<a name="line.285"></a>
-<span class="sourceLineNo">286</span>  }<a name="line.286"></a>
-<span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>  protected static void runSimplePutDeleteTest() throws IOException, InterruptedException {<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    Put put = new Put(row);<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    put.addColumn(famName, row, row);<a name="line.290"></a>
+<span class="sourceLineNo">262</span>  private boolean peerExist(String peerId) throws IOException {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    return hbaseAdmin.listReplicationPeers().stream().anyMatch(p -&gt; peerId.equals(p.getPeerId()));<a name="line.263"></a>
+<span class="sourceLineNo">264</span>  }<a name="line.264"></a>
+<span class="sourceLineNo">265</span><a name="line.265"></a>
+<span class="sourceLineNo">266</span>  @Before<a name="line.266"></a>
+<span class="sourceLineNo">267</span>  public void setUpBase() throws Exception {<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    if (!peerExist(PEER_ID2)) {<a name="line.268"></a>
+<span class="sourceLineNo">269</span>      ReplicationPeerConfigBuilder builder = ReplicationPeerConfig.newBuilder()<a name="line.269"></a>
+<span class="sourceLineNo">270</span>        .setClusterKey(utility2.getClusterKey()).setSerial(isSerialPeer());<a name="line.270"></a>
+<span class="sourceLineNo">271</span>      if (isSyncPeer()) {<a name="line.271"></a>
+<span class="sourceLineNo">272</span>        FileSystem fs2 = utility2.getTestFileSystem();<a name="line.272"></a>
+<span class="sourceLineNo">273</span>        // The remote wal dir is not important as we do not use it in DA state, here we only need to<a name="line.273"></a>
+<span class="sourceLineNo">274</span>        // confirm that a sync peer in DA state can still replicate data to remote cluster<a name="line.274"></a>
+<span class="sourceLineNo">275</span>        // asynchronously.<a name="line.275"></a>
+<span class="sourceLineNo">276</span>        builder.setReplicateAllUserTables(false)<a name="line.276"></a>
+<span class="sourceLineNo">277</span>          .setTableCFsMap(ImmutableMap.of(tableName, ImmutableList.of()))<a name="line.277"></a>
+<span class="sourceLineNo">278</span>          .setRemoteWALDir(new Path("/RemoteWAL")<a name="line.278"></a>
+<span class="sourceLineNo">279</span>            .makeQualified(fs2.getUri(), fs2.getWorkingDirectory()).toUri().toString());<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      }<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      hbaseAdmin.addReplicationPeer(PEER_ID2, builder.build());<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    }<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  }<a name="line.283"></a>
+<span class="sourceLineNo">284</span><a name="line.284"></a>
+<span class="sourceLineNo">285</span>  @After<a name="line.285"></a>
+<span class="sourceLineNo">286</span>  public void tearDownBase() throws Exception {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    if (peerExist(PEER_ID2)) {<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      hbaseAdmin.removeReplicationPeer(PEER_ID2);<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
+<span class="sourceLineNo">290</span>  }<a name="line.290"></a>
 <span class="sourceLineNo">291</span><a name="line.291"></a>
-<span class="sourceLineNo">292</span>    htable1 = utility1.getConnection().getTable(tableName);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    htable1.put(put);<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span>    Get get = new Get(row);<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    for (int i = 0; i &lt; NB_RETRIES; i++) {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>      if (i == NB_RETRIES - 1) {<a name="line.297"></a>
-<span class="sourceLineNo">298</span>        fail("Waited too much time for put replication");<a name="line.298"></a>
-<span class="sourceLineNo">299</span>      }<a name="line.299"></a>
-<span class="sourceLineNo">300</span>      Result res = htable2.get(get);<a name="line.300"></a>
-<span class="sourceLineNo">301</span>      if (res.isEmpty()) {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>        LOG.info("Row not available");<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        Thread.sleep(SLEEP_TIME);<a name="line.303"></a>
-<span class="sourceLineNo">304</span>      } else {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>        assertArrayEquals(row, res.value());<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        break;<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><a name="line.309"></a>
-<span class="sourceLineNo">310</span>    Delete del = new Delete(row);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    htable1.delete(del);<a name="line.311"></a>
-<span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>    get = new Get(row);<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    for (int i = 0; i &lt; NB_RETRIES; i++) {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      if (i == NB_RETRIES - 1) {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>        fail("Waited too much time for del replication");<a name="line.316"></a>
-<span class="sourceLineNo">317</span>      }<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      Result res = htable2.get(get);<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      if (res.size() &gt;= 1) {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>        LOG.info("Row not deleted");<a name="line.320"></a>
-<span class="sourceLineNo">321</span>        Thread.sleep(SLEEP_TIME);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      } else {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>        break;<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>  }<a name="line.326"></a>
-<span class="sourceLineNo">327</span><a name="line.327"></a>
-<span class="sourceLineNo">328</span>  protected static void runSmallBatchTest() throws IOException, InterruptedException {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    // normal Batch tests<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    loadData("", row);<a name="line.330"></a>
+<span class="sourceLineNo">292</span>  protected static void runSimplePutDeleteTest() throws IOException, InterruptedException {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    Put put = new Put(row);<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    put.addColumn(famName, row, row);<a name="line.294"></a>
+<span class="sourceLineNo">295</span><a name="line.295"></a>
+<span class="sourceLineNo">296</span>    htable1 = utility1.getConnection().getTable(tableName);<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    htable1.put(put);<a name="line.297"></a>
+<span class="sourceLineNo">298</span><a name="line.298"></a>
+<span class="sourceLineNo">299</span>    Get get = new Get(row);<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    for (int i = 0; i &lt; NB_RETRIES; i++) {<a name="line.300"></a>
+<span class="sourceLineNo">301</span>      if (i == NB_RETRIES - 1) {<a name="line.301"></a>
+<span class="sourceLineNo">302</span>        fail("Waited too much time for put replication");<a name="line.302"></a>
+<span class="sourceLineNo">303</span>      }<a name="line.303"></a>
+<span class="sourceLineNo">304</span>      Result res = htable2.get(get);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>      if (res.isEmpty()) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        LOG.info("Row not available");<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        Thread.sleep(SLEEP_TIME);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      } else {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>        assertArrayEquals(row, res.value());<a name="line.309"></a>
+<span class="sourceLineNo">310</span>        break;<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      }<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    }<a name="line.312"></a>
+<span class="sourceLineNo">313</span><a name="line.313"></a>
+<span class="sourceLineNo">314</span>    Delete del = new Delete(row);<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    htable1.delete(del);<a name="line.315"></a>
+<span class="sourceLineNo">316</span><a name="line.316"></a>
+<span class="sourceLineNo">317</span>    get = new Get(row);<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    for (int i = 0; i &lt; NB_RETRIES; i++) {<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      if (i == NB_RETRIES - 1) {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>        fail("Waited too much time for del replication");<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      }<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      Result res = htable2.get(get);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      if (res.size() &gt;= 1) {<a name="line.323"></a>
+<span class="sourceLineNo">324</span>        LOG.info("Row not deleted");<a name="line.324"></a>
+<span class="sourceLineNo">325</span>        Thread.sleep(SLEEP_TIME);<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      } else {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>        break;<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>    Scan scan = new Scan();<a name="line.332"></a>
-<span class="sourceLineNo">333</span><a name="line.333"></a>
-<span class="sourceLineNo">334</span>    ResultScanner scanner1 = htable1.getScanner(scan);<a name="line.334"></a>
-<span class="sourceLineNo">335</span>    Result[] res1 = scanner1.next(NB_ROWS_IN_BATCH);<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    scanner1.close();<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    assertEquals(NB_ROWS_IN_BATCH, res1.length);<a name="line.337"></a>
-<span class="sourceLineNo">338</span><a name="line.338"></a>
-<span class="sourceLineNo">339</span>    waitForReplication(NB_ROWS_IN_BATCH, NB_RETRIES);<a name="line.339"></a>
-<span class="sourceLineNo">340</span>  }<a name="line.340"></a>
-<span class="sourceLineNo">341</span><a name="line.341"></a>
-<span class="sourceLineNo">342</span>  @AfterClass<a name="line.342"></a>
-<span class="sourceLineNo">343</span>  public static void tearDownAfterClass() throws Exception {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    htable2.close();<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    htable1.close();<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    admin.close();<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    utility2.shutdownMiniCluster();<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    utility1.shutdownMiniCluster();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>  }<a name="line.349"></a>
-<span class="sourceLineNo">350</span>}<a name="line.350"></a>
+<span class="sourceLineNo">332</span>  protected static void runSmallBatchTest() throws IOException, InterruptedException {<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    // normal Batch tests<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    loadData("", row);<a name="line.334"></a>
+<span class="sourceLineNo">335</span><a name="line.335"></a>
+<span class="sourceLineNo">336</span>    Scan scan = new Scan();<a name="line.336"></a>
+<span class="sourceLineNo">337</span><a name="line.337"></a>
+<span class="sourceLineNo">338</span>    ResultScanner scanner1 = htable1.getScanner(scan);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    Result[] res1 = scanner1.next(NB_ROWS_IN_BATCH);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    scanner1.close();<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    assertEquals(NB_ROWS_IN_BATCH, res1.length);<a name="line.341"></a>
+<span class="sourceLineNo">342</span><a name="line.342"></a>
+<span class="sourceLineNo">343</span>    waitForReplication(NB_ROWS_IN_BATCH, NB_RETRIES);<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>  @AfterClass<a name="line.346"></a>
+<span class="sourceLineNo">347</span>  public static void tearDownAfterClass() throws Exception {<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    htable2.close();<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    htable1.close();<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    admin.close();<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    utility2.shutdownMiniCluster();<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    utility1.shutdownMiniCluster();<a name="line.352"></a>
+<span class="sourceLineNo">353</span>  }<a name="line.353"></a>
+<span class="sourceLineNo">354</span>}<a name="line.354"></a>
 
 
 
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/replication/TestVerifyReplication.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/replication/TestVerifyReplication.html
index 64bd0f1..f939e14 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/replication/TestVerifyReplication.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/replication/TestVerifyReplication.html
@@ -33,543 +33,679 @@
 <span class="sourceLineNo">025</span>import static org.junit.Assert.fail;<a name="line.25"></a>
 <span class="sourceLineNo">026</span><a name="line.26"></a>
 <span class="sourceLineNo">027</span>import java.io.IOException;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import java.util.TreeMap;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import org.apache.hadoop.conf.Configuration;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import org.apache.hadoop.fs.FileStatus;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import org.apache.hadoop.fs.FileSystem;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.apache.hadoop.fs.Path;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.Cell;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.CellUtil;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.HConstants;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.TableName;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.Admin;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.client.Get;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.client.Put;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.client.Result;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.client.Table;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.TableDescriptorBuilder;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.mapreduce.replication.VerifyReplication;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.snapshot.SnapshotTestingUtils;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.testclassification.ReplicationTests;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.mapreduce.Job;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.junit.Before;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.junit.ClassRule;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.junit.Rule;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.junit.Test;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.junit.experimental.categories.Category;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.junit.rules.TestName;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.slf4j.Logger;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.slf4j.LoggerFactory;<a name="line.67"></a>
-<span class="sourceLineNo">068</span><a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.69"></a>
-<span class="sourceLineNo">070</span><a name="line.70"></a>
-<span class="sourceLineNo">071</span>@Category({ ReplicationTests.class, LargeTests.class })<a name="line.71"></a>
-<span class="sourceLineNo">072</span>public class TestVerifyReplication extends TestReplicationBase {<a name="line.72"></a>
+<span class="sourceLineNo">028</span>import java.util.ArrayList;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import java.util.List;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import java.util.TreeMap;<a name="line.30"></a>
+<span class="sourceLineNo">031</span><a name="line.31"></a>
+<span class="sourceLineNo">032</span>import org.apache.hadoop.conf.Configuration;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import org.apache.hadoop.fs.FileStatus;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.apache.hadoop.fs.FileSystem;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.apache.hadoop.fs.Path;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.Cell;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.CellUtil;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.HConstants;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.TableName;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.client.Admin;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.client.Get;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.client.Put;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.client.Result;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.Table;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.client.TableDescriptorBuilder;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.mapreduce.replication.VerifyReplication;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.snapshot.SnapshotTestingUtils;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.testclassification.ReplicationTests;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.mapreduce.Job;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.junit.AfterClass;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.junit.Before;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.junit.BeforeClass;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.junit.ClassRule;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.junit.Rule;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.junit.Test;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.junit.experimental.categories.Category;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.junit.rules.TestName;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.slf4j.Logger;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.slf4j.LoggerFactory;<a name="line.72"></a>
 <span class="sourceLineNo">073</span><a name="line.73"></a>
-<span class="sourceLineNo">074</span>  @ClassRule<a name="line.74"></a>
-<span class="sourceLineNo">075</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.75"></a>
-<span class="sourceLineNo">076</span>      HBaseClassTestRule.forClass(TestVerifyReplication.class);<a name="line.76"></a>
-<span class="sourceLineNo">077</span><a name="line.77"></a>
-<span class="sourceLineNo">078</span>  private static final Logger LOG = LoggerFactory.getLogger(TestVerifyReplication.class);<a name="line.78"></a>
-<span class="sourceLineNo">079</span><a name="line.79"></a>
-<span class="sourceLineNo">080</span>  private static final String PEER_ID = "2";<a name="line.80"></a>
-<span class="sourceLineNo">081</span><a name="line.81"></a>
-<span class="sourceLineNo">082</span>  @Rule<a name="line.82"></a>
-<span class="sourceLineNo">083</span>  public TestName name = new TestName();<a name="line.83"></a>
+<span class="sourceLineNo">074</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.74"></a>
+<span class="sourceLineNo">075</span><a name="line.75"></a>
+<span class="sourceLineNo">076</span>@Category({ ReplicationTests.class, LargeTests.class })<a name="line.76"></a>
+<span class="sourceLineNo">077</span>public class TestVerifyReplication extends TestReplicationBase {<a name="line.77"></a>
+<span class="sourceLineNo">078</span><a name="line.78"></a>
+<span class="sourceLineNo">079</span>  @ClassRule<a name="line.79"></a>
+<span class="sourceLineNo">080</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.80"></a>
+<span class="sourceLineNo">081</span>      HBaseClassTestRule.forClass(TestVerifyReplication.class);<a name="line.81"></a>
+<span class="sourceLineNo">082</span><a name="line.82"></a>
+<span class="sourceLineNo">083</span>  private static final Logger LOG = LoggerFactory.getLogger(TestVerifyReplication.class);<a name="line.83"></a>
 <span class="sourceLineNo">084</span><a name="line.84"></a>
-<span class="sourceLineNo">085</span>  @Before<a name="line.85"></a>
-<span class="sourceLineNo">086</span>  public void setUp() throws Exception {<a name="line.86"></a>
-<span class="sourceLineNo">087</span>    cleanUp();<a name="line.87"></a>
-<span class="sourceLineNo">088</span>  }<a name="line.88"></a>
-<span class="sourceLineNo">089</span><a name="line.89"></a>
-<span class="sourceLineNo">090</span>  private void runVerifyReplication(String[] args, int expectedGoodRows, int expectedBadRows)<a name="line.90"></a>
-<span class="sourceLineNo">091</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.91"></a>
-<span class="sourceLineNo">092</span>    Job job = new VerifyReplication().createSubmittableJob(new Configuration(conf1), args);<a name="line.92"></a>
-<span class="sourceLineNo">093</span>    if (job == null) {<a name="line.93"></a>
-<span class="sourceLineNo">094</span>      fail("Job wasn't created, see the log");<a name="line.94"></a>
-<span class="sourceLineNo">095</span>    }<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    if (!job.waitForCompletion(true)) {<a name="line.96"></a>
-<span class="sourceLineNo">097</span>      fail("Job failed, see the log");<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    }<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    assertEquals(expectedGoodRows,<a name="line.99"></a>
-<span class="sourceLineNo">100</span>      job.getCounters().findCounter(VerifyReplication.Verifier.Counters.GOODROWS).getValue());<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    assertEquals(expectedBadRows,<a name="line.101"></a>
-<span class="sourceLineNo">102</span>      job.getCounters().findCounter(VerifyReplication.Verifier.Counters.BADROWS).getValue());<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  }<a name="line.103"></a>
-<span class="sourceLineNo">104</span><a name="line.104"></a>
-<span class="sourceLineNo">105</span>  /**<a name="line.105"></a>
-<span class="sourceLineNo">106</span>   * Do a small loading into a table, make sure the data is really the same, then run the<a name="line.106"></a>
-<span class="sourceLineNo">107</span>   * VerifyReplication job to check the results. Do a second comparison where all the cells are<a name="line.107"></a>
-<span class="sourceLineNo">108</span>   * different.<a name="line.108"></a>
-<span class="sourceLineNo">109</span>   */<a name="line.109"></a>
-<span class="sourceLineNo">110</span>  @Test<a name="line.110"></a>
-<span class="sourceLineNo">111</span>  public void testVerifyRepJob() throws Exception {<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    // Populate the tables, at the same time it guarantees that the tables are<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    // identical since it does the check<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    runSmallBatchTest();<a name="line.114"></a>
-<span class="sourceLineNo">115</span><a name="line.115"></a>
-<span class="sourceLineNo">116</span>    String[] args = new String[] { PEER_ID, tableName.getNameAsString() };<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    runVerifyReplication(args, NB_ROWS_IN_BATCH, 0);<a name="line.117"></a>
-<span class="sourceLineNo">118</span><a name="line.118"></a>
-<span class="sourceLineNo">119</span>    Scan scan = new Scan();<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    ResultScanner rs = htable2.getScanner(scan);<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    Put put = null;<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    for (Result result : rs) {<a name="line.122"></a>
-<span class="sourceLineNo">123</span>      put = new Put(result.getRow());<a name="line.123"></a>
-<span class="sourceLineNo">124</span>      Cell firstVal = result.rawCells()[0];<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      put.addColumn(CellUtil.cloneFamily(firstVal), CellUtil.cloneQualifier(firstVal),<a name="line.125"></a>
-<span class="sourceLineNo">126</span>        Bytes.toBytes("diff data"));<a name="line.126"></a>
-<span class="sourceLineNo">127</span>      htable2.put(put);<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    }<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    Delete delete = new Delete(put.getRow());<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    htable2.delete(delete);<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    runVerifyReplication(args, 0, NB_ROWS_IN_BATCH);<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  }<a name="line.132"></a>
-<span class="sourceLineNo">133</span><a name="line.133"></a>
-<span class="sourceLineNo">134</span>  /**<a name="line.134"></a>
-<span class="sourceLineNo">135</span>   * Load a row into a table, make sure the data is really the same, delete the row, make sure the<a name="line.135"></a>
-<span class="sourceLineNo">136</span>   * delete marker is replicated, run verify replication with and without raw to check the results.<a name="line.136"></a>
-<span class="sourceLineNo">137</span>   */<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  @Test<a name="line.138"></a>
-<span class="sourceLineNo">139</span>  public void testVerifyRepJobWithRawOptions() throws Exception {<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    LOG.info(name.getMethodName());<a name="line.140"></a>
+<span class="sourceLineNo">085</span>  private static final String PEER_ID = "2";<a name="line.85"></a>
+<span class="sourceLineNo">086</span>  private static final TableName peerTableName = TableName.valueOf("peerTest");<a name="line.86"></a>
+<span class="sourceLineNo">087</span>  private static Table htable3;<a name="line.87"></a>
+<span class="sourceLineNo">088</span><a name="line.88"></a>
+<span class="sourceLineNo">089</span>  @Rule<a name="line.89"></a>
+<span class="sourceLineNo">090</span>  public TestName name = new TestName();<a name="line.90"></a>
+<span class="sourceLineNo">091</span><a name="line.91"></a>
+<span class="sourceLineNo">092</span>  @Before<a name="line.92"></a>
+<span class="sourceLineNo">093</span>  public void setUp() throws Exception {<a name="line.93"></a>
+<span class="sourceLineNo">094</span>    cleanUp();<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    utility2.deleteTableData(peerTableName);<a name="line.95"></a>
+<span class="sourceLineNo">096</span>  }<a name="line.96"></a>
+<span class="sourceLineNo">097</span><a name="line.97"></a>
+<span class="sourceLineNo">098</span>  @BeforeClass<a name="line.98"></a>
+<span class="sourceLineNo">099</span>  public static void setUpBeforeClass() throws Exception {<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    TestReplicationBase.setUpBeforeClass();<a name="line.100"></a>
+<span class="sourceLineNo">101</span><a name="line.101"></a>
+<span class="sourceLineNo">102</span>    TableDescriptor peerTable = TableDescriptorBuilder.newBuilder(peerTableName).setColumnFamily(<a name="line.102"></a>
+<span class="sourceLineNo">103</span>                    ColumnFamilyDescriptorBuilder.newBuilder(noRepfamName).setMaxVersions(100)<a name="line.103"></a>
+<span class="sourceLineNo">104</span>                            .build()).build();<a name="line.104"></a>
+<span class="sourceLineNo">105</span><a name="line.105"></a>
+<span class="sourceLineNo">106</span>    Connection connection2 = ConnectionFactory.createConnection(conf2);<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    try (Admin admin2 = connection2.getAdmin()) {<a name="line.107"></a>
+<span class="sourceLineNo">108</span>      admin2.createTable(peerTable, HBaseTestingUtility.KEYS_FOR_HBA_CREATE_TABLE);<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    }<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    htable3 = connection2.getTable(peerTableName);<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>  private void runVerifyReplication(String[] args, int expectedGoodRows, int expectedBadRows)<a name="line.113"></a>
+<span class="sourceLineNo">114</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.114"></a>
+<span class="sourceLineNo">115</span>    Job job = new VerifyReplication().createSubmittableJob(new Configuration(conf1), args);<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    if (job == null) {<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      fail("Job wasn't created, see the log");<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    }<a name="line.118"></a>
+<span class="sourceLineNo">119</span>    if (!job.waitForCompletion(true)) {<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      fail("Job failed, see the log");<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    }<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    assertEquals(expectedGoodRows,<a name="line.122"></a>
+<span class="sourceLineNo">123</span>      job.getCounters().findCounter(VerifyReplication.Verifier.Counters.GOODROWS).getValue());<a name="line.123"></a>
+<span class="sourceLineNo">124</span>    assertEquals(expectedBadRows,<a name="line.124"></a>
+<span class="sourceLineNo">125</span>      job.getCounters().findCounter(VerifyReplication.Verifier.Counters.BADROWS).getValue());<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  }<a name="line.126"></a>
+<span class="sourceLineNo">127</span><a name="line.127"></a>
+<span class="sourceLineNo">128</span>  /**<a name="line.128"></a>
+<span class="sourceLineNo">129</span>   * Do a small loading into a table, make sure the data is really the same, then run the<a name="line.129"></a>
+<span class="sourceLineNo">130</span>   * VerifyReplication job to check the results. Do a second comparison where all the cells are<a name="line.130"></a>
+<span class="sourceLineNo">131</span>   * different.<a name="line.131"></a>
+<span class="sourceLineNo">132</span>   */<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  @Test<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  public void testVerifyRepJob() throws Exception {<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    // Populate the tables, at the same time it guarantees that the tables are<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    // identical since it does the check<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    runSmallBatchTest();<a name="line.137"></a>
+<span class="sourceLineNo">138</span><a name="line.138"></a>
+<span class="sourceLineNo">139</span>    String[] args = new String[] { PEER_ID, tableName.getNameAsString() };<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    runVerifyReplication(args, NB_ROWS_IN_BATCH, 0);<a name="line.140"></a>
 <span class="sourceLineNo">141</span><a name="line.141"></a>
-<span class="sourceLineNo">142</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    byte[] familyname = Bytes.toBytes("fam_raw");<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    byte[] row = Bytes.toBytes("row_raw");<a name="line.144"></a>
-<span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>    Table lHtable1 = null;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    Table lHtable2 = null;<a name="line.147"></a>
-<span class="sourceLineNo">148</span><a name="line.148"></a>
-<span class="sourceLineNo">149</span>    try {<a name="line.149"></a>
-<span class="sourceLineNo">150</span>      ColumnFamilyDescriptor fam = ColumnFamilyDescriptorBuilder.newBuilder(familyname)<a name="line.150"></a>
-<span class="sourceLineNo">151</span>          .setMaxVersions(100).setScope(HConstants.REPLICATION_SCOPE_GLOBAL).build();<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      TableDescriptor table =<a name="line.152"></a>
-<span class="sourceLineNo">153</span>          TableDescriptorBuilder.newBuilder(tableName).setColumnFamily(fam).build();<a name="line.153"></a>
-<span class="sourceLineNo">154</span>      scopes = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.154"></a>
-<span class="sourceLineNo">155</span>      for (ColumnFamilyDescriptor f : table.getColumnFamilies()) {<a name="line.155"></a>
-<span class="sourceLineNo">156</span>        scopes.put(f.getName(), f.getScope());<a name="line.156"></a>
-<span class="sourceLineNo">157</span>      }<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>      Connection connection1 = ConnectionFactory.createConnection(conf1);<a name="line.159"></a>
-<span class="sourceLineNo">160</span>      Connection connection2 = ConnectionFactory.createConnection(conf2);<a name="line.160"></a>
-<span class="sourceLineNo">161</span>      try (Admin admin1 = connection1.getAdmin()) {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>        admin1.createTable(table, HBaseTestingUtility.KEYS_FOR_HBA_CREATE_TABLE);<a name="line.162"></a>
-<span class="sourceLineNo">163</span>      }<a name="line.163"></a>
-<span class="sourceLineNo">164</span>      try (Admin admin2 = connection2.getAdmin()) {<a name="line.164"></a>
-<span class="sourceLineNo">165</span>        admin2.createTable(table, HBaseTestingUtility.KEYS_FOR_HBA_CREATE_TABLE);<a name="line.165"></a>
-<span class="sourceLineNo">166</span>      }<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      utility1.waitUntilAllRegionsAssigned(tableName);<a name="line.167"></a>
-<span class="sourceLineNo">168</span>      utility2.waitUntilAllRegionsAssigned(tableName);<a name="line.168"></a>
-<span class="sourceLineNo">169</span><a name="line.169"></a>
-<span class="sourceLineNo">170</span>      lHtable1 = utility1.getConnection().getTable(tableName);<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      lHtable2 = utility2.getConnection().getTable(tableName);<a name="line.171"></a>
-<span class="sourceLineNo">172</span><a name="line.172"></a>
-<span class="sourceLineNo">173</span>      Put put = new Put(row);<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      put.addColumn(familyname, row, row);<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      lHtable1.put(put);<a name="line.175"></a>
-<span class="sourceLineNo">176</span><a name="line.176"></a>
-<span class="sourceLineNo">177</span>      Get get = new Get(row);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      for (int i = 0; i &lt; NB_RETRIES; i++) {<a name="line.178"></a>
-<span class="sourceLineNo">179</span>        if (i == NB_RETRIES - 1) {<a name="line.179"></a>
-<span class="sourceLineNo">180</span>          fail("Waited too much time for put replication");<a name="line.180"></a>
-<span class="sourceLineNo">181</span>        }<a name="line.181"></a>
-<span class="sourceLineNo">182</span>        Result res = lHtable2.get(get);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>        if (res.isEmpty()) {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>          LOG.info("Row not available");<a name="line.184"></a>
-<span class="sourceLineNo">185</span>          Thread.sleep(SLEEP_TIME);<a name="line.185"></a>
-<span class="sourceLineNo">186</span>        } else {<a name="line.186"></a>
-<span class="sourceLineNo">187</span>          assertArrayEquals(res.value(), row);<a name="line.187"></a>
-<span class="sourceLineNo">188</span>          break;<a name="line.188"></a>
-<span class="sourceLineNo">189</span>        }<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      }<a name="line.190"></a>
-<span class="sourceLineNo">191</span><a name="line.191"></a>
-<span class="sourceLineNo">192</span>      Delete del = new Delete(row);<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      lHtable1.delete(del);<a name="line.193"></a>
-<span class="sourceLineNo">194</span><a name="line.194"></a>
-<span class="sourceLineNo">195</span>      get = new Get(row);<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      for (int i = 0; i &lt; NB_RETRIES; i++) {<a name="line.196"></a>
-<span class="sourceLineNo">197</span>        if (i == NB_RETRIES - 1) {<a name="line.197"></a>
-<span class="sourceLineNo">198</span>          fail("Waited too much time for del replication");<a name="line.198"></a>
-<span class="sourceLineNo">199</span>        }<a name="line.199"></a>
-<span class="sourceLineNo">200</span>        Result res = lHtable2.get(get);<a name="line.200"></a>
-<span class="sourceLineNo">201</span>        if (res.size() &gt;= 1) {<a name="line.201"></a>
-<span class="sourceLineNo">202</span>          LOG.info("Row not deleted");<a name="line.202"></a>
-<span class="sourceLineNo">203</span>          Thread.sleep(SLEEP_TIME);<a name="line.203"></a>
-<span class="sourceLineNo">204</span>        } else {<a name="line.204"></a>
-<span class="sourceLineNo">205</span>          break;<a name="line.205"></a>
-<span class="sourceLineNo">206</span>        }<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      }<a name="line.207"></a>
-<span class="sourceLineNo">208</span><a name="line.208"></a>
-<span class="sourceLineNo">209</span>      // Checking verifyReplication for the default behavior.<a name="line.209"></a>
-<span class="sourceLineNo">210</span>      String[] argsWithoutRaw = new String[] { PEER_ID, tableName.getNameAsString() };<a name="line.210"></a>
-<span class="sourceLineNo">211</span>      runVerifyReplication(argsWithoutRaw, 0, 0);<a name="line.211"></a>
-<span class="sourceLineNo">212</span><a name="line.212"></a>
-<span class="sourceLineNo">213</span>      // Checking verifyReplication with raw<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      String[] argsWithRawAsTrue = new String[] { "--raw", PEER_ID, tableName.getNameAsString() };<a name="line.214"></a>
-<span class="sourceLineNo">215</span>      runVerifyReplication(argsWithRawAsTrue, 1, 0);<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    } finally {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      if (lHtable1 != null) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>        lHtable1.close();<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      }<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      if (lHtable2 != null) {<a name="line.220"></a>
-<span class="sourceLineNo">221</span>        lHtable2.close();<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      }<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    }<a name="line.223"></a>
-<span class="sourceLineNo">224</span>  }<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>  // VerifyReplication should honor versions option<a name="line.226"></a>
-<span class="sourceLineNo">227</span>  @Test<a name="line.227"></a>
-<span class="sourceLineNo">228</span>  public void testHBase14905() throws Exception {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    // normal Batch tests<a name="line.229"></a>
-<span class="sourceLineNo">230</span>    byte[] qualifierName = Bytes.toBytes("f1");<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    put.addColumn(famName, qualifierName, Bytes.toBytes("v1002"));<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    htable1.put(put);<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    put.addColumn(famName, qualifierName, Bytes.toBytes("v1001"));<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    htable1.put(put);<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    put.addColumn(famName, qualifierName, Bytes.toBytes("v1112"));<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    htable1.put(put);<a name="line.237"></a>
-<span class="sourceLineNo">238</span><a name="line.238"></a>
-<span class="sourceLineNo">239</span>    Scan scan = new Scan();<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    scan.readVersions(100);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    ResultScanner scanner1 = htable1.getScanner(scan);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    Result[] res1 = scanner1.next(1);<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    scanner1.close();<a name="line.243"></a>
-<span class="sourceLineNo">244</span><a name="line.244"></a>
-<span class="sourceLineNo">245</span>    assertEquals(1, res1.length);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    assertEquals(3, res1[0].getColumnCells(famName, qualifierName).size());<a name="line.246"></a>
-<span class="sourceLineNo">247</span><a name="line.247"></a>
-<span class="sourceLineNo">248</span>    for (int i = 0; i &lt; NB_RETRIES; i++) {<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      scan = new Scan();<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      scan.readVersions(100);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      scanner1 = htable2.getScanner(scan);<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      res1 = scanner1.next(1);<a name="line.252"></a>
-<span class="sourceLineNo">253</span>      scanner1.close();<a name="line.253"></a>
-<span class="sourceLineNo">254</span>      if (res1.length != 1) {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>        LOG.info("Only got " + res1.length + " rows");<a name="line.255"></a>
-<span class="sourceLineNo">256</span>        Thread.sleep(SLEEP_TIME);<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      } else {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>        int cellNumber = res1[0].getColumnCells(famName, Bytes.toBytes("f1")).size();<a name="line.258"></a>
-<span class="sourceLineNo">259</span>        if (cellNumber != 3) {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>          LOG.info("Only got " + cellNumber + " cells");<a name="line.260"></a>
-<span class="sourceLineNo">261</span>          Thread.sleep(SLEEP_TIME);<a name="line.261"></a>
-<span class="sourceLineNo">262</span>        } else {<a name="line.262"></a>
-<span class="sourceLineNo">263</span>          break;<a name="line.263"></a>
-<span class="sourceLineNo">264</span>        }<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      }<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      if (i == NB_RETRIES - 1) {<a name="line.266"></a>
-<span class="sourceLineNo">267</span>        fail("Waited too much time for normal batch replication");<a name="line.267"></a>
-<span class="sourceLineNo">268</span>      }<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    }<a name="line.269"></a>
+<span class="sourceLineNo">142</span>    Scan scan = new Scan();<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    ResultScanner rs = htable2.getScanner(scan);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    Put put = null;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    for (Result result : rs) {<a name="line.145"></a>
+<span class="sourceLineNo">146</span>      put = new Put(result.getRow());<a name="line.146"></a>
+<span class="sourceLineNo">147</span>      Cell firstVal = result.rawCells()[0];<a name="line.147"></a>
+<span class="sourceLineNo">148</span>      put.addColumn(CellUtil.cloneFamily(firstVal), CellUtil.cloneQualifier(firstVal),<a name="line.148"></a>
+<span class="sourceLineNo">149</span>        Bytes.toBytes("diff data"));<a name="line.149"></a>
+<span class="sourceLineNo">150</span>      htable2.put(put);<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    }<a name="line.151"></a>
+<span class="sourceLineNo">152</span>    Delete delete = new Delete(put.getRow());<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    htable2.delete(delete);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    runVerifyReplication(args, 0, NB_ROWS_IN_BATCH);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  }<a name="line.155"></a>
+<span class="sourceLineNo">156</span><a name="line.156"></a>
+<span class="sourceLineNo">157</span>  /**<a name="line.157"></a>
+<span class="sourceLineNo">158</span>   * Load a row into a table, make sure the data is really the same, delete the row, make sure the<a name="line.158"></a>
+<span class="sourceLineNo">159</span>   * delete marker is replicated, run verify replication with and without raw to check the results.<a name="line.159"></a>
+<span class="sourceLineNo">160</span>   */<a name="line.160"></a>
+<span class="sourceLineNo">161</span>  @Test<a name="line.161"></a>
+<span class="sourceLineNo">162</span>  public void testVerifyRepJobWithRawOptions() throws Exception {<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    LOG.info(name.getMethodName());<a name="line.163"></a>
+<span class="sourceLineNo">164</span><a name="line.164"></a>
+<span class="sourceLineNo">165</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    byte[] familyname = Bytes.toBytes("fam_raw");<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    byte[] row = Bytes.toBytes("row_raw");<a name="line.167"></a>
+<span class="sourceLineNo">168</span><a name="line.168"></a>
+<span class="sourceLineNo">169</span>    Table lHtable1 = null;<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    Table lHtable2 = null;<a name="line.170"></a>
+<span class="sourceLineNo">171</span><a name="line.171"></a>
+<span class="sourceLineNo">172</span>    try {<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      ColumnFamilyDescriptor fam = ColumnFamilyDescriptorBuilder.newBuilder(familyname)<a name="line.173"></a>
+<span class="sourceLineNo">174</span>          .setMaxVersions(100).setScope(HConstants.REPLICATION_SCOPE_GLOBAL).build();<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      TableDescriptor table =<a name="line.175"></a>
+<span class="sourceLineNo">176</span>          TableDescriptorBuilder.newBuilder(tableName).setColumnFamily(fam).build();<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      scopes = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      for (ColumnFamilyDescriptor f : table.getColumnFamilies()) {<a name="line.178"></a>
+<span class="sourceLineNo">179</span>        scopes.put(f.getName(), f.getScope());<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      }<a name="line.180"></a>
+<span class="sourceLineNo">181</span><a name="line.181"></a>
+<span class="sourceLineNo">182</span>      Connection connection1 = ConnectionFactory.createConnection(conf1);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      Connection connection2 = ConnectionFactory.createConnection(conf2);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      try (Admin admin1 = connection1.getAdmin()) {<a name="line.184"></a>
+<span class="sourceLineNo">185</span>        admin1.createTable(table, HBaseTestingUtility.KEYS_FOR_HBA_CREATE_TABLE);<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      }<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      try (Admin admin2 = connection2.getAdmin()) {<a name="line.187"></a>
+<span class="sourceLineNo">188</span>        admin2.createTable(table, HBaseTestingUtility.KEYS_FOR_HBA_CREATE_TABLE);<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      }<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      utility1.waitUntilAllRegionsAssigned(tableName);<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      utility2.waitUntilAllRegionsAssigned(tableName);<a name="line.191"></a>
+<span class="sourceLineNo">192</span><a name="line.192"></a>
+<span class="sourceLineNo">193</span>      lHtable1 = utility1.getConnection().getTable(tableName);<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      lHtable2 = utility2.getConnection().getTable(tableName);<a name="line.194"></a>
+<span class="sourceLineNo">195</span><a name="line.195"></a>
+<span class="sourceLineNo">196</span>      Put put = new Put(row);<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      put.addColumn(familyname, row, row);<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      lHtable1.put(put);<a name="line.198"></a>
+<span class="sourceLineNo">199</span><a name="line.199"></a>
+<span class="sourceLineNo">200</span>      Get get = new Get(row);<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      for (int i = 0; i &lt; NB_RETRIES; i++) {<a name="line.201"></a>
+<span class="sourceLineNo">202</span>        if (i == NB_RETRIES - 1) {<a name="line.202"></a>
+<span class="sourceLineNo">203</span>          fail("Waited too much time for put replication");<a name="line.203"></a>
+<span class="sourceLineNo">204</span>        }<a name="line.204"></a>
+<span class="sourceLineNo">205</span>        Result res = lHtable2.get(get);<a name="line.205"></a>
+<span class="sourceLineNo">206</span>        if (res.isEmpty()) {<a name="line.206"></a>
+<span class="sourceLineNo">207</span>          LOG.info("Row not available");<a name="line.207"></a>
+<span class="sourceLineNo">208</span>          Thread.sleep(SLEEP_TIME);<a name="line.208"></a>
+<span class="sourceLineNo">209</span>        } else {<a name="line.209"></a>
+<span class="sourceLineNo">210</span>          assertArrayEquals(res.value(), row);<a name="line.210"></a>
+<span class="sourceLineNo">211</span>          break;<a name="line.211"></a>
+<span class="sourceLineNo">212</span>        }<a name="line.212"></a>
+<span class="sourceLineNo">213</span>      }<a name="line.213"></a>
+<span class="sourceLineNo">214</span><a name="line.214"></a>
+<span class="sourceLineNo">215</span>      Delete del = new Delete(row);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>      lHtable1.delete(del);<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>      get = new Get(row);<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      for (int i = 0; i &lt; NB_RETRIES; i++) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>        if (i == NB_RETRIES - 1) {<a name="line.220"></a>
+<span class="sourceLineNo">221</span>          fail("Waited too much time for del replication");<a name="line.221"></a>
+<span class="sourceLineNo">222</span>        }<a name="line.222"></a>
+<span class="sourceLineNo">223</span>        Result res = lHtable2.get(get);<a name="line.223"></a>
+<span class="sourceLineNo">224</span>        if (res.size() &gt;= 1) {<a name="line.224"></a>
+<span class="sourceLineNo">225</span>          LOG.info("Row not deleted");<a name="line.225"></a>
+<span class="sourceLineNo">226</span>          Thread.sleep(SLEEP_TIME);<a name="line.226"></a>
+<span class="sourceLineNo">227</span>        } else {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>          break;<a name="line.228"></a>
+<span class="sourceLineNo">229</span>        }<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      }<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>      // Checking verifyReplication for the default behavior.<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      String[] argsWithoutRaw = new String[] { PEER_ID, tableName.getNameAsString() };<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      runVerifyReplication(argsWithoutRaw, 0, 0);<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span>      // Checking verifyReplication with raw<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      String[] argsWithRawAsTrue = new String[] { "--raw", PEER_ID, tableName.getNameAsString() };<a name="line.237"></a>
+<span class="sourceLineNo">238</span>      runVerifyReplication(argsWithRawAsTrue, 1, 0);<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    } finally {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      if (lHtable1 != null) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>        lHtable1.close();<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      }<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      if (lHtable2 != null) {<a name="line.243"></a>
+<span class="sourceLineNo">244</span>        lHtable2.close();<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      }<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    }<a name="line.246"></a>
+<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
+<span class="sourceLineNo">248</span><a name="line.248"></a>
+<span class="sourceLineNo">249</span>  // VerifyReplication should honor versions option<a name="line.249"></a>
+<span class="sourceLineNo">250</span>  @Test<a name="line.250"></a>
+<span class="sourceLineNo">251</span>  public void testHBase14905() throws Exception {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    // normal Batch tests<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    byte[] qualifierName = Bytes.toBytes("f1");<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    put.addColumn(famName, qualifierName, Bytes.toBytes("v1002"));<a name="line.255"></a>
+<span class="sourceLineNo">256</span>    htable1.put(put);<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    put.addColumn(famName, qualifierName, Bytes.toBytes("v1001"));<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    htable1.put(put);<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    put.addColumn(famName, qualifierName, Bytes.toBytes("v1112"));<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    htable1.put(put);<a name="line.260"></a>
+<span class="sourceLineNo">261</span><a name="line.261"></a>
+<span class="sourceLineNo">262</span>    Scan scan = new Scan();<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    scan.readVersions(100);<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    ResultScanner scanner1 = htable1.getScanner(scan);<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    Result[] res1 = scanner1.next(1);<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    scanner1.close();<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>    assertEquals(1, res1.length);<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    assertEquals(3, res1[0].getColumnCells(famName, qualifierName).size());<a name="line.269"></a>
 <span class="sourceLineNo">270</span><a name="line.270"></a>
-<span class="sourceLineNo">271</span>    put.addColumn(famName, qualifierName, Bytes.toBytes("v1111"));<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    htable2.put(put);<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    put.addColumn(famName, qualifierName, Bytes.toBytes("v1112"));<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    htable2.put(put);<a name="line.274"></a>
-<span class="sourceLineNo">275</span><a name="line.275"></a>
-<span class="sourceLineNo">276</span>    scan = new Scan();<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    scan.readVersions(100);<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    scanner1 = htable2.getScanner(scan);<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    res1 = scanner1.next(NB_ROWS_IN_BATCH);<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    scanner1.close();<a name="line.280"></a>
-<span class="sourceLineNo">281</span><a name="line.281"></a>
-<span class="sourceLineNo">282</span>    assertEquals(1, res1.length);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    assertEquals(5, res1[0].getColumnCells(famName, qualifierName).size());<a name="line.283"></a>
-<span class="sourceLineNo">284</span><a name="line.284"></a>
-<span class="sourceLineNo">285</span>    String[] args = new String[] { "--versions=100", PEER_ID, tableName.getNameAsString() };<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    runVerifyReplication(args, 0, 1);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>  }<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>  // VerifyReplication should honor versions option<a name="line.289"></a>
-<span class="sourceLineNo">290</span>  @Test<a name="line.290"></a>
-<span class="sourceLineNo">291</span>  public void testVersionMismatchHBase14905() throws Exception {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    // normal Batch tests<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    byte[] qualifierName = Bytes.toBytes("f1");<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    long ts = System.currentTimeMillis();<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    put.addColumn(famName, qualifierName, ts + 1, Bytes.toBytes("v1"));<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    htable1.put(put);<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    put.addColumn(famName, qualifierName, ts + 2, Bytes.toBytes("v2"));<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    htable1.put(put);<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    put.addColumn(famName, qualifierName, ts + 3, Bytes.toBytes("v3"));<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    htable1.put(put);<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>    Scan scan = new Scan();<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    scan.readVersions(100);<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    ResultScanner scanner1 = htable1.getScanner(scan);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    Result[] res1 = scanner1.next(1);<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    scanner1.close();<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>    assertEquals(1, res1.length);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    assertEquals(3, res1[0].getColumnCells(famName, qualifierName).size());<a name="line.310"></a>
+<span class="sourceLineNo">271</span>    for (int i = 0; i &lt; NB_RETRIES; i++) {<a name="line.271"></a>
+<span class="sourceLineNo">272</span>      scan = new Scan();<a name="line.272"></a>
+<span class="sourceLineNo">273</span>      scan.readVersions(100);<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      scanner1 = htable2.getScanner(scan);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>      res1 = scanner1.next(1);<a name="line.275"></a>
+<span class="sourceLineNo">276</span>      scanner1.close();<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      if (res1.length != 1) {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>        LOG.info("Only got " + res1.length + " rows");<a name="line.278"></a>
+<span class="sourceLineNo">279</span>        Thread.sleep(SLEEP_TIME);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      } else {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>        int cellNumber = res1[0].getColumnCells(famName, Bytes.toBytes("f1")).size();<a name="line.281"></a>
+<span class="sourceLineNo">282</span>        if (cellNumber != 3) {<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          LOG.info("Only got " + cellNumber + " cells");<a name="line.283"></a>
+<span class="sourceLineNo">284</span>          Thread.sleep(SLEEP_TIME);<a name="line.284"></a>
+<span class="sourceLineNo">285</span>        } else {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>          break;<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      if (i == NB_RETRIES - 1) {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        fail("Waited too much time for normal batch replication");<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      }<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    }<a name="line.292"></a>
+<span class="sourceLineNo">293</span><a name="line.293"></a>
+<span class="sourceLineNo">294</span>    put.addColumn(famName, qualifierName, Bytes.toBytes("v1111"));<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    htable2.put(put);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    put.addColumn(famName, qualifierName, Bytes.toBytes("v1112"));<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    htable2.put(put);<a name="line.297"></a>
+<span class="sourceLineNo">298</span><a name="line.298"></a>
+<span class="sourceLineNo">299</span>    scan = new Scan();<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    scan.readVersions(100);<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    scanner1 = htable2.getScanner(scan);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    res1 = scanner1.next(NB_ROWS_IN_BATCH);<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    scanner1.close();<a name="line.303"></a>
+<span class="sourceLineNo">304</span><a name="line.304"></a>
+<span class="sourceLineNo">305</span>    assertEquals(1, res1.length);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    assertEquals(5, res1[0].getColumnCells(famName, qualifierName).size());<a name="line.306"></a>
+<span class="sourceLineNo">307</span><a name="line.307"></a>
+<span class="sourceLineNo">308</span>    String[] args = new String[] { "--versions=100", PEER_ID, tableName.getNameAsString() };<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    runVerifyReplication(args, 0, 1);<a name="line.309"></a>
+<span class="sourceLineNo">310</span>  }<a name="line.310"></a>
 <span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span>    for (int i = 0; i &lt; NB_RETRIES; i++) {<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      scan = new Scan();<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      scan.readVersions(100);<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      scanner1 = htable2.getScanner(scan);<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      res1 = scanner1.next(1);<a name="line.316"></a>
-<span class="sourceLineNo">317</span>      scanner1.close();<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      if (res1.length != 1) {<a name="line.318"></a>
-<span class="sourceLineNo">319</span>        LOG.info("Only got " + res1.length + " rows");<a name="line.319"></a>
-<span class="sourceLineNo">320</span>        Thread.sleep(SLEEP_TIME);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      } else {<a name="line.321"></a>
-<span class="sourceLineNo">322</span>        int cellNumber = res1[0].getColumnCells(famName, Bytes.toBytes("f1")).size();<a name="line.322"></a>
-<span class="sourceLineNo">323</span>        if (cellNumber != 3) {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>          LOG.info("Only got " + cellNumber + " cells");<a name="line.324"></a>
-<span class="sourceLineNo">325</span>          Thread.sleep(SLEEP_TIME);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>        } else {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>          break;<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>      if (i == NB_RETRIES - 1) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>        fail("Waited too much time for normal batch replication");<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      }<a name="line.332"></a>
-<span class="sourceLineNo">333</span>    }<a name="line.333"></a>
+<span class="sourceLineNo">312</span>  // VerifyReplication should honor versions option<a name="line.312"></a>
+<span class="sourceLineNo">313</span>  @Test<a name="line.313"></a>
+<span class="sourceLineNo">314</span>  public void testVersionMismatchHBase14905() throws Exception {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    // normal Batch tests<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    byte[] qualifierName = Bytes.toBytes("f1");<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    long ts = System.currentTimeMillis();<a name="line.318"></a>
+<span class="sourceLineNo">319</span>    put.addColumn(famName, qualifierName, ts + 1, Bytes.toBytes("v1"));<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    htable1.put(put);<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    put.addColumn(famName, qualifierName, ts + 2, Bytes.toBytes("v2"));<a name="line.321"></a>
+<span class="sourceLineNo">322</span>    htable1.put(put);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>    put.addColumn(famName, qualifierName, ts + 3, Bytes.toBytes("v3"));<a name="line.323"></a>
+<span class="sourceLineNo">324</span>    htable1.put(put);<a name="line.324"></a>
+<span class="sourceLineNo">325</span><a name="line.325"></a>
+<span class="sourceLineNo">326</span>    Scan scan = new Scan();<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    scan.readVersions(100);<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    ResultScanner scanner1 = htable1.getScanner(scan);<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    Result[] res1 = scanner1.next(1);<a name="line.329"></a>
+<span class="sourceLineNo">330</span>    scanner1.close();<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>    assertEquals(1, res1.length);<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    assertEquals(3, res1[0].getColumnCells(famName, qualifierName).size());<a name="line.333"></a>
 <span class="sourceLineNo">334</span><a name="line.334"></a>
-<span class="sourceLineNo">335</span>    try {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>      // Disabling replication and modifying the particular version of the cell to validate the<a name="line.336"></a>
-<span class="sourceLineNo">337</span>      // feature.<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      hbaseAdmin.disableReplicationPeer(PEER_ID);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      Put put2 = new Put(Bytes.toBytes("r1"));<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      put2.addColumn(famName, qualifierName, ts + 2, Bytes.toBytes("v99"));<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      htable2.put(put2);<a name="line.341"></a>
-<span class="sourceLineNo">342</span><a name="line.342"></a>
-<span class="sourceLineNo">343</span>      scan = new Scan();<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      scan.readVersions(100);<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      scanner1 = htable2.getScanner(scan);<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      res1 = scanner1.next(NB_ROWS_IN_BATCH);<a name="line.346"></a>
-<span class="sourceLineNo">347</span>      scanner1.close();<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      assertEquals(1, res1.length);<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      assertEquals(3, res1[0].getColumnCells(famName, qualifierName).size());<a name="line.349"></a>
-<span class="sourceLineNo">350</span><a name="line.350"></a>
-<span class="sourceLineNo">351</span>      String[] args = new String[] { "--versions=100", PEER_ID, tableName.getNameAsString() };<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      runVerifyReplication(args, 0, 1);<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    } finally {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      hbaseAdmin.enableReplicationPeer(PEER_ID);<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    }<a name="line.355"></a>
-<span class="sourceLineNo">356</span>  }<a name="line.356"></a>
+<span class="sourceLineNo">335</span>    for (int i = 0; i &lt; NB_RETRIES; i++) {<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      scan = new Scan();<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      scan.readVersions(100);<a name="line.337"></a>
+<span class="sourceLineNo">338</span>      scanner1 = htable2.getScanner(scan);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      res1 = scanner1.next(1);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>      scanner1.close();<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      if (res1.length != 1) {<a name="line.341"></a>
+<span class="sourceLineNo">342</span>        LOG.info("Only got " + res1.length + " rows");<a name="line.342"></a>
+<span class="sourceLineNo">343</span>        Thread.sleep(SLEEP_TIME);<a name="line.343"></a>
+<span class="sourceLineNo">344</span>      } else {<a name="line.344"></a>
+<span class="sourceLineNo">345</span>        int cellNumber = res1[0].getColumnCells(famName, Bytes.toBytes("f1")).size();<a name="line.345"></a>
+<span class="sourceLineNo">346</span>        if (cellNumber != 3) {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>          LOG.info("Only got " + cellNumber + " cells");<a name="line.347"></a>
+<span class="sourceLineNo">348</span>          Thread.sleep(SLEEP_TIME);<a name="line.348"></a>
+<span class="sourceLineNo">349</span>        } else {<a name="line.349"></a>
+<span class="sourceLineNo">350</span>          break;<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>      if (i == NB_RETRIES - 1) {<a name="line.353"></a>
+<span class="sourceLineNo">354</span>        fail("Waited too much time for normal batch replication");<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      }<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    }<a name="line.356"></a>
 <span class="sourceLineNo">357</span><a name="line.357"></a>
-<span class="sourceLineNo">358</span>  @Test<a name="line.358"></a>
-<span class="sourceLineNo">359</span>  public void testVerifyReplicationPrefixFiltering() throws Exception {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    final byte[] prefixRow = Bytes.toBytes("prefixrow");<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    final byte[] prefixRow2 = Bytes.toBytes("secondrow");<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    loadData("prefixrow", prefixRow);<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    loadData("secondrow", prefixRow2);<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    loadData("aaa", row);<a name="line.364"></a>
-<span class="sourceLineNo">365</span>    loadData("zzz", row);<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    waitForReplication(NB_ROWS_IN_BATCH * 4, NB_RETRIES * 4);<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    String[] args =<a name="line.367"></a>
-<span class="sourceLineNo">368</span>        new String[] { "--row-prefixes=prefixrow,secondrow", PEER_ID, tableName.getNameAsString() };<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    runVerifyReplication(args, NB_ROWS_IN_BATCH * 2, 0);<a name="line.369"></a>
-<span class="sourceLineNo">370</span>  }<a name="line.370"></a>
-<span class="sourceLineNo">371</span><a name="line.371"></a>
-<span class="sourceLineNo">372</span>  @Test<a name="line.372"></a>
-<span class="sourceLineNo">373</span>  public void testVerifyReplicationSnapshotArguments() {<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    String[] args =<a name="line.374"></a>
-<span class="sourceLineNo">375</span>        new String[] { "--sourceSnapshotName=snapshot1", "2", tableName.getNameAsString() };<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    assertFalse(Lists.newArrayList(args).toString(), new VerifyReplication().doCommandLine(args));<a name="line.376"></a>
-<span class="sourceLineNo">377</span><a name="line.377"></a>
-<span class="sourceLineNo">378</span>    args = new String[] { "--sourceSnapshotTmpDir=tmp", "2", tableName.getNameAsString() };<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    assertFalse(Lists.newArrayList(args).toString(), new VerifyReplication().doCommandLine(args));<a name="line.379"></a>
+<span class="sourceLineNo">358</span>    try {<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      // Disabling replication and modifying the particular version of the cell to validate the<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      // feature.<a name="line.360"></a>
+<span class="sourceLineNo">361</span>      hbaseAdmin.disableReplicationPeer(PEER_ID);<a name="line.361"></a>
+<span class="sourceLineNo">362</span>      Put put2 = new Put(Bytes.toBytes("r1"));<a name="line.362"></a>
+<span class="sourceLineNo">363</span>      put2.addColumn(famName, qualifierName, ts + 2, Bytes.toBytes("v99"));<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      htable2.put(put2);<a name="line.364"></a>
+<span class="sourceLineNo">365</span><a name="line.365"></a>
+<span class="sourceLineNo">366</span>      scan = new Scan();<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      scan.readVersions(100);<a name="line.367"></a>
+<span class="sourceLineNo">368</span>      scanner1 = htable2.getScanner(scan);<a name="line.368"></a>
+<span class="sourceLineNo">369</span>      res1 = scanner1.next(NB_ROWS_IN_BATCH);<a name="line.369"></a>
+<span class="sourceLineNo">370</span>      scanner1.close();<a name="line.370"></a>
+<span class="sourceLineNo">371</span>      assertEquals(1, res1.length);<a name="line.371"></a>
+<span class="sourceLineNo">372</span>      assertEquals(3, res1[0].getColumnCells(famName, qualifierName).size());<a name="line.372"></a>
+<span class="sourceLineNo">373</span><a name="line.373"></a>
+<span class="sourceLineNo">374</span>      String[] args = new String[] { "--versions=100", PEER_ID, tableName.getNameAsString() };<a name="line.374"></a>
+<span class="sourceLineNo">375</span>      runVerifyReplication(args, 0, 1);<a name="line.375"></a>
+<span class="sourceLineNo">376</span>    } finally {<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      hbaseAdmin.enableReplicationPeer(PEER_ID);<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    }<a name="line.378"></a>
+<span class="sourceLineNo">379</span>  }<a name="line.379"></a>
 <span class="sourceLineNo">380</span><a name="line.380"></a>
-<span class="sourceLineNo">381</span>    args = new String[] { "--sourceSnapshotName=snapshot1", "--sourceSnapshotTmpDir=tmp", "2",<a name="line.381"></a>
-<span class="sourceLineNo">382</span>        tableName.getNameAsString() };<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    assertTrue(Lists.newArrayList(args).toString(), new VerifyReplication().doCommandLine(args));<a name="line.383"></a>
-<span class="sourceLineNo">384</span><a name="line.384"></a>
-<span class="sourceLineNo">385</span>    args = new String[] { "--peerSnapshotName=snapshot1", "2", tableName.getNameAsString() };<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    assertFalse(Lists.newArrayList(args).toString(), new VerifyReplication().doCommandLine(args));<a name="line.386"></a>
-<span class="sourceLineNo">387</span><a name="line.387"></a>
-<span class="sourceLineNo">388</span>    args = new String[] { "--peerSnapshotTmpDir=/tmp/", "2", tableName.getNameAsString() };<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    assertFalse(Lists.newArrayList(args).toString(), new VerifyReplication().doCommandLine(args));<a name="line.389"></a>
-<span class="sourceLineNo">390</span><a name="line.390"></a>
-<span class="sourceLineNo">391</span>    args = new String[] { "--peerSnapshotName=snapshot1", "--peerSnapshotTmpDir=/tmp/",<a name="line.391"></a>
-<span class="sourceLineNo">392</span>        "--peerFSAddress=tempfs", "--peerHBaseRootAddress=hdfs://tempfs:50070/hbase/", "2",<a name="line.392"></a>
-<span class="sourceLineNo">393</span>        tableName.getNameAsString() };<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    assertTrue(Lists.newArrayList(args).toString(), new VerifyReplication().doCommandLine(args));<a name="line.394"></a>
-<span class="sourceLineNo">395</span><a name="line.395"></a>
-<span class="sourceLineNo">396</span>    args = new String[] { "--sourceSnapshotName=snapshot1", "--sourceSnapshotTmpDir=/tmp/",<a name="line.396"></a>
-<span class="sourceLineNo">397</span>        "--peerSnapshotName=snapshot2", "--peerSnapshotTmpDir=/tmp/", "--peerFSAddress=tempfs",<a name="line.397"></a>
-<span class="sourceLineNo">398</span>        "--peerHBaseRootAddress=hdfs://tempfs:50070/hbase/", "2", tableName.getNameAsString() };<a name="line.398"></a>
-<span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>    assertTrue(Lists.newArrayList(args).toString(), new VerifyReplication().doCommandLine(args));<a name="line.400"></a>
-<span class="sourceLineNo">401</span>  }<a name="line.401"></a>
-<span class="sourceLineNo">402</span><a name="line.402"></a>
-<span class="sourceLineNo">403</span>  private void checkRestoreTmpDir(Configuration conf, String restoreTmpDir, int expectedCount)<a name="line.403"></a>
-<span class="sourceLineNo">404</span>      throws IOException {<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    FileSystem fs = FileSystem.get(conf);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    FileStatus[] subDirectories = fs.listStatus(new Path(restoreTmpDir));<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    assertNotNull(subDirectories);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    assertEquals(subDirectories.length, expectedCount);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    for (int i = 0; i &lt; expectedCount; i++) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      assertTrue(subDirectories[i].isDirectory());<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>  }<a name="line.412"></a>
+<span class="sourceLineNo">381</span>  @Test<a name="line.381"></a>
+<span class="sourceLineNo">382</span>  public void testVerifyReplicationPrefixFiltering() throws Exception {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    final byte[] prefixRow = Bytes.toBytes("prefixrow");<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    final byte[] prefixRow2 = Bytes.toBytes("secondrow");<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    loadData("prefixrow", prefixRow);<a name="line.385"></a>
+<span class="sourceLineNo">386</span>    loadData("secondrow", prefixRow2);<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    loadData("aaa", row);<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    loadData("zzz", row);<a name="line.388"></a>
+<span class="sourceLineNo">389</span>    waitForReplication(NB_ROWS_IN_BATCH * 4, NB_RETRIES * 4);<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    String[] args =<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        new String[] { "--row-prefixes=prefixrow,secondrow", PEER_ID, tableName.getNameAsString() };<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    runVerifyReplication(args, NB_ROWS_IN_BATCH * 2, 0);<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>  @Test<a name="line.395"></a>
+<span class="sourceLineNo">396</span>  public void testVerifyReplicationSnapshotArguments() {<a name="line.396"></a>
+<span class="sourceLineNo">397</span>    String[] args =<a name="line.397"></a>
+<span class="sourceLineNo">398</span>        new String[] { "--sourceSnapshotName=snapshot1", "2", tableName.getNameAsString() };<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    assertFalse(Lists.newArrayList(args).toString(), new VerifyReplication().doCommandLine(args));<a name="line.399"></a>
+<span class="sourceLineNo">400</span><a name="line.400"></a>
+<span class="sourceLineNo">401</span>    args = new String[] { "--sourceSnapshotTmpDir=tmp", "2", tableName.getNameAsString() };<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    assertFalse(Lists.newArrayList(args).toString(), new VerifyReplication().doCommandLine(args));<a name="line.402"></a>
+<span class="sourceLineNo">403</span><a name="line.403"></a>
+<span class="sourceLineNo">404</span>    args = new String[] { "--sourceSnapshotName=snapshot1", "--sourceSnapshotTmpDir=tmp", "2",<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        tableName.getNameAsString() };<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    assertTrue(Lists.newArrayList(args).toString(), new VerifyReplication().doCommandLine(args));<a name="line.406"></a>
+<span class="sourceLineNo">407</span><a name="line.407"></a>
+<span class="sourceLineNo">408</span>    args = new String[] { "--peerSnapshotName=snapshot1", "2", tableName.getNameAsString() };<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    assertFalse(Lists.newArrayList(args).toString(), new VerifyReplication().doCommandLine(args));<a name="line.409"></a>
+<span class="sourceLineNo">410</span><a name="line.410"></a>
+<span class="sourceLineNo">411</span>    args = new String[] { "--peerSnapshotTmpDir=/tmp/", "2", tableName.getNameAsString() };<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    assertFalse(Lists.newArrayList(args).toString(), new VerifyReplication().doCommandLine(args));<a name="line.412"></a>
 <span class="sourceLineNo">413</span><a name="line.413"></a>
-<span class="sourceLineNo">414</span>  @Test<a name="line.414"></a>
-<span class="sourceLineNo">415</span>  public void testVerifyReplicationWithSnapshotSupport() throws Exception {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    // Populate the tables, at the same time it guarantees that the tables are<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    // identical since it does the check<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    runSmallBatchTest();<a name="line.418"></a>
-<span class="sourceLineNo">419</span><a name="line.419"></a>
-<span class="sourceLineNo">420</span>    // Take source and target tables snapshot<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    Path rootDir = FSUtils.getRootDir(conf1);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    FileSystem fs = rootDir.getFileSystem(conf1);<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    String sourceSnapshotName = "sourceSnapshot-" + System.currentTimeMillis();<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    SnapshotTestingUtils.createSnapshotAndValidate(utility1.getAdmin(), tableName,<a name="line.424"></a>
-<span class="sourceLineNo">425</span>      Bytes.toString(famName), sourceSnapshotName, rootDir, fs, true);<a name="line.425"></a>
-<span class="sourceLineNo">426</span><a name="line.426"></a>
-<span class="sourceLineNo">427</span>    // Take target snapshot<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    Path peerRootDir = FSUtils.getRootDir(conf2);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    FileSystem peerFs = peerRootDir.getFileSystem(conf2);<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    String peerSnapshotName = "peerSnapshot-" + System.currentTimeMillis();<a name="line.430"></a>
-<span class="sourceLineNo">431</span>    SnapshotTestingUtils.createSnapshotAndValidate(utility2.getAdmin(), tableName,<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      Bytes.toString(famName), peerSnapshotName, peerRootDir, peerFs, true);<a name="line.432"></a>
-<span class="sourceLineNo">433</span><a name="line.433"></a>
-<span class="sourceLineNo">434</span>    String peerFSAddress = peerFs.getUri().toString();<a name="line.434"></a>
-<span class="sourceLineNo">435</span>    String temPath1 = utility1.getRandomDir().toString();<a name="line.435"></a>
-<span class="sourceLineNo">436</span>    String temPath2 = "/tmp" + System.currentTimeMillis();<a name="line.436"></a>
-<span class="sourceLineNo">437</span><a name="line.437"></a>
-<span class="sourceLineNo">438</span>    String[] args = new String[] { "--sourceSnapshotName=" + sourceSnapshotName,<a name="line.438"></a>
-<span class="sourceLineNo">439</span>        "--sourceSnapshotTmpDir=" + temPath1, "--peerSnapshotName=" + peerSnapshotName,<a name="line.439"></a>
-<span class="sourceLineNo">440</span>        "--peerSnapshotTmpDir=" + temPath2, "--peerFSAddress=" + peerFSAddress,<a name="line.440"></a>
-<span class="sourceLineNo">441</span>        "--peerHBaseRootAddress=" + FSUtils.getRootDir(conf2), "2", tableName.getNameAsString() };<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    runVerifyReplication(args, NB_ROWS_IN_BATCH, 0);<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    checkRestoreTmpDir(conf1, temPath1, 1);<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    checkRestoreTmpDir(conf2, temPath2, 1);<a name="line.444"></a>
-<span class="sourceLineNo">445</span><a name="line.445"></a>
-<span class="sourceLineNo">446</span>    Scan scan = new Scan();<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    ResultScanner rs = htable2.getScanner(scan);<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    Put put = null;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    for (Result result : rs) {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>      put = new Put(result.getRow());<a name="line.450"></a>
-<span class="sourceLineNo">451</span>      Cell firstVal = result.rawCells()[0];<a name="line.451"></a>
-<span class="sourceLineNo">452</span>      put.addColumn(CellUtil.cloneFamily(firstVal), CellUtil.cloneQualifier(firstVal),<a name="line.452"></a>
-<span class="sourceLineNo">453</span>        Bytes.toBytes("diff data"));<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      htable2.put(put);<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    }<a name="line.455"></a>
-<span class="sourceLineNo">456</span>    Delete delete = new Delete(put.getRow());<a name="line.456"></a>
-<span class="sourceLineNo">457</span>    htable2.delete(delete);<a name="line.457"></a>
-<span class="sourceLineNo">458</span><a name="line.458"></a>
-<span class="sourceLineNo">459</span>    sourceSnapshotName = "sourceSnapshot-" + System.currentTimeMillis();<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    SnapshotTestingUtils.createSnapshotAndValidate(utility1.getAdmin(), tableName,<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      Bytes.toString(famName), sourceSnapshotName, rootDir, fs, true);<a name="line.461"></a>
-<span class="sourceLineNo">462</span><a name="line.462"></a>
-<span class="sourceLineNo">463</span>    peerSnapshotName = "peerSnapshot-" + System.currentTimeMillis();<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    SnapshotTestingUtils.createSnapshotAndValidate(utility2.getAdmin(), tableName,<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      Bytes.toString(famName), peerSnapshotName, peerRootDir, peerFs, true);<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>    args = new String[] { "--sourceSnapshotName=" + sourceSnapshotName,<a name="line.467"></a>
-<span class="sourceLineNo">468</span>        "--sourceSnapshotTmpDir=" + temPath1, "--peerSnapshotName=" + peerSnapshotName,<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        "--peerSnapshotTmpDir=" + temPath2, "--peerFSAddress=" + peerFSAddress,<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        "--peerHBaseRootAddress=" + FSUtils.getRootDir(conf2), "2", tableName.getNameAsString() };<a name="line.470"></a>
-<span class="sourceLineNo">471</span>    runVerifyReplication(args, 0, NB_ROWS_IN_BATCH);<a name="line.471"></a>
-<span class="sourceLineNo">472</span>    checkRestoreTmpDir(conf1, temPath1, 2);<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    checkRestoreTmpDir(conf2, temPath2, 2);<a name="line.473"></a>
-<span class="sourceLineNo">474</span>  }<a name="line.474"></a>
-<span class="sourceLineNo">475</span><a name="line.475"></a>
-<span class="sourceLineNo">476</span>  @Test<a name="line.476"></a>
-<span class="sourceLineNo">477</span>  public void testVerifyRepJobWithQuorumAddress() throws Exception {<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    // Populate the tables, at the same time it guarantees that the tables are<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    // identical since it does the check<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    runSmallBatchTest();<a name="line.480"></a>
+<span class="sourceLineNo">414</span>    args = new String[] { "--peerSnapshotName=snapshot1", "--peerSnapshotTmpDir=/tmp/",<a name="line.414"></a>
+<span class="sourceLineNo">415</span>        "--peerFSAddress=tempfs", "--peerHBaseRootAddress=hdfs://tempfs:50070/hbase/", "2",<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        tableName.getNameAsString() };<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    assertTrue(Lists.newArrayList(args).toString(), new VerifyReplication().doCommandLine(args));<a name="line.417"></a>
+<span class="sourceLineNo">418</span><a name="line.418"></a>
+<span class="sourceLineNo">419</span>    args = new String[] { "--sourceSnapshotName=snapshot1", "--sourceSnapshotTmpDir=/tmp/",<a name="line.419"></a>
+<span class="sourceLineNo">420</span>        "--peerSnapshotName=snapshot2", "--peerSnapshotTmpDir=/tmp/", "--peerFSAddress=tempfs",<a name="line.420"></a>
+<span class="sourceLineNo">421</span>        "--peerHBaseRootAddress=hdfs://tempfs:50070/hbase/", "2", tableName.getNameAsString() };<a name="line.421"></a>
+<span class="sourceLineNo">422</span><a name="line.422"></a>
+<span class="sourceLineNo">423</span>    assertTrue(Lists.newArrayList(args).toString(), new VerifyReplication().doCommandLine(args));<a name="line.423"></a>
+<span class="sourceLineNo">424</span>  }<a name="line.424"></a>
+<span class="sourceLineNo">425</span><a name="line.425"></a>
+<span class="sourceLineNo">426</span>  private void checkRestoreTmpDir(Configuration conf, String restoreTmpDir, int expectedCount)<a name="line.426"></a>
+<span class="sourceLineNo">427</span>      throws IOException {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>    FileSystem fs = FileSystem.get(conf);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>    FileStatus[] subDirectories = fs.listStatus(new Path(restoreTmpDir));<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    assertNotNull(subDirectories);<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    assertEquals(subDirectories.length, expectedCount);<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    for (int i = 0; i &lt; expectedCount; i++) {<a name="line.432"></a>
+<span class="sourceLineNo">433</span>      assertTrue(subDirectories[i].isDirectory());<a name="line.433"></a>
+<span class="sourceLineNo">434</span>    }<a name="line.434"></a>
+<span class="sourceLineNo">435</span>  }<a name="line.435"></a>
+<span class="sourceLineNo">436</span><a name="line.436"></a>
+<span class="sourceLineNo">437</span>  @Test<a name="line.437"></a>
+<span class="sourceLineNo">438</span>  public void testVerifyReplicationWithSnapshotSupport() throws Exception {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    // Populate the tables, at the same time it guarantees that the tables are<a name="line.439"></a>
+<span class="sourceLineNo">440</span>    // identical since it does the check<a name="line.440"></a>
+<span class="sourceLineNo">441</span>    runSmallBatchTest();<a name="line.441"></a>
+<span class="sourceLineNo">442</span><a name="line.442"></a>
+<span class="sourceLineNo">443</span>    // Take source and target tables snapshot<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    Path rootDir = FSUtils.getRootDir(conf1);<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    FileSystem fs = rootDir.getFileSystem(conf1);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    String sourceSnapshotName = "sourceSnapshot-" + System.currentTimeMillis();<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    SnapshotTestingUtils.createSnapshotAndValidate(utility1.getAdmin(), tableName,<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      Bytes.toString(famName), sourceSnapshotName, rootDir, fs, true);<a name="line.448"></a>
+<span class="sourceLineNo">449</span><a name="line.449"></a>
+<span class="sourceLineNo">450</span>    // Take target snapshot<a name="line.450"></a>
+<span class="sourceLineNo">451</span>    Path peerRootDir = FSUtils.getRootDir(conf2);<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    FileSystem peerFs = peerRootDir.getFileSystem(conf2);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    String peerSnapshotName = "peerSnapshot-" + System.currentTimeMillis();<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    SnapshotTestingUtils.createSnapshotAndValidate(utility2.getAdmin(), tableName,<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      Bytes.toString(famName), peerSnapshotName, peerRootDir, peerFs, true);<a name="line.455"></a>
+<span class="sourceLineNo">456</span><a name="line.456"></a>
+<span class="sourceLineNo">457</span>    String peerFSAddress = peerFs.getUri().toString();<a name="line.457"></a>
+<span class="sourceLineNo">458</span>    String temPath1 = utility1.getRandomDir().toString();<a name="line.458"></a>
+<span class="sourceLineNo">459</span>    String temPath2 = "/tmp" + System.currentTimeMillis();<a name="line.459"></a>
+<span class="sourceLineNo">460</span><a name="line.460"></a>
+<span class="sourceLineNo">461</span>    String[] args = new String[] { "--sourceSnapshotName=" + sourceSnapshotName,<a name="line.461"></a>
+<span class="sourceLineNo">462</span>        "--sourceSnapshotTmpDir=" + temPath1, "--peerSnapshotName=" + peerSnapshotName,<a name="line.462"></a>
+<span class="sourceLineNo">463</span>        "--peerSnapshotTmpDir=" + temPath2, "--peerFSAddress=" + peerFSAddress,<a name="line.463"></a>
+<span class="sourceLineNo">464</span>        "--peerHBaseRootAddress=" + FSUtils.getRootDir(conf2), "2", tableName.getNameAsString() };<a name="line.464"></a>
+<span class="sourceLineNo">465</span>    runVerifyReplication(args, NB_ROWS_IN_BATCH, 0);<a name="line.465"></a>
+<span class="sourceLineNo">466</span>    checkRestoreTmpDir(conf1, temPath1, 1);<a name="line.466"></a>
+<span class="sourceLineNo">467</span>    checkRestoreTmpDir(conf2, temPath2, 1);<a name="line.467"></a>
+<span class="sourceLineNo">468</span><a name="line.468"></a>
+<span class="sourceLineNo">469</span>    Scan scan = new Scan();<a name="line.469"></a>
+<span class="sourceLineNo">470</span>    ResultScanner rs = htable2.getScanner(scan);<a name="line.470"></a>
+<span class="sourceLineNo">471</span>    Put put = null;<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    for (Result result : rs) {<a name="line.472"></a>
+<span class="sourceLineNo">473</span>      put = new Put(result.getRow());<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      Cell firstVal = result.rawCells()[0];<a name="line.474"></a>
+<span class="sourceLineNo">475</span>      put.addColumn(CellUtil.cloneFamily(firstVal), CellUtil.cloneQualifier(firstVal),<a name="line.475"></a>
+<span class="sourceLineNo">476</span>        Bytes.toBytes("diff data"));<a name="line.476"></a>
+<span class="sourceLineNo">477</span>      htable2.put(put);<a name="line.477"></a>
+<span class="sourceLineNo">478</span>    }<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    Delete delete = new Delete(put.getRow());<a name="line.479"></a>
+<span class="sourceLineNo">480</span>    htable2.delete(delete);<a name="line.480"></a>
 <span class="sourceLineNo">481</span><a name="line.481"></a>
-<span class="sourceLineNo">482</span>    // with a quorum address (a cluster key)<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    String[] args = new String[] { utility2.getClusterKey(), tableName.getNameAsString() };<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    runVerifyReplication(args, NB_ROWS_IN_BATCH, 0);<a name="line.484"></a>
+<span class="sourceLineNo">482</span>    sourceSnapshotName = "sourceSnapshot-" + System.currentTimeMillis();<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    SnapshotTestingUtils.createSnapshotAndValidate(utility1.getAdmin(), tableName,<a name="line.483"></a>
+<span class="sourceLineNo">484</span>      Bytes.toString(famName), sourceSnapshotName, rootDir, fs, true);<a name="line.484"></a>
 <span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span>    Scan scan = new Scan();<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    ResultScanner rs = htable2.getScanner(scan);<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    Put put = null;<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    for (Result result : rs) {<a name="line.489"></a>
-<span class="sourceLineNo">490</span>      put = new Put(result.getRow());<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      Cell firstVal = result.rawCells()[0];<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      put.addColumn(CellUtil.cloneFamily(firstVal), CellUtil.cloneQualifier(firstVal),<a name="line.492"></a>
-<span class="sourceLineNo">493</span>        Bytes.toBytes("diff data"));<a name="line.493"></a>
-<span class="sourceLineNo">494</span>      htable2.put(put);<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    }<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    Delete delete = new Delete(put.getRow());<a name="line.496"></a>
-<span class="sourceLineNo">497</span>    htable2.delete(delete);<a name="line.497"></a>
-<span class="sourceLineNo">498</span>    runVerifyReplication(args, 0, NB_ROWS_IN_BATCH);<a name="line.498"></a>
-<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
-<span class="sourceLineNo">500</span><a name="line.500"></a>
-<span class="sourceLineNo">501</span>  @Test<a name="line.501"></a>
-<span class="sourceLineNo">502</span>  public void testVerifyRepJobWithQuorumAddressAndSnapshotSupport() throws Exception {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    // Populate the tables, at the same time it guarantees that the tables are<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    // identical since it does the check<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    runSmallBatchTest();<a name="line.505"></a>
-<span class="sourceLineNo">506</span><a name="line.506"></a>
-<span class="sourceLineNo">507</span>    // Take source and target tables snapshot<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    Path rootDir = FSUtils.getRootDir(conf1);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    FileSystem fs = rootDir.getFileSystem(conf1);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    String sourceSnapshotName = "sourceSnapshot-" + System.currentTimeMillis();<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    SnapshotTestingUtils.createSnapshotAndValidate(utility1.getAdmin(), tableName,<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      Bytes.toString(famName), sourceSnapshotName, rootDir, fs, true);<a name="line.512"></a>
-<span class="sourceLineNo">513</span><a name="line.513"></a>
-<span class="sourceLineNo">514</span>    // Take target snapshot<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    Path peerRootDir = FSUtils.getRootDir(conf2);<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    FileSystem peerFs = peerRootDir.getFileSystem(conf2);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    String peerSnapshotName = "peerSnapshot-" + System.currentTimeMillis();<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    SnapshotTestingUtils.createSnapshotAndValidate(utility2.getAdmin(), tableName,<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      Bytes.toString(famName), peerSnapshotName, peerRootDir, peerFs, true);<a name="line.519"></a>
-<span class="sourceLineNo">520</span><a name="line.520"></a>
-<span class="sourceLineNo">521</span>    String peerFSAddress = peerFs.getUri().toString();<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    String tmpPath1 = utility1.getRandomDir().toString();<a name="line.522"></a>
-<span class="sourceLineNo">523</span>    String tmpPath2 = "/tmp" + System.currentTimeMillis();<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>    String[] args = new String[] { "--sourceSnapshotName=" + sourceSnapshotName,<a name="line.525"></a>
-<span class="sourceLineNo">526</span>      "--sourceSnapshotTmpDir=" + tmpPath1, "--peerSnapshotName=" + peerSnapshotName,<a name="line.526"></a>
-<span class="sourceLineNo">527</span>      "--peerSnapshotTmpDir=" + tmpPath2, "--peerFSAddress=" + peerFSAddress,<a name="line.527"></a>
-<span class="sourceLineNo">528</span>      "--peerHBaseRootAddress=" + FSUtils.getRootDir(conf2), utility2.getClusterKey(),<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      tableName.getNameAsString() };<a name="line.529"></a>
-<span class="sourceLineNo">530</span>    runVerifyReplication(args, NB_ROWS_IN_BATCH, 0);<a name="line.530"></a>
-<span class="sourceLineNo">531</span>    checkRestoreTmpDir(conf1, tmpPath1, 1);<a name="line.531"></a>
-<span class="sourceLineNo">532</span>    checkRestoreTmpDir(conf2, tmpPath2, 1);<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>    Scan scan = new Scan();<a name="line.534"></a>
-<span class="sourceLineNo">535</span>    ResultScanner rs = htable2.getScanner(scan);<a name="line.535"></a>
-<span class="sourceLineNo">536</span>    Put put = null;<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    for (Result result : rs) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>      put = new Put(result.getRow());<a name="line.538"></a>
-<span class="sourceLineNo">539</span>      Cell firstVal = result.rawCells()[0];<a name="line.539"></a>
-<span class="sourceLineNo">540</span>      put.addColumn(CellUtil.cloneFamily(firstVal), CellUtil.cloneQualifier(firstVal),<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        Bytes.toBytes("diff data"));<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      htable2.put(put);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    Delete delete = new Delete(put.getRow());<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    htable2.delete(delete);<a name="line.545"></a>
-<span class="sourceLineNo">546</span><a name="line.546"></a>
-<span class="sourceLineNo">547</span>    sourceSnapshotName = "sourceSnapshot-" + System.currentTimeMillis();<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    SnapshotTestingUtils.createSnapshotAndValidate(utility1.getAdmin(), tableName,<a name="line.548"></a>
-<span class="sourceLineNo">549</span>      Bytes.toString(famName), sourceSnapshotName, rootDir, fs, true);<a name="line.549"></a>
-<span class="sourceLineNo">550</span><a name="line.550"></a>
-<span class="sourceLineNo">551</span>    peerSnapshotName = "peerSnapshot-" + System.currentTimeMillis();<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    SnapshotTestingUtils.createSnapshotAndValidate(utility2.getAdmin(), tableName,<a name="line.552"></a>
-<span class="sourceLineNo">553</span>      Bytes.toString(famName), peerSnapshotName, peerRootDir, peerFs, true);<a name="line.553"></a>
-<span class="sourceLineNo">554</span><a name="line.554"></a>
-<span class="sourceLineNo">555</span>    args = new String[] { "--sourceSnapshotName=" + sourceSnapshotName,<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      "--sourceSnapshotTmpDir=" + tmpPath1, "--peerSnapshotName=" + peerSnapshotName,<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      "--peerSnapshotTmpDir=" + tmpPath2, "--peerFSAddress=" + peerFSAddress,<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      "--peerHBaseRootAddress=" + FSUtils.getRootDir(conf2), utility2.getClusterKey(),<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      tableName.getNameAsString() };<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    runVerifyReplication(args, 0, NB_ROWS_IN_BATCH);<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    checkRestoreTmpDir(conf1, tmpPath1, 2);<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    checkRestoreTmpDir(conf2, tmpPath2, 2);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>  }<a name="line.563"></a>
-<span class="sourceLineNo">564</span>}<a name="line.564"></a>
+<span class="sourceLineNo">486</span>    peerSnapshotName = "peerSnapshot-" + System.currentTimeMillis();<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    SnapshotTestingUtils.createSnapshotAndValidate(utility2.getAdmin(), tableName,<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      Bytes.toString(famName), peerSnapshotName, peerRootDir, peerFs, true);<a name="line.488"></a>
+<span class="sourceLineNo">489</span><a name="line.489"></a>
+<span class="sourceLineNo">490</span>    args = new String[] { "--sourceSnapshotName=" + sourceSnapshotName,<a name="line.490"></a>
+<span class="sourceLineNo">491</span>        "--sourceSnapshotTmpDir=" + temPath1, "--peerSnapshotName=" + peerSnapshotName,<a name="line.491"></a>
+<span class="sourceLineNo">492</span>        "--peerSnapshotTmpDir=" + temPath2, "--peerFSAddress=" + peerFSAddress,<a name="line.492"></a>
+<span class="sourceLineNo">493</span>        "--peerHBaseRootAddress=" + FSUtils.getRootDir(conf2), "2", tableName.getNameAsString() };<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    runVerifyReplication(args, 0, NB_ROWS_IN_BATCH);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>    checkRestoreTmpDir(conf1, temPath1, 2);<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    checkRestoreTmpDir(conf2, temPath2, 2);<a name="line.496"></a>
+<span class="sourceLineNo">497</span>  }<a name="line.497"></a>
+<span class="sourceLineNo">498</span><a name="line.498"></a>
+<span class="sourceLineNo">499</span>  @Test<a name="line.499"></a>
+<span class="sourceLineNo">500</span>  public void testVerifyRepJobWithQuorumAddress() throws Exception {<a name="line.500"></a>
+<span class="sourceLineNo">501</span>    // Populate the tables, at the same time it guarantees that the tables are<a name="line.501"></a>
+<span class="sourceLineNo">502</span>    // identical since it does the check<a name="line.502"></a>
+<span class="sourceLineNo">503</span>    runSmallBatchTest();<a name="line.503"></a>
+<span class="sourceLineNo">504</span><a name="line.504"></a>
+<span class="sourceLineNo">505</span>    // with a quorum address (a cluster key)<a name="line.505"></a>
+<span class="sourceLineNo">506</span>    String[] args = new String[] { utility2.getClusterKey(), tableName.getNameAsString() };<a name="line.506"></a>
+<span class="sourceLineNo">507</span>    runVerifyReplication(args, NB_ROWS_IN_BATCH, 0);<a name="line.507"></a>
+<span class="sourceLineNo">508</span><a name="line.508"></a>
+<span class="sourceLineNo">509</span>    Scan scan = new Scan();<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    ResultScanner rs = htable2.getScanner(scan);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>    Put put = null;<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    for (Result result : rs) {<a name="line.512"></a>
+<span class="sourceLineNo">513</span>      put = new Put(result.getRow());<a name="line.513"></a>
+<span class="sourceLineNo">514</span>      Cell firstVal = result.rawCells()[0];<a name="line.514"></a>
+<span class="sourceLineNo">515</span>      put.addColumn(CellUtil.cloneFamily(firstVal), CellUtil.cloneQualifier(firstVal),<a name="line.515"></a>
+<span class="sourceLineNo">516</span>        Bytes.toBytes("diff data"));<a name="line.516"></a>
+<span class="sourceLineNo">517</span>      htable2.put(put);<a name="line.517"></a>
+<span class="sourceLineNo">518</span>    }<a name="line.518"></a>
+<span class="sourceLineNo">519</span>    Delete delete = new Delete(put.getRow());<a name="line.519"></a>
+<span class="sourceLineNo">520</span>    htable2.delete(delete);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    runVerifyReplication(args, 0, NB_ROWS_IN_BATCH);<a name="line.521"></a>
+<span class="sourceLineNo">522</span>  }<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>  @Test<a name="line.524"></a>
+<span class="sourceLineNo">525</span>  public void testVerifyRepJobWithQuorumAddressAndSnapshotSupport() throws Exception {<a name="line.525"></a>
+<span class="sourceLineNo">526</span>    // Populate the tables, at the same time it guarantees that the tables are<a name="line.526"></a>
+<span class="sourceLineNo">527</span>    // identical since it does the check<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    runSmallBatchTest();<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    // Take source and target tables snapshot<a name="line.530"></a>
+<span class="sourceLineNo">531</span>    Path rootDir = FSUtils.getRootDir(conf1);<a name="line.531"></a>
+<span class="sourceLineNo">532</span>    FileSystem fs = rootDir.getFileSystem(conf1);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    String sourceSnapshotName = "sourceSnapshot-" + System.currentTimeMillis();<a name="line.533"></a>
+<span class="sourceLineNo">534</span>    SnapshotTestingUtils.createSnapshotAndValidate(utility1.getAdmin(), tableName,<a name="line.534"></a>
+<span class="sourceLineNo">535</span>      Bytes.toString(famName), sourceSnapshotName, rootDir, fs, true);<a name="line.535"></a>
+<span class="sourceLineNo">536</span><a name="line.536"></a>
+<span class="sourceLineNo">537</span>    // Take target snapshot<a name="line.537"></a>
+<span class="sourceLineNo">538</span>    Path peerRootDir = FSUtils.getRootDir(conf2);<a name="line.538"></a>
+<span class="sourceLineNo">539</span>    FileSystem peerFs = peerRootDir.getFileSystem(conf2);<a name="line.539"></a>
+<span class="sourceLineNo">540</span>    String peerSnapshotName = "peerSnapshot-" + System.currentTimeMillis();<a name="line.540"></a>
+<span class="sourceLineNo">541</span>    SnapshotTestingUtils.createSnapshotAndValidate(utility2.getAdmin(), tableName,<a name="line.541"></a>
+<span class="sourceLineNo">542</span>      Bytes.toString(famName), peerSnapshotName, peerRootDir, peerFs, true);<a name="line.542"></a>
+<span class="sourceLineNo">543</span><a name="line.543"></a>
+<span class="sourceLineNo">544</span>    String peerFSAddress = peerFs.getUri().toString();<a name="line.544"></a>
+<span class="sourceLineNo">545</span>    String tmpPath1 = utility1.getRandomDir().toString();<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    String tmpPath2 = "/tmp" + System.currentTimeMillis();<a name="line.546"></a>
+<span class="sourceLineNo">547</span><a name="line.547"></a>
+<span class="sourceLineNo">548</span>    String[] args = new String[] { "--sourceSnapshotName=" + sourceSnapshotName,<a name="line.548"></a>
+<span class="sourceLineNo">549</span>      "--sourceSnapshotTmpDir=" + tmpPath1, "--peerSnapshotName=" + peerSnapshotName,<a name="line.549"></a>
+<span class="sourceLineNo">550</span>      "--peerSnapshotTmpDir=" + tmpPath2, "--peerFSAddress=" + peerFSAddress,<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      "--peerHBaseRootAddress=" + FSUtils.getRootDir(conf2), utility2.getClusterKey(),<a name="line.551"></a>
+<span class="sourceLineNo">552</span>      tableName.getNameAsString() };<a name="line.552"></a>
+<span class="sourceLineNo">553</span>    runVerifyReplication(args, NB_ROWS_IN_BATCH, 0);<a name="line.553"></a>
+<span class="sourceLineNo">554</span>    checkRestoreTmpDir(conf1, tmpPath1, 1);<a name="line.554"></a>
+<span class="sourceLineNo">555</span>    checkRestoreTmpDir(conf2, tmpPath2, 1);<a name="line.555"></a>
+<span class="sourceLineNo">556</span><a name="line.556"></a>
+<span class="sourceLineNo">557</span>    Scan scan = new Scan();<a name="line.557"></a>
+<span class="sourceLineNo">558</span>    ResultScanner rs = htable2.getScanner(scan);<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    Put put = null;<a name="line.559"></a>
+<span class="sourceLineNo">560</span>    for (Result result : rs) {<a name="line.560"></a>
+<span class="sourceLineNo">561</span>      put = new Put(result.getRow());<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      Cell firstVal = result.rawCells()[0];<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      put.addColumn(CellUtil.cloneFamily(firstVal), CellUtil.cloneQualifier(firstVal),<a name="line.563"></a>
+<span class="sourceLineNo">564</span>        Bytes.toBytes("diff data"));<a name="line.564"></a>
+<span class="sourceLineNo">565</span>      htable2.put(put);<a name="line.565"></a>
+<span class="sourceLineNo">566</span>    }<a name="line.566"></a>
+<span class="sourceLineNo">567</span>    Delete delete = new Delete(put.getRow());<a name="line.567"></a>
+<span class="sourceLineNo">568</span>    htable2.delete(delete);<a name="line.568"></a>
+<span class="sourceLineNo">569</span><a name="line.569"></a>
+<span class="sourceLineNo">570</span>    sourceSnapshotName = "sourceSnapshot-" + System.currentTimeMillis();<a name="line.570"></a>
+<span class="sourceLineNo">571</span>    SnapshotTestingUtils.createSnapshotAndValidate(utility1.getAdmin(), tableName,<a name="line.571"></a>
+<span class="sourceLineNo">572</span>      Bytes.toString(famName), sourceSnapshotName, rootDir, fs, true);<a name="line.572"></a>
+<span class="sourceLineNo">573</span><a name="line.573"></a>
+<span class="sourceLineNo">574</span>    peerSnapshotName = "peerSnapshot-" + System.currentTimeMillis();<a name="line.574"></a>
+<span class="sourceLineNo">575</span>    SnapshotTestingUtils.createSnapshotAndValidate(utility2.getAdmin(), tableName,<a name="line.575"></a>
+<span class="sourceLineNo">576</span>      Bytes.toString(famName), peerSnapshotName, peerRootDir, peerFs, true);<a name="line.576"></a>
+<span class="sourceLineNo">577</span><a name="line.577"></a>
+<span class="sourceLineNo">578</span>    args = new String[] { "--sourceSnapshotName=" + sourceSnapshotName,<a name="line.578"></a>
+<span class="sourceLineNo">579</span>      "--sourceSnapshotTmpDir=" + tmpPath1, "--peerSnapshotName=" + peerSnapshotName,<a name="line.579"></a>
+<span class="sourceLineNo">580</span>      "--peerSnapshotTmpDir=" + tmpPath2, "--peerFSAddress=" + peerFSAddress,<a name="line.580"></a>
+<span class="sourceLineNo">581</span>      "--peerHBaseRootAddress=" + FSUtils.getRootDir(conf2), utility2.getClusterKey(),<a name="line.581"></a>
+<span class="sourceLineNo">582</span>      tableName.getNameAsString() };<a name="line.582"></a>
+<span class="sourceLineNo">583</span>    runVerifyReplication(args, 0, NB_ROWS_IN_BATCH);<a name="line.583"></a>
+<span class="sourceLineNo">584</span>    checkRestoreTmpDir(conf1, tmpPath1, 2);<a name="line.584"></a>
+<span class="sourceLineNo">585</span>    checkRestoreTmpDir(conf2, tmpPath2, 2);<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>  private static void runBatchCopyTest() throws Exception {<a name="line.588"></a>
+<span class="sourceLineNo">589</span>    // normal Batch tests for htable1<a name="line.589"></a>
+<span class="sourceLineNo">590</span>    loadData("", row, noRepfamName);<a name="line.590"></a>
+<span class="sourceLineNo">591</span><a name="line.591"></a>
+<span class="sourceLineNo">592</span>    Scan scan1 = new Scan();<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    List&lt;Put&gt; puts = new ArrayList&lt;&gt;(NB_ROWS_IN_BATCH);<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    ResultScanner scanner1 = htable1.getScanner(scan1);<a name="line.594"></a>
+<span class="sourceLineNo">595</span>    Result[] res1 = scanner1.next(NB_ROWS_IN_BATCH);<a name="line.595"></a>
+<span class="sourceLineNo">596</span>    for (Result result : res1) {<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      Put put = new Put(result.getRow());<a name="line.597"></a>
+<span class="sourceLineNo">598</span>      for (Cell cell : result.rawCells()) {<a name="line.598"></a>
+<span class="sourceLineNo">599</span>        put.add(cell);<a name="line.599"></a>
+<span class="sourceLineNo">600</span>      }<a name="line.600"></a>
+<span class="sourceLineNo">601</span>      puts.add(put);<a name="line.601"></a>
+<span class="sourceLineNo">602</span>    }<a name="line.602"></a>
+<span class="sourceLineNo">603</span>    scanner1.close();<a name="line.603"></a>
+<span class="sourceLineNo">604</span>    assertEquals(NB_ROWS_IN_BATCH, res1.length);<a name="line.604"></a>
+<span class="sourceLineNo">605</span><a name="line.605"></a>
+<span class="sourceLineNo">606</span>    // Copy the data to htable3<a name="line.606"></a>
+<span class="sourceLineNo">607</span>    htable3.put(puts);<a name="line.607"></a>
+<span class="sourceLineNo">608</span><a name="line.608"></a>
+<span class="sourceLineNo">609</span>    Scan scan2 = new Scan();<a name="line.609"></a>
+<span class="sourceLineNo">610</span>    ResultScanner scanner2 = htable3.getScanner(scan2);<a name="line.610"></a>
+<span class="sourceLineNo">611</span>    Result[] res2 = scanner2.next(NB_ROWS_IN_BATCH);<a name="line.611"></a>
+<span class="sourceLineNo">612</span>    scanner2.close();<a name="line.612"></a>
+<span class="sourceLineNo">613</span>    assertEquals(NB_ROWS_IN_BATCH, res2.length);<a name="line.613"></a>
+<span class="sourceLineNo">614</span>  }<a name="line.614"></a>
+<span class="sourceLineNo">615</span><a name="line.615"></a>
+<span class="sourceLineNo">616</span>  @Test<a name="line.616"></a>
+<span class="sourceLineNo">617</span>  public void testVerifyRepJobWithPeerTableName() throws Exception {<a name="line.617"></a>
+<span class="sourceLineNo">618</span>    // Populate the tables with same data<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    runBatchCopyTest();<a name="line.619"></a>
+<span class="sourceLineNo">620</span><a name="line.620"></a>
+<span class="sourceLineNo">621</span>    // with a peerTableName along with quorum address (a cluster key)<a name="line.621"></a>
+<span class="sourceLineNo">622</span>    String[] args = new String[] { "--peerTableName=" + peerTableName.getNameAsString(),<a name="line.622"></a>
+<span class="sourceLineNo">623</span>        utility2.getClusterKey(), tableName.getNameAsString() };<a name="line.623"></a>
+<span class="sourceLineNo">624</span>    runVerifyReplication(args, NB_ROWS_IN_BATCH, 0);<a name="line.624"></a>
+<span class="sourceLineNo">625</span><a name="line.625"></a>
+<span class="sourceLineNo">626</span>    utility2.deleteTableData(peerTableName);<a name="line.626"></a>
+<span class="sourceLineNo">627</span>    runVerifyReplication(args, 0, NB_ROWS_IN_BATCH);<a name="line.627"></a>
+<span class="sourceLineNo">628</span>  }<a name="line.628"></a>
+<span class="sourceLineNo">629</span><a name="line.629"></a>
+<span class="sourceLineNo">630</span>  @Test<a name="line.630"></a>
+<span class="sourceLineNo">631</span>  public void testVerifyRepJobWithPeerTableNameAndSnapshotSupport() throws Exception {<a name="line.631"></a>
+<span class="sourceLineNo">632</span>    // Populate the tables with same data<a name="line.632"></a>
+<span class="sourceLineNo">633</span>    runBatchCopyTest();<a name="line.633"></a>
+<span class="sourceLineNo">634</span><a name="line.634"></a>
+<span class="sourceLineNo">635</span>    // Take source and target tables snapshot<a name="line.635"></a>
+<span class="sourceLineNo">636</span>    Path rootDir = FSUtils.getRootDir(conf1);<a name="line.636"></a>
+<span class="sourceLineNo">637</span>    FileSystem fs = rootDir.getFileSystem(conf1);<a name="line.637"></a>
+<span class="sourceLineNo">638</span>    String sourceSnapshotName = "sourceSnapshot-" + System.currentTimeMillis();<a name="line.638"></a>
+<span class="sourceLineNo">639</span>    SnapshotTestingUtils.createSnapshotAndValidate(utility1.getAdmin(), tableName,<a name="line.639"></a>
+<span class="sourceLineNo">640</span>            Bytes.toString(noRepfamName), sourceSnapshotName, rootDir, fs, true);<a name="line.640"></a>
+<span class="sourceLineNo">641</span><a name="line.641"></a>
+<span class="sourceLineNo">642</span>    // Take target snapshot<a name="line.642"></a>
+<span class="sourceLineNo">643</span>    Path peerRootDir = FSUtils.getRootDir(conf2);<a name="line.643"></a>
+<span class="sourceLineNo">644</span>    FileSystem peerFs = peerRootDir.getFileSystem(conf2);<a name="line.644"></a>
+<span class="sourceLineNo">645</span>    String peerSnapshotName = "peerSnapshot-" + System.currentTimeMillis();<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    SnapshotTestingUtils.createSnapshotAndValidate(utility2.getAdmin(), peerTableName,<a name="line.646"></a>
+<span class="sourceLineNo">647</span>            Bytes.toString(noRepfamName), peerSnapshotName, peerRootDir, peerFs, true);<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>    String peerFSAddress = peerFs.getUri().toString();<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    String tmpPath1 = utility1.getRandomDir().toString();<a name="line.650"></a>
+<span class="sourceLineNo">651</span>    String tmpPath2 = "/tmp" + System.currentTimeMillis();<a name="line.651"></a>
+<span class="sourceLineNo">652</span><a name="line.652"></a>
+<span class="sourceLineNo">653</span>    String[] args = new String[] { "--peerTableName=" + peerTableName.getNameAsString(),<a name="line.653"></a>
+<span class="sourceLineNo">654</span>      "--sourceSnapshotName=" + sourceSnapshotName,<a name="line.654"></a>
+<span class="sourceLineNo">655</span>      "--sourceSnapshotTmpDir=" + tmpPath1, "--peerSnapshotName=" + peerSnapshotName,<a name="line.655"></a>
+<span class="sourceLineNo">656</span>      "--peerSnapshotTmpDir=" + tmpPath2, "--peerFSAddress=" + peerFSAddress,<a name="line.656"></a>
+<span class="sourceLineNo">657</span>      "--peerHBaseRootAddress=" + FSUtils.getRootDir(conf2), utility2.getClusterKey(),<a name="line.657"></a>
+<span class="sourceLineNo">658</span>      tableName.getNameAsString() };<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    runVerifyReplication(args, NB_ROWS_IN_BATCH, 0);<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    checkRestoreTmpDir(conf1, tmpPath1, 1);<a name="line.660"></a>
+<span class="sourceLineNo">661</span>    checkRestoreTmpDir(conf2, tmpPath2, 1);<a name="line.661"></a>
+<span class="sourceLineNo">662</span><a name="line.662"></a>
+<span class="sourceLineNo">663</span>    Scan scan = new Scan();<a name="line.663"></a>
+<span class="sourceLineNo">664</span>    ResultScanner rs = htable3.getScanner(scan);<a name="line.664"></a>
+<span class="sourceLineNo">665</span>    Put put = null;<a name="line.665"></a>
+<span class="sourceLineNo">666</span>    for (Result result : rs) {<a name="line.666"></a>
+<span class="sourceLineNo">667</span>      put = new Put(result.getRow());<a name="line.667"></a>
+<span class="sourceLineNo">668</span>      Cell firstVal = result.rawCells()[0];<a name="line.668"></a>
+<span class="sourceLineNo">669</span>      put.addColumn(CellUtil.cloneFamily(firstVal), CellUtil.cloneQualifier(firstVal),<a name="line.669"></a>
+<span class="sourceLineNo">670</span>              Bytes.toBytes("diff data"));<a name="line.670"></a>
+<span class="sourceLineNo">671</span>      htable3.put(put);<a name="line.671"></a>
+<span class="sourceLineNo">672</span>    }<a name="line.672"></a>
+<span class="sourceLineNo">673</span>    Delete delete = new Delete(put.getRow());<a name="line.673"></a>
+<span class="sourceLineNo">674</span>    htable3.delete(delete);<a name="line.674"></a>
+<span class="sourceLineNo">675</span><a name="line.675"></a>
+<span class="sourceLineNo">676</span>    sourceSnapshotName = "sourceSnapshot-" + System.currentTimeMillis();<a name="line.676"></a>
+<span class="sourceLineNo">677</span>    SnapshotTestingUtils.createSnapshotAndValidate(utility1.getAdmin(), tableName,<a name="line.677"></a>
+<span class="sourceLineNo">678</span>            Bytes.toString(noRepfamName), sourceSnapshotName, rootDir, fs, true);<a name="line.678"></a>
+<span class="sourceLineNo">679</span><a name="line.679"></a>
+<span class="sourceLineNo">680</span>    peerSnapshotName = "peerSnapshot-" + System.currentTimeMillis();<a name="line.680"></a>
+<span class="sourceLineNo">681</span>    SnapshotTestingUtils.createSnapshotAndValidate(utility2.getAdmin(), peerTableName,<a name="line.681"></a>
+<span class="sourceLineNo">682</span>            Bytes.toString(noRepfamName), peerSnapshotName, peerRootDir, peerFs, true);<a name="line.682"></a>
+<span class="sourceLineNo">683</span><a name="line.683"></a>
+<span class="sourceLineNo">684</span>    args = new String[] { "--peerTableName=" + peerTableName.getNameAsString(),<a name="line.684"></a>
+<span class="sourceLineNo">685</span>      "--sourceSnapshotName=" + sourceSnapshotName,<a name="line.685"></a>
+<span class="sourceLineNo">686</span>      "--sourceSnapshotTmpDir=" + tmpPath1, "--peerSnapshotName=" + peerSnapshotName,<a name="line.686"></a>
+<span class="sourceLineNo">687</span>      "--peerSnapshotTmpDir=" + tmpPath2, "--peerFSAddress=" + peerFSAddress,<a name="line.687"></a>
+<span class="sourceLineNo">688</span>      "--peerHBaseRootAddress=" + FSUtils.getRootDir(conf2), utility2.getClusterKey(),<a name="line.688"></a>
+<span class="sourceLineNo">689</span>      tableName.getNameAsString() };<a name="line.689"></a>
+<span class="sourceLineNo">690</span>    runVerifyReplication(args, 0, NB_ROWS_IN_BATCH);<a name="line.690"></a>
+<span class="sourceLineNo">691</span>    checkRestoreTmpDir(conf1, tmpPath1, 2);<a name="line.691"></a>
+<span class="sourceLineNo">692</span>    checkRestoreTmpDir(conf2, tmpPath2, 2);<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>  @AfterClass<a name="line.695"></a>
+<span class="sourceLineNo">696</span>  public static void tearDownAfterClass() throws Exception {<a name="line.696"></a>
+<span class="sourceLineNo">697</span>    htable3.close();<a name="line.697"></a>
+<span class="sourceLineNo">698</span>    TestReplicationBase.tearDownAfterClass();<a name="line.698"></a>
+<span class="sourceLineNo">699</span>  }<a name="line.699"></a>
+<span class="sourceLineNo">700</span>}<a name="line.700"></a>