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 2020/10/14 20:23:32 UTC

[hbase-site] branch asf-site updated: Published site at 78b7244091f294d7e2f59a563d34dac7cf722cd7.

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 54879e7  Published site at 78b7244091f294d7e2f59a563d34dac7cf722cd7.
54879e7 is described below

commit 54879e7dff34f4f2c0986d1e9ce224590096107e
Author: jenkins <bu...@apache.org>
AuthorDate: Wed Oct 14 20:23:14 2020 +0000

    Published site at 78b7244091f294d7e2f59a563d34dac7cf722cd7.
---
 acid-semantics.html                                |   2 +-
 apache_hbase_reference_guide.pdf                   |   4 +-
 book.html                                          |   2 +-
 bulk-loads.html                                    |   2 +-
 checkstyle-aggregate.html                          |   2 +-
 coc.html                                           |   2 +-
 dependencies.html                                  |   2 +-
 dependency-convergence.html                        |   2 +-
 dependency-info.html                               |   2 +-
 dependency-management.html                         |   2 +-
 .../HBaseInterClusterReplicationEndpoint.html      |  38 +-
 .../HBaseInterClusterReplicationEndpoint.html      | 843 +++++++++++----------
 .../regionserver/ReplicationSource.html            |  46 +-
 downloads.html                                     |   2 +-
 export_control.html                                |   2 +-
 index.html                                         |   2 +-
 issue-tracking.html                                |   2 +-
 mail-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 +-
 project-summary.html                               |   2 +-
 pseudo-distributed.html                            |   2 +-
 replication.html                                   |   2 +-
 resources.html                                     |   2 +-
 source-repository.html                             |   2 +-
 sponsors.html                                      |   2 +-
 supportingprojects.html                            |   2 +-
 team-list.html                                     |   2 +-
 ...int.InterClusterReplicationEndpointForTest.html |   2 +-
 ...icationSource.DoNothingReplicationEndpoint.html |   2 +-
 ...eplicationSource.FaultyReplicationEndpoint.html |   2 +-
 ...ReplicationSource.FlakyReplicationEndpoint.html |   2 +-
 ...FailureInjectingReplicationEndpointForTest.html |   2 +-
 .../TestReplicator.ReplicationEndpointForTest.html |   2 +-
 ...TestSerialReplicationEndpoint.TestEndpoint.html |   2 +-
 40 files changed, 502 insertions(+), 501 deletions(-)

diff --git a/acid-semantics.html b/acid-semantics.html
index 64bbf2d..740bd01 100644
--- a/acid-semantics.html
+++ b/acid-semantics.html
@@ -467,7 +467,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-13</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-14</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 fca058c..3078b19 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.rc.2, based on Prawn 2.2.2)
 /Producer (Apache HBase Team)
-/ModDate (D:20201013200726+00'00')
-/CreationDate (D:20201013201942+00'00')
+/ModDate (D:20201014200728+00'00')
+/CreationDate (D:20201014201927+00'00')
 >>
 endobj
 2 0 obj
diff --git a/book.html b/book.html
index 80bbdec..8505310 100644
--- a/book.html
+++ b/book.html
@@ -46069,7 +46069,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 2020-10-13 20:07:26 UTC
+Last updated 2020-10-14 20:07:28 UTC
 </div>
 </div>
 <script type="text/x-mathjax-config">
diff --git a/bulk-loads.html b/bulk-loads.html
index d9eb1a8..c57dc88 100644
--- a/bulk-loads.html
+++ b/bulk-loads.html
@@ -172,7 +172,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-13</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-14</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 4d432d2..6854b3a 100644
--- a/checkstyle-aggregate.html
+++ b/checkstyle-aggregate.html
@@ -75963,7 +75963,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-13</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-14</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 e768139..b3c7eee 100644
--- a/coc.html
+++ b/coc.html
@@ -241,7 +241,7 @@ email to <a class="externalLink" href="mailto:private@hbase.apache.org">the priv
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-13</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-14</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 26d54b0..1d89cf2 100644
--- a/dependencies.html
+++ b/dependencies.html
@@ -313,7 +313,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-13</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-14</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 49f24ca..6382ff3 100644
--- a/dependency-convergence.html
+++ b/dependency-convergence.html
@@ -824,7 +824,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-13</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-14</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 993af22..d259e8f 100644
--- a/dependency-info.html
+++ b/dependency-info.html
@@ -194,7 +194,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-13</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-14</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 cfb81b8..1ba11b8 100644
--- a/dependency-management.html
+++ b/dependency-management.html
@@ -1019,7 +1019,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-13</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-14</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/org/apache/hadoop/hbase/replication/regionserver/HBaseInterClusterReplicationEndpoint.html b/devapidocs/org/apache/hadoop/hbase/replication/regionserver/HBaseInterClusterReplicationEndpoint.html
index 4890997..cfb89e5 100644
--- a/devapidocs/org/apache/hadoop/hbase/replication/regionserver/HBaseInterClusterReplicationEndpoint.html
+++ b/devapidocs/org/apache/hadoop/hbase/replication/regionserver/HBaseInterClusterReplicationEndpoint.html
@@ -421,7 +421,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/replication/HBaseRepl
                             int&nbsp;timeout)</code>&nbsp;</td>
 </tr>
 <tr id="i19" class="rowColor">
-<td class="colFirst"><code>protected boolean</code></td>
+<td class="colFirst"><code>private boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/HBaseInterClusterReplicationEndpoint.html#sleepForRetries-java.lang.String-int-">sleepForRetries</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;msg,
                int&nbsp;sleepMultiplier)</code>
 <div class="block">Do the sleeping logic</div>
@@ -760,8 +760,8 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/replication/HBaseRepl
 <ul class="blockList">
 <li class="blockList">
 <h4>sleepForRetries</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/HBaseInterClusterReplicationEndpoint.html#line.196">sleepForRetries</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;msg,
-                                  int&nbsp;sleepMultiplier)</pre>
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/HBaseInterClusterReplicationEndpoint.html#line.196">sleepForRetries</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;msg,
+                                int&nbsp;sleepMultiplier)</pre>
 <div class="block">Do the sleeping logic</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -778,7 +778,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/replication/HBaseRepl
 <ul class="blockList">
 <li class="blockList">
 <h4>getEstimatedEntrySize</h4>
-<pre>private&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/HBaseInterClusterReplicationEndpoint.html#line.211">getEstimatedEntrySize</a>(<a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.Entry.html" title="class in org.apache.hadoop.hbase.wal">WAL.Entry</a>&nbsp;e)</pre>
+<pre>private&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/HBaseInterClusterReplicationEndpoint.html#line.212">getEstimatedEntrySize</a>(<a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.Entry.html" title="class in org.apache.hadoop.hbase.wal">WAL.Entry</a>&nbsp;e)</pre>
 </li>
 </ul>
 <a name="createParallelBatches-java.util.List-">
@@ -787,7 +787,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/replication/HBaseRepl
 <ul class="blockList">
 <li class="blockList">
 <h4>createParallelBatches</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.Entry.html" title="class in org.apache.hadoop.hbase.wal">WAL.Entry</a>&gt;&gt;&nbsp;<a href="../../../../../../src-html/org/apache/ha [...]
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.Entry.html" title="class in org.apache.hadoop.hbase.wal">WAL.Entry</a>&gt;&gt;&nbsp;<a href="../../../../../../src-html/org/apache/ha [...]
 </li>
 </ul>
 <a name="createSerialBatches-java.util.List-">
@@ -796,7 +796,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/replication/HBaseRepl
 <ul class="blockList">
 <li class="blockList">
 <h4>createSerialBatches</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.Entry.html" title="class in org.apache.hadoop.hbase.wal">WAL.Entry</a>&gt;&gt;&nbsp;<a href="../../../../../../src-html/org/apache/ha [...]
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.Entry.html" title="class in org.apache.hadoop.hbase.wal">WAL.Entry</a>&gt;&gt;&nbsp;<a href="../../../../../../src-html/org/apache/ha [...]
 </li>
 </ul>
 <a name="createBatches-java.util.List-">
@@ -805,7 +805,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/replication/HBaseRepl
 <ul class="blockList">
 <li class="blockList">
 <h4>createBatches</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.Entry.html" title="class in org.apache.hadoop.hbase.wal">WAL.Entry</a>&gt;&gt;&nbsp;<a href="../../../../../../src-html/org/apache/ha [...]
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.Entry.html" title="class in org.apache.hadoop.hbase.wal">WAL.Entry</a>&gt;&gt;&nbsp;<a href="../../../../../../src-html/org/apache/ha [...]
 <div class="block">Divide the entries into multiple batches, so that we can replicate each batch in a thread pool
  concurrently. Note that, for serial replication, we need to make sure that entries from the
  same region to be replicated serially, so entries from the same region consist of a batch, and
@@ -819,7 +819,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/replication/HBaseRepl
 <ul class="blockList">
 <li class="blockList">
 <h4>isTableNotFoundException</h4>
-<pre>public static&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/HBaseInterClusterReplicationEndpoint.html#line.266">isTableNotFoundException</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a>&nbsp;io)</pre>
+<pre>public static&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/HBaseInterClusterReplicationEndpoint.html#line.267">isTableNotFoundException</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a>&nbsp;io)</pre>
 <div class="block">Check if there's an <a href="../../../../../../org/apache/hadoop/hbase/TableNotFoundException.html" title="class in org.apache.hadoop.hbase"><code>TableNotFoundException</code></a> in the caused by stacktrace.</div>
 </li>
 </ul>
@@ -829,7 +829,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/replication/HBaseRepl
 <ul class="blockList">
 <li class="blockList">
 <h4>isNoSuchColumnFamilyException</h4>
-<pre>public static&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/HBaseInterClusterReplicationEndpoint.html#line.285">isNoSuchColumnFamilyException</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a>&nbsp;io)</pre>
+<pre>public static&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/HBaseInterClusterReplicationEndpoint.html#line.286">isNoSuchColumnFamilyException</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a>&nbsp;io)</pre>
 <div class="block">Check if there's an <a href="../../../../../../org/apache/hadoop/hbase/regionserver/NoSuchColumnFamilyException.html" title="class in org.apache.hadoop.hbase.regionserver"><code>NoSuchColumnFamilyException</code></a> in the caused by stacktrace.</div>
 </li>
 </ul>
@@ -839,7 +839,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/replication/HBaseRepl
 <ul class="blockList">
 <li class="blockList">
 <h4>filterNotExistTableEdits</h4>
-<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.Entry.html" title="class in org.apache.hadoop.hbase.wal">WAL.Entry</a>&gt;&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/re [...]
+<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.Entry.html" title="class in org.apache.hadoop.hbase.wal">WAL.Entry</a>&gt;&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/re [...]
 </li>
 </ul>
 <a name="filterNotExistColumnFamilyEdits-java.util.List-">
@@ -848,7 +848,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/replication/HBaseRepl
 <ul class="blockList">
 <li class="blockList">
 <h4>filterNotExistColumnFamilyEdits</h4>
-<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.Entry.html" title="class in org.apache.hadoop.hbase.wal">WAL.Entry</a>&gt;&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/re [...]
+<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.Entry.html" title="class in org.apache.hadoop.hbase.wal">WAL.Entry</a>&gt;&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/re [...]
 </li>
 </ul>
 <a name="parallelReplicate-java.util.concurrent.CompletionService-org.apache.hadoop.hbase.replication.ReplicationEndpoint.ReplicateContext-java.util.List-">
@@ -857,7 +857,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/replication/HBaseRepl
 <ul class="blockList">
 <li class="blockList">
 <h4>parallelReplicate</h4>
-<pre>private&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/HBaseInterClusterReplicationEndpoint.html#line.406">parallelReplicate</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletionService.html?is-external=true" title="class or interface in java.util.concurrent">CompletionService</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html?is-external=true" title="class or interfac [...]
+<pre>private&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/HBaseInterClusterReplicationEndpoint.html#line.407">parallelReplicate</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletionService.html?is-external=true" title="class or interface in java.util.concurrent">CompletionService</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html?is-external=true" title="class or interfac [...]
                                <a href="../../../../../../org/apache/hadoop/hbase/replication/ReplicationEndpoint.ReplicateContext.html" title="class in org.apache.hadoop.hbase.replication">ReplicationEndpoint.ReplicateContext</a>&nbsp;replicateContext,
                                <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.Entry.html" title="class in org.apache.hadoop.hbase.wal">WAL.Entry</a>&gt;&gt;&nbsp;batches)
                         throws <a href="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>
@@ -873,7 +873,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/replication/HBaseRepl
 <ul class="blockList">
 <li class="blockList">
 <h4>replicate</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/HBaseInterClusterReplicationEndpoint.html#line.455">replicate</a>(<a href="../../../../../../org/apache/hadoop/hbase/replication/ReplicationEndpoint.ReplicateContext.html" title="class in org.apache.hadoop.hbase.replication">ReplicationEndpoint.ReplicateContext</a>&nbsp;replicateContext)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/HBaseInterClusterReplicationEndpoint.html#line.456">replicate</a>(<a href="../../../../../../org/apache/hadoop/hbase/replication/ReplicationEndpoint.ReplicateContext.html" title="class in org.apache.hadoop.hbase.replication">ReplicationEndpoint.ReplicateContext</a>&nbsp;replicateContext)</pre>
 <div class="block">Do the shipping logic</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -888,7 +888,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/replication/HBaseRepl
 <ul class="blockList">
 <li class="blockList">
 <h4>isPeerEnabled</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/HBaseInterClusterReplicationEndpoint.html#line.535">isPeerEnabled</a>()</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/HBaseInterClusterReplicationEndpoint.html#line.536">isPeerEnabled</a>()</pre>
 </li>
 </ul>
 <a name="doStop--">
@@ -897,7 +897,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/replication/HBaseRepl
 <ul class="blockList">
 <li class="blockList">
 <h4>doStop</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/HBaseInterClusterReplicationEndpoint.html#line.540">doStop</a>()</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/HBaseInterClusterReplicationEndpoint.html#line.541">doStop</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/replication/HBaseReplicationEndpoint.html#doStop--">doStop</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/replication/HBaseReplicationEndpoint.html" title="class in org.apache.hadoop.hbase.replication">HBaseReplicationEndpoint</a></code></dd>
@@ -910,7 +910,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/replication/HBaseRepl
 <ul class="blockList">
 <li class="blockList">
 <h4>replicateEntries</h4>
-<pre>protected&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/HBaseInterClusterReplicationEndpoint.html#line.559">replicateEntries</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.Entry.html" title="class in org.apache.hadoop.hbase.wal">WAL.Entry</a>&gt;&nbsp;entries,
+<pre>protected&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/HBaseInterClusterReplicationEndpoint.html#line.560">replicateEntries</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.Entry.html" title="class in org.apache.hadoop.hbase.wal">WAL.Entry</a>&gt;&nbsp;entries,
                                int&nbsp;batchIndex,
                                int&nbsp;timeout)
                         throws <a href="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>
@@ -926,7 +926,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/replication/HBaseRepl
 <ul class="blockList">
 <li class="blockList">
 <h4>serialReplicateRegionEntries</h4>
-<pre>private&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/HBaseInterClusterReplicationEndpoint.html#line.594">serialReplicateRegionEntries</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.Entry.html" title="class in org.apache.hadoop.hbase.wal">WAL.Entry</a>&gt;&nbsp;entries,
+<pre>private&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/HBaseInterClusterReplicationEndpoint.html#line.595">serialReplicateRegionEntries</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.Entry.html" title="class in org.apache.hadoop.hbase.wal">WAL.Entry</a>&gt;&nbsp;entries,
                                          int&nbsp;batchIndex,
                                          int&nbsp;timeout)
                                   throws <a href="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>
@@ -942,7 +942,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/replication/HBaseRepl
 <ul class="blockList">
 <li class="blockList">
 <h4>createReplicator</h4>
-<pre>protected&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Callable.html?is-external=true" title="class or interface in java.util.concurrent">Callable</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/HBaseInterClusterReplicationEndpoint.html#line.615">createRepli [...]
+<pre>protected&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Callable.html?is-external=true" title="class or interface in java.util.concurrent">Callable</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/HBaseInterClusterReplicationEndpoint.html#line.616">createRepli [...]
                                              int&nbsp;batchIndex,
                                              int&nbsp;timeout)</pre>
 </li>
@@ -953,7 +953,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/replication/HBaseRepl
 <ul class="blockListLast">
 <li class="blockList">
 <h4>logPeerId</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/HBaseInterClusterReplicationEndpoint.html#line.620">logPeerId</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>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/HBaseInterClusterReplicationEndpoint.html#line.621">logPeerId</a>()</pre>
 </li>
 </ul>
 </li>
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/replication/regionserver/HBaseInterClusterReplicationEndpoint.html b/devapidocs/src-html/org/apache/hadoop/hbase/replication/regionserver/HBaseInterClusterReplicationEndpoint.html
index c1a7026..a8faa35 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/replication/regionserver/HBaseInterClusterReplicationEndpoint.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/replication/regionserver/HBaseInterClusterReplicationEndpoint.html
@@ -201,7 +201,7 @@
 <span class="sourceLineNo">193</span>   * @param sleepMultiplier by how many times the default sleeping time is augmented<a name="line.193"></a>
 <span class="sourceLineNo">194</span>   * @return True if &lt;code&gt;sleepMultiplier&lt;/code&gt; is &amp;lt; &lt;code&gt;maxRetriesMultiplier&lt;/code&gt;<a name="line.194"></a>
 <span class="sourceLineNo">195</span>   */<a name="line.195"></a>
-<span class="sourceLineNo">196</span>  protected boolean sleepForRetries(String msg, int sleepMultiplier) {<a name="line.196"></a>
+<span class="sourceLineNo">196</span>  private boolean sleepForRetries(String msg, int sleepMultiplier) {<a name="line.196"></a>
 <span class="sourceLineNo">197</span>    try {<a name="line.197"></a>
 <span class="sourceLineNo">198</span>      if (LOG.isTraceEnabled()) {<a name="line.198"></a>
 <span class="sourceLineNo">199</span>        LOG.trace("{} {}, sleeping {} times {}",<a name="line.199"></a>
@@ -209,426 +209,427 @@
 <span class="sourceLineNo">201</span>      }<a name="line.201"></a>
 <span class="sourceLineNo">202</span>      Thread.sleep(this.sleepForRetries * sleepMultiplier);<a name="line.202"></a>
 <span class="sourceLineNo">203</span>    } catch (InterruptedException e) {<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      if (LOG.isDebugEnabled()) {<a name="line.204"></a>
-<span class="sourceLineNo">205</span>        LOG.debug("{} Interrupted while sleeping between retries", logPeerId());<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>    return sleepMultiplier &lt; maxRetriesMultiplier;<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>  private int getEstimatedEntrySize(Entry e) {<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    long size = e.getKey().estimatedSerializedSizeOf() + e.getEdit().estimatedSerializedSizeOf();<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    return (int) size;<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>  private List&lt;List&lt;Entry&gt;&gt; createParallelBatches(final List&lt;Entry&gt; entries) {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    int numSinks = Math.max(getNumSinks(), 1);<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    int n = Math.min(Math.min(this.maxThreads, entries.size() / 100 + 1), numSinks);<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    List&lt;List&lt;Entry&gt;&gt; entryLists =<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        Stream.generate(ArrayList&lt;Entry&gt;::new).limit(n).collect(Collectors.toList());<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    int[] sizes = new int[n];<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    for (Entry e : entries) {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>      int index = Math.abs(Bytes.hashCode(e.getKey().getEncodedRegionName()) % n);<a name="line.223"></a>
-<span class="sourceLineNo">224</span>      int entrySize = getEstimatedEntrySize(e);<a name="line.224"></a>
-<span class="sourceLineNo">225</span>      // If this batch has at least one entry and is over sized, move it to the tail of list and<a name="line.225"></a>
-<span class="sourceLineNo">226</span>      // initialize the entryLists[index] to be a empty list.<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      if (sizes[index] &gt; 0 &amp;&amp; sizes[index] + entrySize &gt; replicationRpcLimit) {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>        entryLists.add(entryLists.get(index));<a name="line.228"></a>
-<span class="sourceLineNo">229</span>        entryLists.set(index, new ArrayList&lt;&gt;());<a name="line.229"></a>
-<span class="sourceLineNo">230</span>        sizes[index] = 0;<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      }<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      entryLists.get(index).add(e);<a name="line.232"></a>
-<span class="sourceLineNo">233</span>      sizes[index] += entrySize;<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    }<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    return entryLists;<a name="line.235"></a>
-<span class="sourceLineNo">236</span>  }<a name="line.236"></a>
-<span class="sourceLineNo">237</span><a name="line.237"></a>
-<span class="sourceLineNo">238</span>  private List&lt;List&lt;Entry&gt;&gt; createSerialBatches(final List&lt;Entry&gt; entries) {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    Map&lt;byte[], List&lt;Entry&gt;&gt; regionEntries = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    for (Entry e : entries) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>      regionEntries.computeIfAbsent(e.getKey().getEncodedRegionName(), key -&gt; new ArrayList&lt;&gt;())<a name="line.241"></a>
-<span class="sourceLineNo">242</span>          .add(e);<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    }<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    return new ArrayList&lt;&gt;(regionEntries.values());<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>   * Divide the entries into multiple batches, so that we can replicate each batch in a thread pool<a name="line.248"></a>
-<span class="sourceLineNo">249</span>   * concurrently. Note that, for serial replication, we need to make sure that entries from the<a name="line.249"></a>
-<span class="sourceLineNo">250</span>   * same region to be replicated serially, so entries from the same region consist of a batch, and<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   * we will divide a batch into several batches by replicationRpcLimit in method<a name="line.251"></a>
-<span class="sourceLineNo">252</span>   * serialReplicateRegionEntries()<a name="line.252"></a>
-<span class="sourceLineNo">253</span>   */<a name="line.253"></a>
-<span class="sourceLineNo">254</span>  private List&lt;List&lt;Entry&gt;&gt; createBatches(final List&lt;Entry&gt; entries) {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>    if (isSerial) {<a name="line.255"></a>
-<span class="sourceLineNo">256</span>      return createSerialBatches(entries);<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    } else {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>      return createParallelBatches(entries);<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><a name="line.261"></a>
-<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   * Check if there's an {@link TableNotFoundException} in the caused by stacktrace.<a name="line.263"></a>
-<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  @VisibleForTesting<a name="line.265"></a>
-<span class="sourceLineNo">266</span>  public static boolean isTableNotFoundException(Throwable io) {<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    if (io instanceof RemoteException) {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>      io = ((RemoteException) io).unwrapRemoteException();<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    }<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    if (io != null &amp;&amp; io.getMessage().contains("TableNotFoundException")) {<a name="line.270"></a>
-<span class="sourceLineNo">271</span>      return true;<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    }<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    for (; io != null; io = io.getCause()) {<a name="line.273"></a>
-<span class="sourceLineNo">274</span>      if (io instanceof TableNotFoundException) {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>        return true;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      }<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    }<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    return false;<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  }<a name="line.279"></a>
-<span class="sourceLineNo">280</span><a name="line.280"></a>
-<span class="sourceLineNo">281</span>  /**<a name="line.281"></a>
-<span class="sourceLineNo">282</span>   * Check if there's an {@link NoSuchColumnFamilyException} in the caused by stacktrace.<a name="line.282"></a>
-<span class="sourceLineNo">283</span>   */<a name="line.283"></a>
-<span class="sourceLineNo">284</span>  @VisibleForTesting<a name="line.284"></a>
-<span class="sourceLineNo">285</span>  public static boolean isNoSuchColumnFamilyException(Throwable io) {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    if (io instanceof RemoteException) {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      io = ((RemoteException) io).unwrapRemoteException();<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    if (io != null &amp;&amp; io.getMessage().contains("NoSuchColumnFamilyException")) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      return true;<a name="line.290"></a>
-<span class="sourceLineNo">291</span>    }<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    for (; io != null; io = io.getCause()) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      if (io instanceof NoSuchColumnFamilyException) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        return true;<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    }<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    return false;<a name="line.297"></a>
-<span class="sourceLineNo">298</span>  }<a name="line.298"></a>
-<span class="sourceLineNo">299</span><a name="line.299"></a>
-<span class="sourceLineNo">300</span>  @VisibleForTesting<a name="line.300"></a>
-<span class="sourceLineNo">301</span>  List&lt;List&lt;Entry&gt;&gt; filterNotExistTableEdits(final List&lt;List&lt;Entry&gt;&gt; oldEntryList) {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    List&lt;List&lt;Entry&gt;&gt; entryList = new ArrayList&lt;&gt;();<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    Map&lt;TableName, Boolean&gt; existMap = new HashMap&lt;&gt;();<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    try (Connection localConn = ConnectionFactory.createConnection(ctx.getLocalConfiguration());<a name="line.304"></a>
-<span class="sourceLineNo">305</span>         Admin localAdmin = localConn.getAdmin()) {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>      for (List&lt;Entry&gt; oldEntries : oldEntryList) {<a name="line.306"></a>
-<span class="sourceLineNo">307</span>        List&lt;Entry&gt; entries = new ArrayList&lt;&gt;();<a name="line.307"></a>
-<span class="sourceLineNo">308</span>        for (Entry e : oldEntries) {<a name="line.308"></a>
-<span class="sourceLineNo">309</span>          TableName tableName = e.getKey().getTableName();<a name="line.309"></a>
-<span class="sourceLineNo">310</span>          boolean exist = true;<a name="line.310"></a>
-<span class="sourceLineNo">311</span>          if (existMap.containsKey(tableName)) {<a name="line.311"></a>
-<span class="sourceLineNo">312</span>            exist = existMap.get(tableName);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>          } else {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>            try {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>              exist = localAdmin.tableExists(tableName);<a name="line.315"></a>
-<span class="sourceLineNo">316</span>              existMap.put(tableName, exist);<a name="line.316"></a>
-<span class="sourceLineNo">317</span>            } catch (IOException iox) {<a name="line.317"></a>
-<span class="sourceLineNo">318</span>              LOG.warn("Exception checking for local table " + tableName, iox);<a name="line.318"></a>
-<span class="sourceLineNo">319</span>              // we can't drop edits without full assurance, so we assume table exists.<a name="line.319"></a>
-<span class="sourceLineNo">320</span>              exist = true;<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 (exist) {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>            entries.add(e);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>          } else {<a name="line.325"></a>
-<span class="sourceLineNo">326</span>            // Would potentially be better to retry in one of the outer loops<a name="line.326"></a>
-<span class="sourceLineNo">327</span>            // and add a table filter there; but that would break the encapsulation,<a name="line.327"></a>
-<span class="sourceLineNo">328</span>            // so we're doing the filtering here.<a name="line.328"></a>
-<span class="sourceLineNo">329</span>            LOG.warn("Missing table detected at sink, local table also does not exist, "<a name="line.329"></a>
-<span class="sourceLineNo">330</span>                + "filtering edits for table '{}'", tableName);<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>        if (!entries.isEmpty()) {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>          entryList.add(entries);<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>    } catch (IOException iox) {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      LOG.warn("Exception when creating connection to check local table", iox);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      return oldEntryList;<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    }<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    return entryList;<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>  @VisibleForTesting<a name="line.344"></a>
-<span class="sourceLineNo">345</span>  List&lt;List&lt;Entry&gt;&gt; filterNotExistColumnFamilyEdits(final List&lt;List&lt;Entry&gt;&gt; oldEntryList) {<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    List&lt;List&lt;Entry&gt;&gt; entryList = new ArrayList&lt;&gt;();<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    Map&lt;TableName, Set&lt;String&gt;&gt; existColumnFamilyMap = new HashMap&lt;&gt;();<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    try (Connection localConn = ConnectionFactory.createConnection(ctx.getLocalConfiguration());<a name="line.348"></a>
-<span class="sourceLineNo">349</span>         Admin localAdmin = localConn.getAdmin()) {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>      for (List&lt;Entry&gt; oldEntries : oldEntryList) {<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        List&lt;Entry&gt; entries = new ArrayList&lt;&gt;();<a name="line.351"></a>
-<span class="sourceLineNo">352</span>        for (Entry e : oldEntries) {<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          TableName tableName = e.getKey().getTableName();<a name="line.353"></a>
-<span class="sourceLineNo">354</span>          if (!existColumnFamilyMap.containsKey(tableName)) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>            try {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>              Set&lt;String&gt; cfs = localAdmin.getDescriptor(tableName).getColumnFamilyNames().stream()<a name="line.356"></a>
-<span class="sourceLineNo">357</span>                  .map(Bytes::toString).collect(Collectors.toSet());<a name="line.357"></a>
-<span class="sourceLineNo">358</span>              existColumnFamilyMap.put(tableName, cfs);<a name="line.358"></a>
-<span class="sourceLineNo">359</span>            } catch (Exception ex) {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>              LOG.warn("Exception getting cf names for local table {}", tableName, ex);<a name="line.360"></a>
-<span class="sourceLineNo">361</span>              // if catch any exception, we are not sure about table's description,<a name="line.361"></a>
-<span class="sourceLineNo">362</span>              // so replicate raw entry<a name="line.362"></a>
-<span class="sourceLineNo">363</span>              entries.add(e);<a name="line.363"></a>
-<span class="sourceLineNo">364</span>              continue;<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>          Set&lt;String&gt; existColumnFamilies = existColumnFamilyMap.get(tableName);<a name="line.368"></a>
-<span class="sourceLineNo">369</span>          Set&lt;String&gt; missingCFs = new HashSet&lt;&gt;();<a name="line.369"></a>
-<span class="sourceLineNo">370</span>          WALEdit walEdit = new WALEdit();<a name="line.370"></a>
-<span class="sourceLineNo">371</span>          walEdit.getCells().addAll(e.getEdit().getCells());<a name="line.371"></a>
-<span class="sourceLineNo">372</span>          WALUtil.filterCells(walEdit, cell -&gt; {<a name="line.372"></a>
-<span class="sourceLineNo">373</span>            String cf = Bytes.toString(CellUtil.cloneFamily(cell));<a name="line.373"></a>
-<span class="sourceLineNo">374</span>            if (existColumnFamilies.contains(cf)) {<a name="line.374"></a>
-<span class="sourceLineNo">375</span>              return cell;<a name="line.375"></a>
-<span class="sourceLineNo">376</span>            } else {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>              missingCFs.add(cf);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>              return null;<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>          if (!walEdit.isEmpty()) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>            Entry newEntry = new Entry(e.getKey(), walEdit);<a name="line.382"></a>
-<span class="sourceLineNo">383</span>            entries.add(newEntry);<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>          if (!missingCFs.isEmpty()) {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>            // Would potentially be better to retry in one of the outer loops<a name="line.387"></a>
-<span class="sourceLineNo">388</span>            // and add a table filter there; but that would break the encapsulation,<a name="line.388"></a>
-<span class="sourceLineNo">389</span>            // so we're doing the filtering here.<a name="line.389"></a>
-<span class="sourceLineNo">390</span>            LOG.warn(<a name="line.390"></a>
-<span class="sourceLineNo">391</span>                "Missing column family detected at sink, local column family also does not exist,"<a name="line.391"></a>
-<span class="sourceLineNo">392</span>                    + " filtering edits for table '{}',column family '{}'", tableName, missingCFs);<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>        if (!entries.isEmpty()) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>          entryList.add(entries);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>        }<a name="line.397"></a>
-<span class="sourceLineNo">398</span>      }<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    } catch (IOException iox) {<a name="line.399"></a>
-<span class="sourceLineNo">400</span>      LOG.warn("Exception when creating connection to check local table", iox);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>      return oldEntryList;<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    }<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    return entryList;<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>  private long parallelReplicate(CompletionService&lt;Integer&gt; pool, ReplicateContext replicateContext,<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      List&lt;List&lt;Entry&gt;&gt; batches) throws IOException {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    int futures = 0;<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    for (int i = 0; i &lt; batches.size(); i++) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      List&lt;Entry&gt; entries = batches.get(i);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      if (!entries.isEmpty()) {<a name="line.411"></a>
-<span class="sourceLineNo">412</span>        if (LOG.isTraceEnabled()) {<a name="line.412"></a>
-<span class="sourceLineNo">413</span>          LOG.trace("{} Submitting {} entries of total size {}", logPeerId(), entries.size(),<a name="line.413"></a>
-<span class="sourceLineNo">414</span>            replicateContext.getSize());<a name="line.414"></a>
-<span class="sourceLineNo">415</span>        }<a name="line.415"></a>
-<span class="sourceLineNo">416</span>        // RuntimeExceptions encountered here bubble up and are handled in ReplicationSource<a name="line.416"></a>
-<span class="sourceLineNo">417</span>        pool.submit(createReplicator(entries, i, replicateContext.getTimeout()));<a name="line.417"></a>
-<span class="sourceLineNo">418</span>        futures++;<a name="line.418"></a>
-<span class="sourceLineNo">419</span>      }<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    }<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>    IOException iox = null;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    long lastWriteTime = 0;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    for (int i = 0; i &lt; futures; i++) {<a name="line.424"></a>
-<span class="sourceLineNo">425</span>      try {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>        // wait for all futures, remove successful parts<a name="line.426"></a>
-<span class="sourceLineNo">427</span>        // (only the remaining parts will be retried)<a name="line.427"></a>
-<span class="sourceLineNo">428</span>        Future&lt;Integer&gt; f = pool.take();<a name="line.428"></a>
-<span class="sourceLineNo">429</span>        int index = f.get();<a name="line.429"></a>
-<span class="sourceLineNo">430</span>        List&lt;Entry&gt; batch = batches.get(index);<a name="line.430"></a>
-<span class="sourceLineNo">431</span>        batches.set(index, Collections.emptyList()); // remove successful batch<a name="line.431"></a>
-<span class="sourceLineNo">432</span>        // Find the most recent write time in the batch<a name="line.432"></a>
-<span class="sourceLineNo">433</span>        long writeTime = batch.get(batch.size() - 1).getKey().getWriteTime();<a name="line.433"></a>
-<span class="sourceLineNo">434</span>        if (writeTime &gt; lastWriteTime) {<a name="line.434"></a>
-<span class="sourceLineNo">435</span>          lastWriteTime = writeTime;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>        }<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      } catch (InterruptedException ie) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>        iox = new IOException(ie);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>      } catch (ExecutionException ee) {<a name="line.439"></a>
-<span class="sourceLineNo">440</span>        iox = ee.getCause() instanceof IOException?<a name="line.440"></a>
-<span class="sourceLineNo">441</span>          (IOException)ee.getCause(): new IOException(ee.getCause());<a name="line.441"></a>
-<span class="sourceLineNo">442</span>      }<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    }<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    if (iox != null) {<a name="line.444"></a>
-<span class="sourceLineNo">445</span>      // if we had any exceptions, try again<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      throw iox;<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    }<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    return lastWriteTime;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>  }<a name="line.449"></a>
-<span class="sourceLineNo">450</span><a name="line.450"></a>
-<span class="sourceLineNo">451</span>  /**<a name="line.451"></a>
-<span class="sourceLineNo">452</span>   * Do the shipping logic<a name="line.452"></a>
-<span class="sourceLineNo">453</span>   */<a name="line.453"></a>
-<span class="sourceLineNo">454</span>  @Override<a name="line.454"></a>
-<span class="sourceLineNo">455</span>  public boolean replicate(ReplicateContext replicateContext) {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>    CompletionService&lt;Integer&gt; pool = new ExecutorCompletionService&lt;&gt;(this.exec);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>    int sleepMultiplier = 1;<a name="line.457"></a>
-<span class="sourceLineNo">458</span><a name="line.458"></a>
-<span class="sourceLineNo">459</span>    if (!peersSelected &amp;&amp; this.isRunning()) {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      connectToPeers();<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      peersSelected = true;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    }<a name="line.462"></a>
-<span class="sourceLineNo">463</span><a name="line.463"></a>
-<span class="sourceLineNo">464</span>    int numSinks = getNumSinks();<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    if (numSinks == 0) {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      if((System.currentTimeMillis() - lastSinkFetchTime) &gt;= (maxRetriesMultiplier*1000)) {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>        LOG.warn(<a name="line.467"></a>
-<span class="sourceLineNo">468</span>          "No replication sinks found, returning without replicating. "<a name="line.468"></a>
-<span class="sourceLineNo">469</span>            + "The source should retry with the same set of edits. Not logging this again for "<a name="line.469"></a>
-<span class="sourceLineNo">470</span>            + "the next {} seconds.", maxRetriesMultiplier);<a name="line.470"></a>
-<span class="sourceLineNo">471</span>        lastSinkFetchTime = System.currentTimeMillis();<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      sleepForRetries("No sinks available at peer", sleepMultiplier);<a name="line.473"></a>
-<span class="sourceLineNo">474</span>      return false;<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    }<a name="line.475"></a>
-<span class="sourceLineNo">476</span><a name="line.476"></a>
-<span class="sourceLineNo">477</span>    List&lt;List&lt;Entry&gt;&gt; batches = createBatches(replicateContext.getEntries());<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    while (this.isRunning() &amp;&amp; !exec.isShutdown()) {<a name="line.478"></a>
-<span class="sourceLineNo">479</span>      if (!isPeerEnabled()) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>        if (sleepForRetries("Replication is disabled", sleepMultiplier)) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>          sleepMultiplier++;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>        }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>        continue;<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      }<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      try {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>        // replicate the batches to sink side.<a name="line.486"></a>
-<span class="sourceLineNo">487</span>        parallelReplicate(pool, replicateContext, batches);<a name="line.487"></a>
-<span class="sourceLineNo">488</span>        return true;<a name="line.488"></a>
-<span class="sourceLineNo">489</span>      } catch (IOException ioe) {<a name="line.489"></a>
-<span class="sourceLineNo">490</span>        if (ioe instanceof RemoteException) {<a name="line.490"></a>
-<span class="sourceLineNo">491</span>          if (dropOnDeletedTables &amp;&amp; isTableNotFoundException(ioe)) {<a name="line.491"></a>
-<span class="sourceLineNo">492</span>            // Only filter the edits to replicate and don't change the entries in replicateContext<a name="line.492"></a>
-<span class="sourceLineNo">493</span>            // as the upper layer rely on it.<a name="line.493"></a>
-<span class="sourceLineNo">494</span>            batches = filterNotExistTableEdits(batches);<a name="line.494"></a>
-<span class="sourceLineNo">495</span>            if (batches.isEmpty()) {<a name="line.495"></a>
-<span class="sourceLineNo">496</span>              LOG.warn("After filter not exist table's edits, 0 edits to replicate, just return");<a name="line.496"></a>
-<span class="sourceLineNo">497</span>              return true;<a name="line.497"></a>
-<span class="sourceLineNo">498</span>            }<a name="line.498"></a>
-<span class="sourceLineNo">499</span>          } else if (dropOnDeletedColumnFamilies &amp;&amp; isNoSuchColumnFamilyException(ioe)) {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>            batches = filterNotExistColumnFamilyEdits(batches);<a name="line.500"></a>
-<span class="sourceLineNo">501</span>            if (batches.isEmpty()) {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>              LOG.warn("After filter not exist column family's edits, 0 edits to replicate, " +<a name="line.502"></a>
-<span class="sourceLineNo">503</span>                  "just return");<a name="line.503"></a>
-<span class="sourceLineNo">504</span>              return true;<a name="line.504"></a>
-<span class="sourceLineNo">505</span>            }<a name="line.505"></a>
-<span class="sourceLineNo">506</span>          } else {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>            LOG.warn("{} Peer encountered RemoteException, rechecking all sinks: ", logPeerId(),<a name="line.507"></a>
-<span class="sourceLineNo">508</span>                ioe);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>            chooseSinks();<a name="line.509"></a>
-<span class="sourceLineNo">510</span>          }<a name="line.510"></a>
-<span class="sourceLineNo">511</span>        } else {<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          if (ioe instanceof SocketTimeoutException) {<a name="line.512"></a>
-<span class="sourceLineNo">513</span>            // This exception means we waited for more than 60s and nothing<a name="line.513"></a>
-<span class="sourceLineNo">514</span>            // happened, the cluster is alive and calling it right away<a name="line.514"></a>
-<span class="sourceLineNo">515</span>            // even for a test just makes things worse.<a name="line.515"></a>
-<span class="sourceLineNo">516</span>            sleepForRetries("Encountered a SocketTimeoutException. Since the " +<a name="line.516"></a>
-<span class="sourceLineNo">517</span>                  "call to the remote cluster timed out, which is usually " +<a name="line.517"></a>
-<span class="sourceLineNo">518</span>                  "caused by a machine failure or a massive slowdown",<a name="line.518"></a>
-<span class="sourceLineNo">519</span>              this.socketTimeoutMultiplier);<a name="line.519"></a>
-<span class="sourceLineNo">520</span>          } else if (ioe instanceof ConnectException || ioe instanceof UnknownHostException) {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>            LOG.warn("{} Peer is unavailable, rechecking all sinks: ", logPeerId(), ioe);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>            chooseSinks();<a name="line.522"></a>
-<span class="sourceLineNo">523</span>          } else {<a name="line.523"></a>
-<span class="sourceLineNo">524</span>            LOG.warn("{} Can't replicate because of a local or network error: ", logPeerId(), ioe);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>          }<a name="line.525"></a>
-<span class="sourceLineNo">526</span>        }<a name="line.526"></a>
-<span class="sourceLineNo">527</span>        if (sleepForRetries("Since we are unable to replicate", sleepMultiplier)) {<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          sleepMultiplier++;<a name="line.528"></a>
-<span class="sourceLineNo">529</span>        }<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      }<a name="line.530"></a>
-<span class="sourceLineNo">531</span>    }<a name="line.531"></a>
-<span class="sourceLineNo">532</span>    return false; // in case we exited before replicating<a name="line.532"></a>
-<span class="sourceLineNo">533</span>  }<a name="line.533"></a>
-<span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>  protected boolean isPeerEnabled() {<a name="line.535"></a>
-<span class="sourceLineNo">536</span>    return ctx.getReplicationPeer().isPeerEnabled();<a name="line.536"></a>
-<span class="sourceLineNo">537</span>  }<a name="line.537"></a>
-<span class="sourceLineNo">538</span><a name="line.538"></a>
-<span class="sourceLineNo">539</span>  @Override<a name="line.539"></a>
-<span class="sourceLineNo">540</span>  protected void doStop() {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    disconnect(); // don't call super.doStop()<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    // Allow currently running replication tasks to finish<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    exec.shutdown();<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    try {<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      exec.awaitTermination(maxTerminationWait, TimeUnit.MILLISECONDS);<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    } catch (InterruptedException e) {<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    // Abort if the tasks did not terminate in time<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    if (!exec.isTerminated()) {<a name="line.549"></a>
-<span class="sourceLineNo">550</span>      String errMsg = "HBaseInterClusterReplicationEndpoint termination failed. The " +<a name="line.550"></a>
-<span class="sourceLineNo">551</span>          "ThreadPoolExecutor failed to finish all tasks within " + maxTerminationWait + "ms. " +<a name="line.551"></a>
-<span class="sourceLineNo">552</span>          "Aborting to prevent Replication from deadlocking. See HBASE-16081.";<a name="line.552"></a>
-<span class="sourceLineNo">553</span>      abortable.abort(errMsg, new IOException(errMsg));<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    }<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    notifyStopped();<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>  @VisibleForTesting<a name="line.558"></a>
-<span class="sourceLineNo">559</span>  protected int replicateEntries(List&lt;Entry&gt; entries, int batchIndex, int timeout)<a name="line.559"></a>
-<span class="sourceLineNo">560</span>      throws IOException {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    SinkPeer sinkPeer = null;<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    try {<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      int entriesHashCode = System.identityHashCode(entries);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      if (LOG.isTraceEnabled()) {<a name="line.564"></a>
-<span class="sourceLineNo">565</span>        long size = entries.stream().mapToLong(this::getEstimatedEntrySize).sum();<a name="line.565"></a>
-<span class="sourceLineNo">566</span>        LOG.trace("{} Replicating batch {} of {} entries with total size {} bytes to {}",<a name="line.566"></a>
-<span class="sourceLineNo">567</span>          logPeerId(), entriesHashCode, entries.size(), size, replicationClusterId);<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      }<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      sinkPeer = getReplicationSink();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>      AsyncRegionServerAdmin rsAdmin = sinkPeer.getRegionServer();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>      try {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>        ReplicationProtobufUtil.replicateWALEntry(rsAdmin,<a name="line.572"></a>
-<span class="sourceLineNo">573</span>          entries.toArray(new Entry[entries.size()]), replicationClusterId, baseNamespaceDir,<a name="line.573"></a>
-<span class="sourceLineNo">574</span>          hfileArchiveDir, timeout);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        if (LOG.isTraceEnabled()) {<a name="line.575"></a>
-<span class="sourceLineNo">576</span>          LOG.trace("{} Completed replicating batch {}", logPeerId(), entriesHashCode);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        }<a name="line.577"></a>
-<span class="sourceLineNo">578</span>      } catch (IOException e) {<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        if (LOG.isTraceEnabled()) {<a name="line.579"></a>
-<span class="sourceLineNo">580</span>          LOG.trace("{} Failed replicating batch {}", logPeerId(), entriesHashCode, e);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>        }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>        throw e;<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      }<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      reportSinkSuccess(sinkPeer);<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    } catch (IOException ioe) {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>      if (sinkPeer != null) {<a name="line.586"></a>
-<span class="sourceLineNo">587</span>        reportBadSink(sinkPeer);<a name="line.587"></a>
-<span class="sourceLineNo">588</span>      }<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      throw ioe;<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    }<a name="line.590"></a>
-<span class="sourceLineNo">591</span>    return batchIndex;<a name="line.591"></a>
-<span class="sourceLineNo">592</span>  }<a name="line.592"></a>
-<span class="sourceLineNo">593</span><a name="line.593"></a>
-<span class="sourceLineNo">594</span>  private int serialReplicateRegionEntries(List&lt;Entry&gt; entries, int batchIndex, int timeout)<a name="line.594"></a>
-<span class="sourceLineNo">595</span>      throws IOException {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    int batchSize = 0, index = 0;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    List&lt;Entry&gt; batch = new ArrayList&lt;&gt;();<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    for (Entry entry : entries) {<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      int entrySize = getEstimatedEntrySize(entry);<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      if (batchSize &gt; 0 &amp;&amp; batchSize + entrySize &gt; replicationRpcLimit) {<a name="line.600"></a>
-<span class="sourceLineNo">601</span>        replicateEntries(batch, index++, timeout);<a name="line.601"></a>
-<span class="sourceLineNo">602</span>        batch.clear();<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        batchSize = 0;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>      }<a name="line.604"></a>
-<span class="sourceLineNo">605</span>      batch.add(entry);<a name="line.605"></a>
-<span class="sourceLineNo">606</span>      batchSize += entrySize;<a name="line.606"></a>
-<span class="sourceLineNo">607</span>    }<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    if (batchSize &gt; 0) {<a name="line.608"></a>
-<span class="sourceLineNo">609</span>      replicateEntries(batch, index, timeout);<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    }<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    return batchIndex;<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>  @VisibleForTesting<a name="line.614"></a>
-<span class="sourceLineNo">615</span>  protected Callable&lt;Integer&gt; createReplicator(List&lt;Entry&gt; entries, int batchIndex, int timeout) {<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    return isSerial ? () -&gt; serialReplicateRegionEntries(entries, batchIndex, timeout)<a name="line.616"></a>
-<span class="sourceLineNo">617</span>        : () -&gt; replicateEntries(entries, batchIndex, timeout);<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>  private String logPeerId(){<a name="line.620"></a>
-<span class="sourceLineNo">621</span>    return "[Source for peer " + this.ctx.getPeerId() + "]:";<a name="line.621"></a>
-<span class="sourceLineNo">622</span>  }<a name="line.622"></a>
-<span class="sourceLineNo">623</span>}<a name="line.623"></a>
+<span class="sourceLineNo">204</span>      Thread.currentThread().interrupt();<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("{} {} Interrupted while sleeping between retries", msg, logPeerId());<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>    return sleepMultiplier &lt; maxRetriesMultiplier;<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>  private int getEstimatedEntrySize(Entry e) {<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    long size = e.getKey().estimatedSerializedSizeOf() + e.getEdit().estimatedSerializedSizeOf();<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    return (int) size;<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>  private List&lt;List&lt;Entry&gt;&gt; createParallelBatches(final List&lt;Entry&gt; entries) {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    int numSinks = Math.max(getNumSinks(), 1);<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    int n = Math.min(Math.min(this.maxThreads, entries.size() / 100 + 1), numSinks);<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    List&lt;List&lt;Entry&gt;&gt; entryLists =<a name="line.220"></a>
+<span class="sourceLineNo">221</span>        Stream.generate(ArrayList&lt;Entry&gt;::new).limit(n).collect(Collectors.toList());<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    int[] sizes = new int[n];<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    for (Entry e : entries) {<a name="line.223"></a>
+<span class="sourceLineNo">224</span>      int index = Math.abs(Bytes.hashCode(e.getKey().getEncodedRegionName()) % n);<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      int entrySize = getEstimatedEntrySize(e);<a name="line.225"></a>
+<span class="sourceLineNo">226</span>      // If this batch has at least one entry and is over sized, move it to the tail of list and<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      // initialize the entryLists[index] to be a empty list.<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      if (sizes[index] &gt; 0 &amp;&amp; sizes[index] + entrySize &gt; replicationRpcLimit) {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>        entryLists.add(entryLists.get(index));<a name="line.229"></a>
+<span class="sourceLineNo">230</span>        entryLists.set(index, new ArrayList&lt;&gt;());<a name="line.230"></a>
+<span class="sourceLineNo">231</span>        sizes[index] = 0;<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      }<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      entryLists.get(index).add(e);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      sizes[index] += entrySize;<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    }<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    return entryLists;<a name="line.236"></a>
+<span class="sourceLineNo">237</span>  }<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>  private List&lt;List&lt;Entry&gt;&gt; createSerialBatches(final List&lt;Entry&gt; entries) {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    Map&lt;byte[], List&lt;Entry&gt;&gt; regionEntries = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    for (Entry e : entries) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      regionEntries.computeIfAbsent(e.getKey().getEncodedRegionName(), key -&gt; new ArrayList&lt;&gt;())<a name="line.242"></a>
+<span class="sourceLineNo">243</span>          .add(e);<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    }<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    return new ArrayList&lt;&gt;(regionEntries.values());<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>   * Divide the entries into multiple batches, so that we can replicate each batch in a thread pool<a name="line.249"></a>
+<span class="sourceLineNo">250</span>   * concurrently. Note that, for serial replication, we need to make sure that entries from the<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * same region to be replicated serially, so entries from the same region consist of a batch, and<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   * we will divide a batch into several batches by replicationRpcLimit in method<a name="line.252"></a>
+<span class="sourceLineNo">253</span>   * serialReplicateRegionEntries()<a name="line.253"></a>
+<span class="sourceLineNo">254</span>   */<a name="line.254"></a>
+<span class="sourceLineNo">255</span>  private List&lt;List&lt;Entry&gt;&gt; createBatches(final List&lt;Entry&gt; entries) {<a name="line.255"></a>
+<span class="sourceLineNo">256</span>    if (isSerial) {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>      return createSerialBatches(entries);<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    } else {<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      return createParallelBatches(entries);<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><a name="line.262"></a>
+<span class="sourceLineNo">263</span>  /**<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * Check if there's an {@link TableNotFoundException} in the caused by stacktrace.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  @VisibleForTesting<a name="line.266"></a>
+<span class="sourceLineNo">267</span>  public static boolean isTableNotFoundException(Throwable io) {<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    if (io instanceof RemoteException) {<a name="line.268"></a>
+<span class="sourceLineNo">269</span>      io = ((RemoteException) io).unwrapRemoteException();<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    }<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    if (io != null &amp;&amp; io.getMessage().contains("TableNotFoundException")) {<a name="line.271"></a>
+<span class="sourceLineNo">272</span>      return true;<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    }<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    for (; io != null; io = io.getCause()) {<a name="line.274"></a>
+<span class="sourceLineNo">275</span>      if (io instanceof TableNotFoundException) {<a name="line.275"></a>
+<span class="sourceLineNo">276</span>        return true;<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      }<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    }<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    return false;<a name="line.279"></a>
+<span class="sourceLineNo">280</span>  }<a name="line.280"></a>
+<span class="sourceLineNo">281</span><a name="line.281"></a>
+<span class="sourceLineNo">282</span>  /**<a name="line.282"></a>
+<span class="sourceLineNo">283</span>   * Check if there's an {@link NoSuchColumnFamilyException} in the caused by stacktrace.<a name="line.283"></a>
+<span class="sourceLineNo">284</span>   */<a name="line.284"></a>
+<span class="sourceLineNo">285</span>  @VisibleForTesting<a name="line.285"></a>
+<span class="sourceLineNo">286</span>  public static boolean isNoSuchColumnFamilyException(Throwable io) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    if (io instanceof RemoteException) {<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      io = ((RemoteException) io).unwrapRemoteException();<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    if (io != null &amp;&amp; io.getMessage().contains("NoSuchColumnFamilyException")) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      return true;<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    }<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    for (; io != null; io = io.getCause()) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      if (io instanceof NoSuchColumnFamilyException) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        return true;<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      }<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    return false;<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  }<a name="line.299"></a>
+<span class="sourceLineNo">300</span><a name="line.300"></a>
+<span class="sourceLineNo">301</span>  @VisibleForTesting<a name="line.301"></a>
+<span class="sourceLineNo">302</span>  List&lt;List&lt;Entry&gt;&gt; filterNotExistTableEdits(final List&lt;List&lt;Entry&gt;&gt; oldEntryList) {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    List&lt;List&lt;Entry&gt;&gt; entryList = new ArrayList&lt;&gt;();<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    Map&lt;TableName, Boolean&gt; existMap = new HashMap&lt;&gt;();<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    try (Connection localConn = ConnectionFactory.createConnection(ctx.getLocalConfiguration());<a name="line.305"></a>
+<span class="sourceLineNo">306</span>         Admin localAdmin = localConn.getAdmin()) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      for (List&lt;Entry&gt; oldEntries : oldEntryList) {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        List&lt;Entry&gt; entries = new ArrayList&lt;&gt;();<a name="line.308"></a>
+<span class="sourceLineNo">309</span>        for (Entry e : oldEntries) {<a name="line.309"></a>
+<span class="sourceLineNo">310</span>          TableName tableName = e.getKey().getTableName();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>          boolean exist = true;<a name="line.311"></a>
+<span class="sourceLineNo">312</span>          if (existMap.containsKey(tableName)) {<a name="line.312"></a>
+<span class="sourceLineNo">313</span>            exist = existMap.get(tableName);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>          } else {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>            try {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>              exist = localAdmin.tableExists(tableName);<a name="line.316"></a>
+<span class="sourceLineNo">317</span>              existMap.put(tableName, exist);<a name="line.317"></a>
+<span class="sourceLineNo">318</span>            } catch (IOException iox) {<a name="line.318"></a>
+<span class="sourceLineNo">319</span>              LOG.warn("Exception checking for local table " + tableName, iox);<a name="line.319"></a>
+<span class="sourceLineNo">320</span>              // we can't drop edits without full assurance, so we assume table exists.<a name="line.320"></a>
+<span class="sourceLineNo">321</span>              exist = true;<a name="line.321"></a>
+<span class="sourceLineNo">322</span>            }<a name="line.322"></a>
+<span class="sourceLineNo">323</span>          }<a name="line.323"></a>
+<span class="sourceLineNo">324</span>          if (exist) {<a name="line.324"></a>
+<span class="sourceLineNo">325</span>            entries.add(e);<a name="line.325"></a>
+<span class="sourceLineNo">326</span>          } else {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>            // Would potentially be better to retry in one of the outer loops<a name="line.327"></a>
+<span class="sourceLineNo">328</span>            // and add a table filter there; but that would break the encapsulation,<a name="line.328"></a>
+<span class="sourceLineNo">329</span>            // so we're doing the filtering here.<a name="line.329"></a>
+<span class="sourceLineNo">330</span>            LOG.warn("Missing table detected at sink, local table also does not exist, "<a name="line.330"></a>
+<span class="sourceLineNo">331</span>                + "filtering edits for table '{}'", tableName);<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>        if (!entries.isEmpty()) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>          entryList.add(entries);<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>    } catch (IOException iox) {<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      LOG.warn("Exception when creating connection to check local table", iox);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>      return oldEntryList;<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    }<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    return entryList;<a name="line.342"></a>
+<span class="sourceLineNo">343</span>  }<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>  @VisibleForTesting<a name="line.345"></a>
+<span class="sourceLineNo">346</span>  List&lt;List&lt;Entry&gt;&gt; filterNotExistColumnFamilyEdits(final List&lt;List&lt;Entry&gt;&gt; oldEntryList) {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    List&lt;List&lt;Entry&gt;&gt; entryList = new ArrayList&lt;&gt;();<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    Map&lt;TableName, Set&lt;String&gt;&gt; existColumnFamilyMap = new HashMap&lt;&gt;();<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    try (Connection localConn = ConnectionFactory.createConnection(ctx.getLocalConfiguration());<a name="line.349"></a>
+<span class="sourceLineNo">350</span>         Admin localAdmin = localConn.getAdmin()) {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>      for (List&lt;Entry&gt; oldEntries : oldEntryList) {<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        List&lt;Entry&gt; entries = new ArrayList&lt;&gt;();<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        for (Entry e : oldEntries) {<a name="line.353"></a>
+<span class="sourceLineNo">354</span>          TableName tableName = e.getKey().getTableName();<a name="line.354"></a>
+<span class="sourceLineNo">355</span>          if (!existColumnFamilyMap.containsKey(tableName)) {<a name="line.355"></a>
+<span class="sourceLineNo">356</span>            try {<a name="line.356"></a>
+<span class="sourceLineNo">357</span>              Set&lt;String&gt; cfs = localAdmin.getDescriptor(tableName).getColumnFamilyNames().stream()<a name="line.357"></a>
+<span class="sourceLineNo">358</span>                  .map(Bytes::toString).collect(Collectors.toSet());<a name="line.358"></a>
+<span class="sourceLineNo">359</span>              existColumnFamilyMap.put(tableName, cfs);<a name="line.359"></a>
+<span class="sourceLineNo">360</span>            } catch (Exception ex) {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>              LOG.warn("Exception getting cf names for local table {}", tableName, ex);<a name="line.361"></a>
+<span class="sourceLineNo">362</span>              // if catch any exception, we are not sure about table's description,<a name="line.362"></a>
+<span class="sourceLineNo">363</span>              // so replicate raw entry<a name="line.363"></a>
+<span class="sourceLineNo">364</span>              entries.add(e);<a name="line.364"></a>
+<span class="sourceLineNo">365</span>              continue;<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>          Set&lt;String&gt; existColumnFamilies = existColumnFamilyMap.get(tableName);<a name="line.369"></a>
+<span class="sourceLineNo">370</span>          Set&lt;String&gt; missingCFs = new HashSet&lt;&gt;();<a name="line.370"></a>
+<span class="sourceLineNo">371</span>          WALEdit walEdit = new WALEdit();<a name="line.371"></a>
+<span class="sourceLineNo">372</span>          walEdit.getCells().addAll(e.getEdit().getCells());<a name="line.372"></a>
+<span class="sourceLineNo">373</span>          WALUtil.filterCells(walEdit, cell -&gt; {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>            String cf = Bytes.toString(CellUtil.cloneFamily(cell));<a name="line.374"></a>
+<span class="sourceLineNo">375</span>            if (existColumnFamilies.contains(cf)) {<a name="line.375"></a>
+<span class="sourceLineNo">376</span>              return cell;<a name="line.376"></a>
+<span class="sourceLineNo">377</span>            } else {<a name="line.377"></a>
+<span class="sourceLineNo">378</span>              missingCFs.add(cf);<a name="line.378"></a>
+<span class="sourceLineNo">379</span>              return null;<a name="line.379"></a>
+<span class="sourceLineNo">380</span>            }<a name="line.380"></a>
+<span class="sourceLineNo">381</span>          });<a name="line.381"></a>
+<span class="sourceLineNo">382</span>          if (!walEdit.isEmpty()) {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>            Entry newEntry = new Entry(e.getKey(), walEdit);<a name="line.383"></a>
+<span class="sourceLineNo">384</span>            entries.add(newEntry);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>          }<a name="line.385"></a>
+<span class="sourceLineNo">386</span><a name="line.386"></a>
+<span class="sourceLineNo">387</span>          if (!missingCFs.isEmpty()) {<a name="line.387"></a>
+<span class="sourceLineNo">388</span>            // Would potentially be better to retry in one of the outer loops<a name="line.388"></a>
+<span class="sourceLineNo">389</span>            // and add a table filter there; but that would break the encapsulation,<a name="line.389"></a>
+<span class="sourceLineNo">390</span>            // so we're doing the filtering here.<a name="line.390"></a>
+<span class="sourceLineNo">391</span>            LOG.warn(<a name="line.391"></a>
+<span class="sourceLineNo">392</span>                "Missing column family detected at sink, local column family also does not exist,"<a name="line.392"></a>
+<span class="sourceLineNo">393</span>                    + " filtering edits for table '{}',column family '{}'", tableName, missingCFs);<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>        if (!entries.isEmpty()) {<a name="line.396"></a>
+<span class="sourceLineNo">397</span>          entryList.add(entries);<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>    } catch (IOException iox) {<a name="line.400"></a>
+<span class="sourceLineNo">401</span>      LOG.warn("Exception when creating connection to check local table", iox);<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      return oldEntryList;<a name="line.402"></a>
+<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    return entryList;<a name="line.404"></a>
+<span class="sourceLineNo">405</span>  }<a name="line.405"></a>
+<span class="sourceLineNo">406</span><a name="line.406"></a>
+<span class="sourceLineNo">407</span>  private long parallelReplicate(CompletionService&lt;Integer&gt; pool, ReplicateContext replicateContext,<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      List&lt;List&lt;Entry&gt;&gt; batches) throws IOException {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    int futures = 0;<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    for (int i = 0; i &lt; batches.size(); i++) {<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      List&lt;Entry&gt; entries = batches.get(i);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      if (!entries.isEmpty()) {<a name="line.412"></a>
+<span class="sourceLineNo">413</span>        if (LOG.isTraceEnabled()) {<a name="line.413"></a>
+<span class="sourceLineNo">414</span>          LOG.trace("{} Submitting {} entries of total size {}", logPeerId(), entries.size(),<a name="line.414"></a>
+<span class="sourceLineNo">415</span>            replicateContext.getSize());<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        }<a name="line.416"></a>
+<span class="sourceLineNo">417</span>        // RuntimeExceptions encountered here bubble up and are handled in ReplicationSource<a name="line.417"></a>
+<span class="sourceLineNo">418</span>        pool.submit(createReplicator(entries, i, replicateContext.getTimeout()));<a name="line.418"></a>
+<span class="sourceLineNo">419</span>        futures++;<a name="line.419"></a>
+<span class="sourceLineNo">420</span>      }<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    }<a name="line.421"></a>
+<span class="sourceLineNo">422</span><a name="line.422"></a>
+<span class="sourceLineNo">423</span>    IOException iox = null;<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    long lastWriteTime = 0;<a name="line.424"></a>
+<span class="sourceLineNo">425</span>    for (int i = 0; i &lt; futures; i++) {<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      try {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>        // wait for all futures, remove successful parts<a name="line.427"></a>
+<span class="sourceLineNo">428</span>        // (only the remaining parts will be retried)<a name="line.428"></a>
+<span class="sourceLineNo">429</span>        Future&lt;Integer&gt; f = pool.take();<a name="line.429"></a>
+<span class="sourceLineNo">430</span>        int index = f.get();<a name="line.430"></a>
+<span class="sourceLineNo">431</span>        List&lt;Entry&gt; batch = batches.get(index);<a name="line.431"></a>
+<span class="sourceLineNo">432</span>        batches.set(index, Collections.emptyList()); // remove successful batch<a name="line.432"></a>
+<span class="sourceLineNo">433</span>        // Find the most recent write time in the batch<a name="line.433"></a>
+<span class="sourceLineNo">434</span>        long writeTime = batch.get(batch.size() - 1).getKey().getWriteTime();<a name="line.434"></a>
+<span class="sourceLineNo">435</span>        if (writeTime &gt; lastWriteTime) {<a name="line.435"></a>
+<span class="sourceLineNo">436</span>          lastWriteTime = writeTime;<a name="line.436"></a>
+<span class="sourceLineNo">437</span>        }<a name="line.437"></a>
+<span class="sourceLineNo">438</span>      } catch (InterruptedException ie) {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>        iox = new IOException(ie);<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      } catch (ExecutionException ee) {<a name="line.440"></a>
+<span class="sourceLineNo">441</span>        iox = ee.getCause() instanceof IOException?<a name="line.441"></a>
+<span class="sourceLineNo">442</span>          (IOException)ee.getCause(): new IOException(ee.getCause());<a name="line.442"></a>
+<span class="sourceLineNo">443</span>      }<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    }<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    if (iox != null) {<a name="line.445"></a>
+<span class="sourceLineNo">446</span>      // if we had any exceptions, try again<a name="line.446"></a>
+<span class="sourceLineNo">447</span>      throw iox;<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    }<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    return lastWriteTime;<a name="line.449"></a>
+<span class="sourceLineNo">450</span>  }<a name="line.450"></a>
+<span class="sourceLineNo">451</span><a name="line.451"></a>
+<span class="sourceLineNo">452</span>  /**<a name="line.452"></a>
+<span class="sourceLineNo">453</span>   * Do the shipping logic<a name="line.453"></a>
+<span class="sourceLineNo">454</span>   */<a name="line.454"></a>
+<span class="sourceLineNo">455</span>  @Override<a name="line.455"></a>
+<span class="sourceLineNo">456</span>  public boolean replicate(ReplicateContext replicateContext) {<a name="line.456"></a>
+<span class="sourceLineNo">457</span>    CompletionService&lt;Integer&gt; pool = new ExecutorCompletionService&lt;&gt;(this.exec);<a name="line.457"></a>
+<span class="sourceLineNo">458</span>    int sleepMultiplier = 1;<a name="line.458"></a>
+<span class="sourceLineNo">459</span><a name="line.459"></a>
+<span class="sourceLineNo">460</span>    if (!peersSelected &amp;&amp; this.isRunning()) {<a name="line.460"></a>
+<span class="sourceLineNo">461</span>      connectToPeers();<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      peersSelected = true;<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    }<a name="line.463"></a>
+<span class="sourceLineNo">464</span><a name="line.464"></a>
+<span class="sourceLineNo">465</span>    int numSinks = getNumSinks();<a name="line.465"></a>
+<span class="sourceLineNo">466</span>    if (numSinks == 0) {<a name="line.466"></a>
+<span class="sourceLineNo">467</span>      if((System.currentTimeMillis() - lastSinkFetchTime) &gt;= (maxRetriesMultiplier*1000)) {<a name="line.467"></a>
+<span class="sourceLineNo">468</span>        LOG.warn(<a name="line.468"></a>
+<span class="sourceLineNo">469</span>          "No replication sinks found, returning without replicating. "<a name="line.469"></a>
+<span class="sourceLineNo">470</span>            + "The source should retry with the same set of edits. Not logging this again for "<a name="line.470"></a>
+<span class="sourceLineNo">471</span>            + "the next {} seconds.", maxRetriesMultiplier);<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        lastSinkFetchTime = System.currentTimeMillis();<a name="line.472"></a>
+<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      sleepForRetries("No sinks available at peer", sleepMultiplier);<a name="line.474"></a>
+<span class="sourceLineNo">475</span>      return false;<a name="line.475"></a>
+<span class="sourceLineNo">476</span>    }<a name="line.476"></a>
+<span class="sourceLineNo">477</span><a name="line.477"></a>
+<span class="sourceLineNo">478</span>    List&lt;List&lt;Entry&gt;&gt; batches = createBatches(replicateContext.getEntries());<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    while (this.isRunning() &amp;&amp; !exec.isShutdown()) {<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      if (!isPeerEnabled()) {<a name="line.480"></a>
+<span class="sourceLineNo">481</span>        if (sleepForRetries("Replication is disabled", sleepMultiplier)) {<a name="line.481"></a>
+<span class="sourceLineNo">482</span>          sleepMultiplier++;<a name="line.482"></a>
+<span class="sourceLineNo">483</span>        }<a name="line.483"></a>
+<span class="sourceLineNo">484</span>        continue;<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      }<a name="line.485"></a>
+<span class="sourceLineNo">486</span>      try {<a name="line.486"></a>
+<span class="sourceLineNo">487</span>        // replicate the batches to sink side.<a name="line.487"></a>
+<span class="sourceLineNo">488</span>        parallelReplicate(pool, replicateContext, batches);<a name="line.488"></a>
+<span class="sourceLineNo">489</span>        return true;<a name="line.489"></a>
+<span class="sourceLineNo">490</span>      } catch (IOException ioe) {<a name="line.490"></a>
+<span class="sourceLineNo">491</span>        if (ioe instanceof RemoteException) {<a name="line.491"></a>
+<span class="sourceLineNo">492</span>          if (dropOnDeletedTables &amp;&amp; isTableNotFoundException(ioe)) {<a name="line.492"></a>
+<span class="sourceLineNo">493</span>            // Only filter the edits to replicate and don't change the entries in replicateContext<a name="line.493"></a>
+<span class="sourceLineNo">494</span>            // as the upper layer rely on it.<a name="line.494"></a>
+<span class="sourceLineNo">495</span>            batches = filterNotExistTableEdits(batches);<a name="line.495"></a>
+<span class="sourceLineNo">496</span>            if (batches.isEmpty()) {<a name="line.496"></a>
+<span class="sourceLineNo">497</span>              LOG.warn("After filter not exist table's edits, 0 edits to replicate, just return");<a name="line.497"></a>
+<span class="sourceLineNo">498</span>              return true;<a name="line.498"></a>
+<span class="sourceLineNo">499</span>            }<a name="line.499"></a>
+<span class="sourceLineNo">500</span>          } else if (dropOnDeletedColumnFamilies &amp;&amp; isNoSuchColumnFamilyException(ioe)) {<a name="line.500"></a>
+<span class="sourceLineNo">501</span>            batches = filterNotExistColumnFamilyEdits(batches);<a name="line.501"></a>
+<span class="sourceLineNo">502</span>            if (batches.isEmpty()) {<a name="line.502"></a>
+<span class="sourceLineNo">503</span>              LOG.warn("After filter not exist column family's edits, 0 edits to replicate, " +<a name="line.503"></a>
+<span class="sourceLineNo">504</span>                  "just return");<a name="line.504"></a>
+<span class="sourceLineNo">505</span>              return true;<a name="line.505"></a>
+<span class="sourceLineNo">506</span>            }<a name="line.506"></a>
+<span class="sourceLineNo">507</span>          } else {<a name="line.507"></a>
+<span class="sourceLineNo">508</span>            LOG.warn("{} Peer encountered RemoteException, rechecking all sinks: ", logPeerId(),<a name="line.508"></a>
+<span class="sourceLineNo">509</span>                ioe);<a name="line.509"></a>
+<span class="sourceLineNo">510</span>            chooseSinks();<a name="line.510"></a>
+<span class="sourceLineNo">511</span>          }<a name="line.511"></a>
+<span class="sourceLineNo">512</span>        } else {<a name="line.512"></a>
+<span class="sourceLineNo">513</span>          if (ioe instanceof SocketTimeoutException) {<a name="line.513"></a>
+<span class="sourceLineNo">514</span>            // This exception means we waited for more than 60s and nothing<a name="line.514"></a>
+<span class="sourceLineNo">515</span>            // happened, the cluster is alive and calling it right away<a name="line.515"></a>
+<span class="sourceLineNo">516</span>            // even for a test just makes things worse.<a name="line.516"></a>
+<span class="sourceLineNo">517</span>            sleepForRetries("Encountered a SocketTimeoutException. Since the " +<a name="line.517"></a>
+<span class="sourceLineNo">518</span>                  "call to the remote cluster timed out, which is usually " +<a name="line.518"></a>
+<span class="sourceLineNo">519</span>                  "caused by a machine failure or a massive slowdown",<a name="line.519"></a>
+<span class="sourceLineNo">520</span>              this.socketTimeoutMultiplier);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>          } else if (ioe instanceof ConnectException || ioe instanceof UnknownHostException) {<a name="line.521"></a>
+<span class="sourceLineNo">522</span>            LOG.warn("{} Peer is unavailable, rechecking all sinks: ", logPeerId(), ioe);<a name="line.522"></a>
+<span class="sourceLineNo">523</span>            chooseSinks();<a name="line.523"></a>
+<span class="sourceLineNo">524</span>          } else {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>            LOG.warn("{} Can't replicate because of a local or network error: ", logPeerId(), ioe);<a name="line.525"></a>
+<span class="sourceLineNo">526</span>          }<a name="line.526"></a>
+<span class="sourceLineNo">527</span>        }<a name="line.527"></a>
+<span class="sourceLineNo">528</span>        if (sleepForRetries("Since we are unable to replicate", sleepMultiplier)) {<a name="line.528"></a>
+<span class="sourceLineNo">529</span>          sleepMultiplier++;<a name="line.529"></a>
+<span class="sourceLineNo">530</span>        }<a name="line.530"></a>
+<span class="sourceLineNo">531</span>      }<a name="line.531"></a>
+<span class="sourceLineNo">532</span>    }<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    return false; // in case we exited before replicating<a name="line.533"></a>
+<span class="sourceLineNo">534</span>  }<a name="line.534"></a>
+<span class="sourceLineNo">535</span><a name="line.535"></a>
+<span class="sourceLineNo">536</span>  protected boolean isPeerEnabled() {<a name="line.536"></a>
+<span class="sourceLineNo">537</span>    return ctx.getReplicationPeer().isPeerEnabled();<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>  @Override<a name="line.540"></a>
+<span class="sourceLineNo">541</span>  protected void doStop() {<a name="line.541"></a>
+<span class="sourceLineNo">542</span>    disconnect(); // don't call super.doStop()<a name="line.542"></a>
+<span class="sourceLineNo">543</span>    // Allow currently running replication tasks to finish<a name="line.543"></a>
+<span class="sourceLineNo">544</span>    exec.shutdown();<a name="line.544"></a>
+<span class="sourceLineNo">545</span>    try {<a name="line.545"></a>
+<span class="sourceLineNo">546</span>      exec.awaitTermination(maxTerminationWait, TimeUnit.MILLISECONDS);<a name="line.546"></a>
+<span class="sourceLineNo">547</span>    } catch (InterruptedException e) {<a name="line.547"></a>
+<span class="sourceLineNo">548</span>    }<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    // Abort if the tasks did not terminate in time<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    if (!exec.isTerminated()) {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      String errMsg = "HBaseInterClusterReplicationEndpoint termination failed. The " +<a name="line.551"></a>
+<span class="sourceLineNo">552</span>          "ThreadPoolExecutor failed to finish all tasks within " + maxTerminationWait + "ms. " +<a name="line.552"></a>
+<span class="sourceLineNo">553</span>          "Aborting to prevent Replication from deadlocking. See HBASE-16081.";<a name="line.553"></a>
+<span class="sourceLineNo">554</span>      abortable.abort(errMsg, new IOException(errMsg));<a name="line.554"></a>
+<span class="sourceLineNo">555</span>    }<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    notifyStopped();<a name="line.556"></a>
+<span class="sourceLineNo">557</span>  }<a name="line.557"></a>
+<span class="sourceLineNo">558</span><a name="line.558"></a>
+<span class="sourceLineNo">559</span>  @VisibleForTesting<a name="line.559"></a>
+<span class="sourceLineNo">560</span>  protected int replicateEntries(List&lt;Entry&gt; entries, int batchIndex, int timeout)<a name="line.560"></a>
+<span class="sourceLineNo">561</span>      throws IOException {<a name="line.561"></a>
+<span class="sourceLineNo">562</span>    SinkPeer sinkPeer = null;<a name="line.562"></a>
+<span class="sourceLineNo">563</span>    try {<a name="line.563"></a>
+<span class="sourceLineNo">564</span>      int entriesHashCode = System.identityHashCode(entries);<a name="line.564"></a>
+<span class="sourceLineNo">565</span>      if (LOG.isTraceEnabled()) {<a name="line.565"></a>
+<span class="sourceLineNo">566</span>        long size = entries.stream().mapToLong(this::getEstimatedEntrySize).sum();<a name="line.566"></a>
+<span class="sourceLineNo">567</span>        LOG.trace("{} Replicating batch {} of {} entries with total size {} bytes to {}",<a name="line.567"></a>
+<span class="sourceLineNo">568</span>          logPeerId(), entriesHashCode, entries.size(), size, replicationClusterId);<a name="line.568"></a>
+<span class="sourceLineNo">569</span>      }<a name="line.569"></a>
+<span class="sourceLineNo">570</span>      sinkPeer = getReplicationSink();<a name="line.570"></a>
+<span class="sourceLineNo">571</span>      AsyncRegionServerAdmin rsAdmin = sinkPeer.getRegionServer();<a name="line.571"></a>
+<span class="sourceLineNo">572</span>      try {<a name="line.572"></a>
+<span class="sourceLineNo">573</span>        ReplicationProtobufUtil.replicateWALEntry(rsAdmin,<a name="line.573"></a>
+<span class="sourceLineNo">574</span>          entries.toArray(new Entry[entries.size()]), replicationClusterId, baseNamespaceDir,<a name="line.574"></a>
+<span class="sourceLineNo">575</span>          hfileArchiveDir, timeout);<a name="line.575"></a>
+<span class="sourceLineNo">576</span>        if (LOG.isTraceEnabled()) {<a name="line.576"></a>
+<span class="sourceLineNo">577</span>          LOG.trace("{} Completed replicating batch {}", logPeerId(), entriesHashCode);<a name="line.577"></a>
+<span class="sourceLineNo">578</span>        }<a name="line.578"></a>
+<span class="sourceLineNo">579</span>      } catch (IOException e) {<a name="line.579"></a>
+<span class="sourceLineNo">580</span>        if (LOG.isTraceEnabled()) {<a name="line.580"></a>
+<span class="sourceLineNo">581</span>          LOG.trace("{} Failed replicating batch {}", logPeerId(), entriesHashCode, e);<a name="line.581"></a>
+<span class="sourceLineNo">582</span>        }<a name="line.582"></a>
+<span class="sourceLineNo">583</span>        throw e;<a name="line.583"></a>
+<span class="sourceLineNo">584</span>      }<a name="line.584"></a>
+<span class="sourceLineNo">585</span>      reportSinkSuccess(sinkPeer);<a name="line.585"></a>
+<span class="sourceLineNo">586</span>    } catch (IOException ioe) {<a name="line.586"></a>
+<span class="sourceLineNo">587</span>      if (sinkPeer != null) {<a name="line.587"></a>
+<span class="sourceLineNo">588</span>        reportBadSink(sinkPeer);<a name="line.588"></a>
+<span class="sourceLineNo">589</span>      }<a name="line.589"></a>
+<span class="sourceLineNo">590</span>      throw ioe;<a name="line.590"></a>
+<span class="sourceLineNo">591</span>    }<a name="line.591"></a>
+<span class="sourceLineNo">592</span>    return batchIndex;<a name="line.592"></a>
+<span class="sourceLineNo">593</span>  }<a name="line.593"></a>
+<span class="sourceLineNo">594</span><a name="line.594"></a>
+<span class="sourceLineNo">595</span>  private int serialReplicateRegionEntries(List&lt;Entry&gt; entries, int batchIndex, int timeout)<a name="line.595"></a>
+<span class="sourceLineNo">596</span>      throws IOException {<a name="line.596"></a>
+<span class="sourceLineNo">597</span>    int batchSize = 0, index = 0;<a name="line.597"></a>
+<span class="sourceLineNo">598</span>    List&lt;Entry&gt; batch = new ArrayList&lt;&gt;();<a name="line.598"></a>
+<span class="sourceLineNo">599</span>    for (Entry entry : entries) {<a name="line.599"></a>
+<span class="sourceLineNo">600</span>      int entrySize = getEstimatedEntrySize(entry);<a name="line.600"></a>
+<span class="sourceLineNo">601</span>      if (batchSize &gt; 0 &amp;&amp; batchSize + entrySize &gt; replicationRpcLimit) {<a name="line.601"></a>
+<span class="sourceLineNo">602</span>        replicateEntries(batch, index++, timeout);<a name="line.602"></a>
+<span class="sourceLineNo">603</span>        batch.clear();<a name="line.603"></a>
+<span class="sourceLineNo">604</span>        batchSize = 0;<a name="line.604"></a>
+<span class="sourceLineNo">605</span>      }<a name="line.605"></a>
+<span class="sourceLineNo">606</span>      batch.add(entry);<a name="line.606"></a>
+<span class="sourceLineNo">607</span>      batchSize += entrySize;<a name="line.607"></a>
+<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
+<span class="sourceLineNo">609</span>    if (batchSize &gt; 0) {<a name="line.609"></a>
+<span class="sourceLineNo">610</span>      replicateEntries(batch, index, timeout);<a name="line.610"></a>
+<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
+<span class="sourceLineNo">612</span>    return batchIndex;<a name="line.612"></a>
+<span class="sourceLineNo">613</span>  }<a name="line.613"></a>
+<span class="sourceLineNo">614</span><a name="line.614"></a>
+<span class="sourceLineNo">615</span>  @VisibleForTesting<a name="line.615"></a>
+<span class="sourceLineNo">616</span>  protected Callable&lt;Integer&gt; createReplicator(List&lt;Entry&gt; entries, int batchIndex, int timeout) {<a name="line.616"></a>
+<span class="sourceLineNo">617</span>    return isSerial ? () -&gt; serialReplicateRegionEntries(entries, batchIndex, timeout)<a name="line.617"></a>
+<span class="sourceLineNo">618</span>        : () -&gt; replicateEntries(entries, batchIndex, timeout);<a name="line.618"></a>
+<span class="sourceLineNo">619</span>  }<a name="line.619"></a>
+<span class="sourceLineNo">620</span><a name="line.620"></a>
+<span class="sourceLineNo">621</span>  private String logPeerId(){<a name="line.621"></a>
+<span class="sourceLineNo">622</span>    return "[Source for peer " + this.ctx.getPeerId() + "]:";<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>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSource.html b/devapidocs/src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSource.html
index ebd34cb..a0d7a84 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSource.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSource.html
@@ -699,29 +699,29 @@
 <span class="sourceLineNo">691</span>      }<a name="line.691"></a>
 <span class="sourceLineNo">692</span>    }<a name="line.692"></a>
 <span class="sourceLineNo">693</span><a name="line.693"></a>
-<span class="sourceLineNo">694</span>    for (ReplicationSourceShipper worker : workers) {<a name="line.694"></a>
-<span class="sourceLineNo">695</span>      if (worker.isAlive() || worker.entryReader.isAlive()) {<a name="line.695"></a>
-<span class="sourceLineNo">696</span>        try {<a name="line.696"></a>
-<span class="sourceLineNo">697</span>          // Wait worker to stop<a name="line.697"></a>
-<span class="sourceLineNo">698</span>          Thread.sleep(this.sleepForRetries);<a name="line.698"></a>
-<span class="sourceLineNo">699</span>        } catch (InterruptedException e) {<a name="line.699"></a>
-<span class="sourceLineNo">700</span>          LOG.info("{} Interrupted while waiting {} to stop", logPeerId(), worker.getName());<a name="line.700"></a>
-<span class="sourceLineNo">701</span>          Thread.currentThread().interrupt();<a name="line.701"></a>
-<span class="sourceLineNo">702</span>        }<a name="line.702"></a>
-<span class="sourceLineNo">703</span>        // If worker still is alive after waiting, interrupt it<a name="line.703"></a>
-<span class="sourceLineNo">704</span>        if (worker.isAlive()) {<a name="line.704"></a>
-<span class="sourceLineNo">705</span>          worker.interrupt();<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        }<a name="line.706"></a>
-<span class="sourceLineNo">707</span>        // If entry reader is alive after waiting, interrupt it<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        if (worker.entryReader.isAlive()) {<a name="line.708"></a>
-<span class="sourceLineNo">709</span>          worker.entryReader.interrupt();<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        }<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      }<a name="line.711"></a>
-<span class="sourceLineNo">712</span>    }<a name="line.712"></a>
-<span class="sourceLineNo">713</span><a name="line.713"></a>
-<span class="sourceLineNo">714</span>    if (this.replicationEndpoint != null) {<a name="line.714"></a>
-<span class="sourceLineNo">715</span>      this.replicationEndpoint.stop();<a name="line.715"></a>
-<span class="sourceLineNo">716</span>    }<a name="line.716"></a>
+<span class="sourceLineNo">694</span>    if (this.replicationEndpoint != null) {<a name="line.694"></a>
+<span class="sourceLineNo">695</span>      this.replicationEndpoint.stop();<a name="line.695"></a>
+<span class="sourceLineNo">696</span>    }<a name="line.696"></a>
+<span class="sourceLineNo">697</span>    for (ReplicationSourceShipper worker : workers) {<a name="line.697"></a>
+<span class="sourceLineNo">698</span>      if (worker.isAlive() || worker.entryReader.isAlive()) {<a name="line.698"></a>
+<span class="sourceLineNo">699</span>        try {<a name="line.699"></a>
+<span class="sourceLineNo">700</span>          // Wait worker to stop<a name="line.700"></a>
+<span class="sourceLineNo">701</span>          Thread.sleep(this.sleepForRetries);<a name="line.701"></a>
+<span class="sourceLineNo">702</span>        } catch (InterruptedException e) {<a name="line.702"></a>
+<span class="sourceLineNo">703</span>          LOG.info("{} Interrupted while waiting {} to stop", logPeerId(), worker.getName());<a name="line.703"></a>
+<span class="sourceLineNo">704</span>          Thread.currentThread().interrupt();<a name="line.704"></a>
+<span class="sourceLineNo">705</span>        }<a name="line.705"></a>
+<span class="sourceLineNo">706</span>        // If worker still is alive after waiting, interrupt it<a name="line.706"></a>
+<span class="sourceLineNo">707</span>        if (worker.isAlive()) {<a name="line.707"></a>
+<span class="sourceLineNo">708</span>          worker.interrupt();<a name="line.708"></a>
+<span class="sourceLineNo">709</span>        }<a name="line.709"></a>
+<span class="sourceLineNo">710</span>        // If entry reader is alive after waiting, interrupt it<a name="line.710"></a>
+<span class="sourceLineNo">711</span>        if (worker.entryReader.isAlive()) {<a name="line.711"></a>
+<span class="sourceLineNo">712</span>          worker.entryReader.interrupt();<a name="line.712"></a>
+<span class="sourceLineNo">713</span>        }<a name="line.713"></a>
+<span class="sourceLineNo">714</span>      }<a name="line.714"></a>
+<span class="sourceLineNo">715</span>    }<a name="line.715"></a>
+<span class="sourceLineNo">716</span><a name="line.716"></a>
 <span class="sourceLineNo">717</span>    if (join) {<a name="line.717"></a>
 <span class="sourceLineNo">718</span>      for (ReplicationSourceShipper worker : workers) {<a name="line.718"></a>
 <span class="sourceLineNo">719</span>        Threads.shutdown(worker, this.sleepForRetries);<a name="line.719"></a>
diff --git a/downloads.html b/downloads.html
index e7fd6e2..01849a0 100644
--- a/downloads.html
+++ b/downloads.html
@@ -433,7 +433,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-13</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-14</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 b35d67e..9e66fe0 100644
--- a/export_control.html
+++ b/export_control.html
@@ -197,7 +197,7 @@ for more details.</p>
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-13</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-14</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 c34450e..a20d586 100644
--- a/index.html
+++ b/index.html
@@ -275,7 +275,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-13</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-14</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/issue-tracking.html b/issue-tracking.html
index 8ff61d0..cb31b95 100644
--- a/issue-tracking.html
+++ b/issue-tracking.html
@@ -169,7 +169,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-13</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-14</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/mail-lists.html b/mail-lists.html
index 12cd217..afcb171 100644
--- a/mail-lists.html
+++ b/mail-lists.html
@@ -229,7 +229,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-13</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-14</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 aa20d1e..521da41 100644
--- a/metrics.html
+++ b/metrics.html
@@ -325,7 +325,7 @@ export HBASE_REGIONSERVER_OPTS=&quot;$HBASE_JMX_OPTS -Dcom.sun.management.jmxrem
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-13</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-14</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 d99edc7..ecd9602 100644
--- a/old_news.html
+++ b/old_news.html
@@ -316,7 +316,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-13</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-14</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 d64ab96..0f7e54f 100644
--- a/plugin-management.html
+++ b/plugin-management.html
@@ -321,7 +321,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-13</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-14</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 c1336ea..e90a3ad 100644
--- a/plugins.html
+++ b/plugins.html
@@ -248,7 +248,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-13</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-14</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 f035e7a..d1ac317 100644
--- a/poweredbyhbase.html
+++ b/poweredbyhbase.html
@@ -650,7 +650,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-13</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-14</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 0f344bc..898baf5 100644
--- a/project-info.html
+++ b/project-info.html
@@ -210,7 +210,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-13</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-14</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 0d2ae5c..f03cb96 100644
--- a/project-reports.html
+++ b/project-reports.html
@@ -186,7 +186,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-13</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-14</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/project-summary.html b/project-summary.html
index 35357e6..e21b558 100644
--- a/project-summary.html
+++ b/project-summary.html
@@ -212,7 +212,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-13</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-14</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 69c7816..63b1fcd 100644
--- a/pseudo-distributed.html
+++ b/pseudo-distributed.html
@@ -174,7 +174,7 @@ Running Apache HBase (TM) in pseudo-distributed mode
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-13</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-14</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 6411f40..ba34d07 100644
--- a/replication.html
+++ b/replication.html
@@ -169,7 +169,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-13</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-14</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 bc9bb28..68c7014 100644
--- a/resources.html
+++ b/resources.html
@@ -197,7 +197,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-13</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-14</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/source-repository.html b/source-repository.html
index 3b6923d..1a97ce0 100644
--- a/source-repository.html
+++ b/source-repository.html
@@ -180,7 +180,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-13</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-14</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 f2bc495..3901f39 100644
--- a/sponsors.html
+++ b/sponsors.html
@@ -199,7 +199,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-13</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-14</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 0fee259..0983a0f 100644
--- a/supportingprojects.html
+++ b/supportingprojects.html
@@ -390,7 +390,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-13</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-14</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/team-list.html b/team-list.html
index 46bdf1f..e445dee 100644
--- a/team-list.html
+++ b/team-list.html
@@ -707,7 +707,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-13</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-10-14</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/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.InterClusterReplicationEndpointForTest.html b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.InterClusterReplicationEndpointForTest.html
index b271957..a9f7784 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.InterClusterReplicationEndpointForTest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.InterClusterReplicationEndpointForTest.html
@@ -263,7 +263,7 @@ extends org.apache.hadoop.hbase.replication.regionserver.HBaseInterClusterReplic
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.replication.regionserver.HBaseInterClusterReplicationEndpoint</h3>
-<code>doStop, init, isNoSuchColumnFamilyException, isPeerEnabled, isTableNotFoundException, replicateEntries, sleepForRetries</code></li>
+<code>doStop, init, isNoSuchColumnFamilyException, isPeerEnabled, isTableNotFoundException, replicateEntries</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.replication.HBaseReplicationEndpoint">
diff --git a/testdevapidocs/org/apache/hadoop/hbase/replication/regionserver/TestReplicationSource.DoNothingReplicationEndpoint.html b/testdevapidocs/org/apache/hadoop/hbase/replication/regionserver/TestReplicationSource.DoNothingReplicationEndpoint.html
index a9a4681..5529a5a 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/replication/regionserver/TestReplicationSource.DoNothingReplicationEndpoint.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/replication/regionserver/TestReplicationSource.DoNothingReplicationEndpoint.html
@@ -278,7 +278,7 @@ extends org.apache.hadoop.hbase.replication.regionserver.HBaseInterClusterReplic
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.replication.regionserver.HBaseInterClusterReplicationEndpoint</h3>
-<code>createReplicator, filterNotExistColumnFamilyEdits, filterNotExistTableEdits, isNoSuchColumnFamilyException, isPeerEnabled, isTableNotFoundException, replicate, replicateEntries, sleepForRetries</code></li>
+<code>createReplicator, filterNotExistColumnFamilyEdits, filterNotExistTableEdits, isNoSuchColumnFamilyException, isPeerEnabled, isTableNotFoundException, replicate, replicateEntries</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.replication.HBaseReplicationEndpoint">
diff --git a/testdevapidocs/org/apache/hadoop/hbase/replication/regionserver/TestReplicationSource.FaultyReplicationEndpoint.html b/testdevapidocs/org/apache/hadoop/hbase/replication/regionserver/TestReplicationSource.FaultyReplicationEndpoint.html
index de179c6..aa755c0 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/replication/regionserver/TestReplicationSource.FaultyReplicationEndpoint.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/replication/regionserver/TestReplicationSource.FaultyReplicationEndpoint.html
@@ -265,7 +265,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/replication/regionser
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.replication.regionserver.HBaseInterClusterReplicationEndpoint</h3>
-<code>createReplicator, filterNotExistColumnFamilyEdits, filterNotExistTableEdits, isNoSuchColumnFamilyException, isPeerEnabled, isTableNotFoundException, replicate, replicateEntries, sleepForRetries</code></li>
+<code>createReplicator, filterNotExistColumnFamilyEdits, filterNotExistTableEdits, isNoSuchColumnFamilyException, isPeerEnabled, isTableNotFoundException, replicate, replicateEntries</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.replication.HBaseReplicationEndpoint">
diff --git a/testdevapidocs/org/apache/hadoop/hbase/replication/regionserver/TestReplicationSource.FlakyReplicationEndpoint.html b/testdevapidocs/org/apache/hadoop/hbase/replication/regionserver/TestReplicationSource.FlakyReplicationEndpoint.html
index 18e91ec..6b44ec3 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/replication/regionserver/TestReplicationSource.FlakyReplicationEndpoint.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/replication/regionserver/TestReplicationSource.FlakyReplicationEndpoint.html
@@ -266,7 +266,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/replication/regionser
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.replication.regionserver.HBaseInterClusterReplicationEndpoint</h3>
-<code>createReplicator, filterNotExistColumnFamilyEdits, filterNotExistTableEdits, isNoSuchColumnFamilyException, isPeerEnabled, isTableNotFoundException, replicate, replicateEntries, sleepForRetries</code></li>
+<code>createReplicator, filterNotExistColumnFamilyEdits, filterNotExistTableEdits, isNoSuchColumnFamilyException, isPeerEnabled, isTableNotFoundException, replicate, replicateEntries</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.replication.HBaseReplicationEndpoint">
diff --git a/testdevapidocs/org/apache/hadoop/hbase/replication/regionserver/TestReplicator.FailureInjectingReplicationEndpointForTest.html b/testdevapidocs/org/apache/hadoop/hbase/replication/regionserver/TestReplicator.FailureInjectingReplicationEndpointForTest.html
index 3bd8552..dc935d5 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/replication/regionserver/TestReplicator.FailureInjectingReplicationEndpointForTest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/replication/regionserver/TestReplicator.FailureInjectingReplicationEndpointForTest.html
@@ -274,7 +274,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/replication/regionser
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.replication.regionserver.HBaseInterClusterReplicationEndpoint</h3>
-<code>doStop, filterNotExistColumnFamilyEdits, filterNotExistTableEdits, init, isNoSuchColumnFamilyException, isPeerEnabled, isTableNotFoundException, replicateEntries, sleepForRetries</code></li>
+<code>doStop, filterNotExistColumnFamilyEdits, filterNotExistTableEdits, init, isNoSuchColumnFamilyException, isPeerEnabled, isTableNotFoundException, replicateEntries</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.replication.HBaseReplicationEndpoint">
diff --git a/testdevapidocs/org/apache/hadoop/hbase/replication/regionserver/TestReplicator.ReplicationEndpointForTest.html b/testdevapidocs/org/apache/hadoop/hbase/replication/regionserver/TestReplicator.ReplicationEndpointForTest.html
index 900e6fa..4eb4184 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/replication/regionserver/TestReplicator.ReplicationEndpointForTest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/replication/regionserver/TestReplicator.ReplicationEndpointForTest.html
@@ -303,7 +303,7 @@ extends org.apache.hadoop.hbase.replication.regionserver.HBaseInterClusterReplic
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.replication.regionserver.HBaseInterClusterReplicationEndpoint</h3>
-<code>doStop, filterNotExistColumnFamilyEdits, filterNotExistTableEdits, init, isNoSuchColumnFamilyException, isPeerEnabled, isTableNotFoundException, replicateEntries, sleepForRetries</code></li>
+<code>doStop, filterNotExistColumnFamilyEdits, filterNotExistTableEdits, init, isNoSuchColumnFamilyException, isPeerEnabled, isTableNotFoundException, replicateEntries</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.replication.HBaseReplicationEndpoint">
diff --git a/testdevapidocs/org/apache/hadoop/hbase/replication/regionserver/TestSerialReplicationEndpoint.TestEndpoint.html b/testdevapidocs/org/apache/hadoop/hbase/replication/regionserver/TestSerialReplicationEndpoint.TestEndpoint.html
index f550915..f869158 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/replication/regionserver/TestSerialReplicationEndpoint.TestEndpoint.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/replication/regionserver/TestSerialReplicationEndpoint.TestEndpoint.html
@@ -271,7 +271,7 @@ extends org.apache.hadoop.hbase.replication.regionserver.HBaseInterClusterReplic
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.replication.regionserver.HBaseInterClusterReplicationEndpoint</h3>
-<code>doStop, filterNotExistColumnFamilyEdits, filterNotExistTableEdits, init, isNoSuchColumnFamilyException, isPeerEnabled, isTableNotFoundException, replicate, replicateEntries, sleepForRetries</code></li>
+<code>doStop, filterNotExistColumnFamilyEdits, filterNotExistTableEdits, init, isNoSuchColumnFamilyException, isPeerEnabled, isTableNotFoundException, replicate, replicateEntries</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.replication.HBaseReplicationEndpoint">