You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by gi...@apache.org on 2019/05/11 14:50:13 UTC

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

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 3812b0d  Published site at df278209588a8bf08b46f28d99a6fa903a0c825d.
3812b0d is described below

commit 3812b0d80c8947e4f1c725dda24b27959f9182e3
Author: jenkins <bu...@apache.org>
AuthorDate: Sat May 11 14:49:49 2019 +0000

    Published site at df278209588a8bf08b46f28d99a6fa903a0c825d.
---
 acid-semantics.html                                |   2 +-
 apache_hbase_reference_guide.pdf                   |   4 +-
 book.html                                          |   2 +-
 bulk-loads.html                                    |   2 +-
 checkstyle-aggregate.html                          |  24 +-
 checkstyle.rss                                     |   4 +-
 coc.html                                           |   2 +-
 dependencies.html                                  |   2 +-
 dependency-convergence.html                        |   2 +-
 dependency-info.html                               |   2 +-
 dependency-management.html                         |   2 +-
 devapidocs/constant-values.html                    |   4 +-
 devapidocs/index-all.html                          |   4 +
 .../apache/hadoop/hbase/backup/package-tree.html   |   2 +-
 .../hadoop/hbase/class-use/RegionLocations.html    |   9 +-
 .../hbase/client/ZKAsyncRegistry.Converter.html    |   4 +-
 .../hadoop/hbase/client/ZKAsyncRegistry.html       |  57 +-
 .../apache/hadoop/hbase/client/package-tree.html   |  24 +-
 .../hadoop/hbase/coprocessor/package-tree.html     |   2 +-
 .../apache/hadoop/hbase/filter/package-tree.html   |   6 +-
 .../org/apache/hadoop/hbase/http/package-tree.html |   2 +-
 .../apache/hadoop/hbase/io/hfile/package-tree.html |   6 +-
 .../org/apache/hadoop/hbase/ipc/package-tree.html  |   2 +-
 .../hadoop/hbase/mapreduce/package-tree.html       |   4 +-
 .../ServerManager.FlushedSequenceIdFlusher.html    |   6 +-
 .../apache/hadoop/hbase/master/ServerManager.html  |   2 +-
 .../hbase/master/assignment/package-tree.html      |   2 +-
 .../hadoop/hbase/master/balancer/package-tree.html |   2 +-
 .../apache/hadoop/hbase/master/package-tree.html   |   4 +-
 .../hbase/master/procedure/package-tree.html       |   2 +-
 .../org/apache/hadoop/hbase/package-tree.html      |  18 +-
 .../hadoop/hbase/procedure2/package-tree.html      |   6 +-
 .../apache/hadoop/hbase/quotas/package-tree.html   |   4 +-
 .../hadoop/hbase/regionserver/package-tree.html    |  18 +-
 .../regionserver/querymatcher/package-tree.html    |   2 +-
 .../hbase/regionserver/wal/package-tree.html       |   4 +-
 .../hadoop/hbase/replication/package-tree.html     |   2 +-
 .../hadoop/hbase/rest/model/package-tree.html      |   2 +-
 .../hadoop/hbase/security/access/package-tree.html |   4 +-
 .../apache/hadoop/hbase/security/package-tree.html |   2 +-
 .../apache/hadoop/hbase/thrift/package-tree.html   |   2 +-
 .../org/apache/hadoop/hbase/util/package-tree.html |   6 +-
 .../hbase/zookeeper/ReadOnlyZKClient.Task.html     |  18 +-
 .../hbase/zookeeper/ReadOnlyZKClient.ZKTask.html   |  26 +-
 .../hadoop/hbase/zookeeper/ReadOnlyZKClient.html   |  71 ++-
 .../apache/hadoop/hbase/zookeeper/ZNodePaths.html  |   4 +-
 .../src-html/org/apache/hadoop/hbase/Version.html  |   4 +-
 .../hbase/client/ZKAsyncRegistry.Converter.html    | 407 +++++++------
 .../hadoop/hbase/client/ZKAsyncRegistry.html       | 407 +++++++------
 .../master/HMaster.InitializationMonitor.html      |   2 +-
 .../master/HMaster.MasterStoppedException.html     |   2 +-
 .../hbase/master/HMaster.RedirectServlet.html      |   2 +-
 .../master/HMaster.TableDescriptorGetter.html      |   2 +-
 .../org/apache/hadoop/hbase/master/HMaster.html    |   2 +-
 .../ServerManager.FlushedSequenceIdFlusher.html    | 118 ++--
 .../apache/hadoop/hbase/master/ServerManager.html  | 118 ++--
 .../hbase/zookeeper/ReadOnlyZKClient.Task.html     | 675 +++++++++++----------
 .../hbase/zookeeper/ReadOnlyZKClient.ZKTask.html   | 675 +++++++++++----------
 .../hadoop/hbase/zookeeper/ReadOnlyZKClient.html   | 675 +++++++++++----------
 .../apache/hadoop/hbase/zookeeper/ZNodePaths.html  |   4 +-
 downloads.html                                     |   2 +-
 export_control.html                                |   2 +-
 index.html                                         |   2 +-
 issue-management.html                              |   2 +-
 licenses.html                                      |   2 +-
 mailing-lists.html                                 |   2 +-
 metrics.html                                       |   2 +-
 old_news.html                                      |   2 +-
 plugin-management.html                             |   2 +-
 plugins.html                                       |   2 +-
 poweredbyhbase.html                                |   2 +-
 project-info.html                                  |   2 +-
 project-reports.html                               |   2 +-
 pseudo-distributed.html                            |   2 +-
 replication.html                                   |   2 +-
 resources.html                                     |   2 +-
 scm.html                                           |   2 +-
 sponsors.html                                      |   2 +-
 summary.html                                       |   2 +-
 supportingprojects.html                            |   2 +-
 team.html                                          |   2 +-
 testdevapidocs/index-all.html                      |   4 +-
 .../hadoop/hbase/client/TestZKAsyncRegistry.html   |   6 +-
 .../hbase/zookeeper/TestReadOnlyZKClient.html      |  44 +-
 .../hadoop/hbase/client/TestZKAsyncRegistry.html   | 106 ++--
 .../hbase/zookeeper/TestReadOnlyZKClient.html      | 307 +++++-----
 86 files changed, 2063 insertions(+), 1920 deletions(-)

diff --git a/acid-semantics.html b/acid-semantics.html
index 9b63d4f..5ad6316 100644
--- a/acid-semantics.html
+++ b/acid-semantics.html
@@ -457,7 +457,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-10</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-11</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 72f8074..66cfeda 100644
--- a/apache_hbase_reference_guide.pdf
+++ b/apache_hbase_reference_guide.pdf
@@ -5,8 +5,8 @@
 /Author (Apache HBase Team)
 /Creator (Asciidoctor PDF 1.5.0.alpha.15, based on Prawn 2.2.2)
 /Producer (Apache HBase Team)
-/ModDate (D:20190510144707+00'00')
-/CreationDate (D:20190510144707+00'00')
+/ModDate (D:20190511144628+00'00')
+/CreationDate (D:20190511144628+00'00')
 >>
 endobj
 2 0 obj
diff --git a/book.html b/book.html
index 37b9870..b4eb86c 100644
--- a/book.html
+++ b/book.html
@@ -41701,7 +41701,7 @@ org/apache/hadoop/hbase/security/access/AccessControlClient.revoke:(Lorg/apache/
 <div id="footer">
 <div id="footer-text">
 Version 3.0.0-SNAPSHOT<br>
-Last updated 2019-05-10 14:29:35 UTC
+Last updated 2019-05-11 14:29:37 UTC
 </div>
 </div>
 </body>
diff --git a/bulk-loads.html b/bulk-loads.html
index d1c8cf2..362e5d7 100644
--- a/bulk-loads.html
+++ b/bulk-loads.html
@@ -162,7 +162,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-10</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-11</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 759d8f5..51914fd 100644
--- a/checkstyle-aggregate.html
+++ b/checkstyle-aggregate.html
@@ -159,7 +159,7 @@
 <td>3923</td>
 <td>0</td>
 <td>0</td>
-<td>13148</td></tr></table></div>
+<td>13146</td></tr></table></div>
 <div class="section">
 <h2><a name="Files"></a>Files</h2>
 <table border="0" class="table table-striped">
@@ -8782,7 +8782,7 @@
 <td><a href="#org.apache.hadoop.hbase.zookeeper.ZNodePaths.java">org/apache/hadoop/hbase/zookeeper/ZNodePaths.java</a></td>
 <td>0</td>
 <td>0</td>
-<td>26</td></tr>
+<td>24</td></tr>
 <tr class="a">
 <td><a href="#org.apache.hadoop.hbase.zookeeper.ZooKeeperHelper.java">org/apache/hadoop/hbase/zookeeper/ZooKeeperHelper.java</a></td>
 <td>0</td>
@@ -8901,7 +8901,7 @@
 <tr class="b">
 <td></td>
 <td><a class="externalLink" href="http://checkstyle.sourceforge.net/config_javadoc.html#NonEmptyAtclauseDescription">NonEmptyAtclauseDescription</a></td>
-<td>3273</td>
+<td>3271</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="a">
 <td>misc</td>
@@ -103124,7 +103124,7 @@
 <td>indentation</td>
 <td>Indentation</td>
 <td>'lambda arguments' has incorrect indentation level 12, expected level should be 10.</td>
-<td>266</td></tr></table></div>
+<td>267</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.zookeeper.ZKConfig.java">org/apache/hadoop/hbase/zookeeper/ZKConfig.java</h3>
 <table border="0" class="table table-striped">
@@ -103319,19 +103319,7 @@
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>156</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>169</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>181</td></tr></table></div>
+<td>156</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.zookeeper.ZooKeeperHelper.java">org/apache/hadoop/hbase/zookeeper/ZooKeeperHelper.java</h3>
 <table border="0" class="table table-striped">
@@ -103355,7 +103343,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-10</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-11</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/checkstyle.rss b/checkstyle.rss
index b4333e5..97ff497 100644
--- a/checkstyle.rss
+++ b/checkstyle.rss
@@ -26,7 +26,7 @@ under the License.
     <copyright>&#169;2007 - 2019 The Apache Software Foundation</copyright>
     <item>
       <title>File: 3923,
-             Errors: 13148,
+             Errors: 13146,
              Warnings: 0,
              Infos: 0
       </title>
@@ -26193,7 +26193,7 @@ under the License.
                   0
                 </td>
                 <td>
-                  26
+                  24
                 </td>
               </tr>
                           <tr>
diff --git a/coc.html b/coc.html
index c576618..d0b72fc 100644
--- a/coc.html
+++ b/coc.html
@@ -231,7 +231,7 @@ email to <a class="externalLink" href="mailto:private@hbase.apache.org">the priv
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-10</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-11</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 19d5a46..7a7c6fd 100644
--- a/dependencies.html
+++ b/dependencies.html
@@ -311,7 +311,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-10</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-11</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 fa9237f..f64233d 100644
--- a/dependency-convergence.html
+++ b/dependency-convergence.html
@@ -505,7 +505,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-10</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-11</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 a82b4eb..86b2e63 100644
--- a/dependency-info.html
+++ b/dependency-info.html
@@ -184,7 +184,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-10</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-11</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 6e07712..c5e1ae7 100644
--- a/dependency-management.html
+++ b/dependency-management.html
@@ -894,7 +894,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-10</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-11</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/devapidocs/constant-values.html b/devapidocs/constant-values.html
index c3afdf6..9914e2d 100644
--- a/devapidocs/constant-values.html
+++ b/devapidocs/constant-values.html
@@ -3927,7 +3927,7 @@
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/Version.html#date">date</a></code></td>
-<td class="colLast"><code>"Fri May 10 14:35:25 UTC 2019"</code></td>
+<td class="colLast"><code>"Sat May 11 14:34:49 UTC 2019"</code></td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.revision">
@@ -3941,7 +3941,7 @@
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/Version.html#srcChecksum">srcChecksum</a></code></td>
-<td class="colLast"><code>"d3207878b048e8c902e2a3e9162791f0"</code></td>
+<td class="colLast"><code>"07462550979c5f1c2a6e0a5b8b0f4caa"</code></td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.url">
diff --git a/devapidocs/index-all.html b/devapidocs/index-all.html
index 2a4c7b8..42321f5 100644
--- a/devapidocs/index-all.html
+++ b/devapidocs/index-all.html
@@ -43903,6 +43903,8 @@
 <dd>
 <div class="block">Get the location of meta region.</div>
 </dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/ZKAsyncRegistry.html#getMetaRegionLocation-java.util.concurrent.CompletableFuture-java.util.List-">getMetaRegionLocation(CompletableFuture&lt;RegionLocations&gt;, List&lt;String&gt;)</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/ZKAsyncRegistry.html" title="class in org.apache.hadoop.hbase.client">ZKAsyncRegistry</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/ZKAsyncRegistry.html#getMetaRegionLocation--">getMetaRegionLocation()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/ZKAsyncRegistry.html" title="class in org.apache.hadoop.hbase.client">ZKAsyncRegistry</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/zookeeper/MetaTableLocator.html#getMetaRegionLocation-org.apache.hadoop.hbase.zookeeper.ZKWatcher-">getMetaRegionLocation(ZKWatcher)</a></span> - Static method in class org.apache.hadoop.hbase.zookeeper.<a href="org/apache/hadoop/hbase/zookeeper/MetaTableLocator.html" title="class in org.apache.hadoop.hbase.zookeeper">MetaTableLocator</a></dt>
@@ -68908,6 +68910,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/SortedList.html#list">list</a></span> - Variable in class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/SortedList.html" title="class in org.apache.hadoop.hbase.util">SortedList</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#list-java.lang.String-">list(String)</a></span> - Method in class org.apache.hadoop.hbase.zookeeper.<a href="org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html" title="class in org.apache.hadoop.hbase.zookeeper">ReadOnlyZKClient</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/security/access/PermissionStorage.html#LIST_CODE">LIST_CODE</a></span> - Static variable in class org.apache.hadoop.hbase.security.access.<a href="org/apache/hadoop/hbase/security/access/PermissionStorage.html" title="class in org.apache.hadoop.hbase.security.access">PermissionStorage</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/SnapshotInfo.Options.html#LIST_SNAPSHOTS">LIST_SNAPSHOTS</a></span> - Static variable in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/SnapshotInfo.Options.html" title="class in org.apache.hadoop.hbase.snapshot">SnapshotInfo.Options</a></dt>
diff --git a/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html b/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
index b55741e..0144a65 100644
--- a/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
@@ -167,8 +167,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupInfo.BackupState.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupInfo.BackupState</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupInfo.BackupPhase.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupInfo.BackupPhase</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupInfo.BackupState.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupInfo.BackupState</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupRestoreConstants.BackupCommand.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupRestoreConstants.BackupCommand</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupType.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupType</span></a></li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/class-use/RegionLocations.html b/devapidocs/org/apache/hadoop/hbase/class-use/RegionLocations.html
index bb2aabe..14ad5db 100644
--- a/devapidocs/org/apache/hadoop/hbase/class-use/RegionLocations.html
+++ b/devapidocs/org/apache/hadoop/hbase/class-use/RegionLocations.html
@@ -540,18 +540,23 @@
 <td class="colLast"><span class="typeNameLabel">AsyncNonMetaRegionLocator.TableCache.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.TableCache.html#clearCompletedRequests-java.util.Optional-">clearCompletedRequests</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html?is-external=true" title="class or interface in java.util">Optional</a>&lt;<a href="../../../../../org/apache/hadoop [...]
 </tr>
 <tr class="rowColor">
+<td class="colFirst"><code>private void</code></td>
+<td class="colLast"><span class="typeNameLabel">ZKAsyncRegistry.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/ZKAsyncRegistry.html#getMetaRegionLocation-java.util.concurrent.CompletableFuture-java.util.List-">getMetaRegionLocation</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html?is-external=true" title="class or interface in java.util.concurrent">CompletableFuture</a>&lt;<a href=". [...]
+                     <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;metaReplicaZNodes)</code>&nbsp;</td>
+</tr>
+<tr class="altColor">
 <td class="colFirst"><code>private boolean</code></td>
 <td class="colLast"><span class="typeNameLabel">AsyncNonMetaRegionLocator.TableCache.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.TableCache.html#tryComplete-org.apache.hadoop.hbase.client.AsyncNonMetaRegionLocator.LocateRequest-java.util.concurrent.CompletableFuture-java.util.Optional-">tryComplete</a></span>(<a href="../../../../../org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.LocateRequest.html" t [...]
            <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html?is-external=true" title="class or interface in java.util.concurrent">CompletableFuture</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/RegionLocations.html" title="class in org.apache.hadoop.hbase">RegionLocations</a>&gt;&nbsp;future,
            <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html?is-external=true" title="class or interface in java.util">Optional</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/RegionLocations.html" title="class in org.apache.hadoop.hbase">RegionLocations</a>&gt;&nbsp;locations)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private boolean</code></td>
 <td class="colLast"><span class="typeNameLabel">AsyncNonMetaRegionLocator.TableCache.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.TableCache.html#tryComplete-org.apache.hadoop.hbase.client.AsyncNonMetaRegionLocator.LocateRequest-java.util.concurrent.CompletableFuture-java.util.Optional-">tryComplete</a></span>(<a href="../../../../../org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.LocateRequest.html" t [...]
            <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html?is-external=true" title="class or interface in java.util.concurrent">CompletableFuture</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/RegionLocations.html" title="class in org.apache.hadoop.hbase">RegionLocations</a>&gt;&nbsp;future,
            <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html?is-external=true" title="class or interface in java.util">Optional</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/RegionLocations.html" title="class in org.apache.hadoop.hbase">RegionLocations</a>&gt;&nbsp;locations)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private static void</code></td>
 <td class="colLast"><span class="typeNameLabel">ZKAsyncRegistry.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/ZKAsyncRegistry.html#tryComplete-org.apache.commons.lang3.mutable.MutableInt-org.apache.hadoop.hbase.HRegionLocation:A-java.util.concurrent.CompletableFuture-">tryComplete</a></span>(org.apache.commons.lang3.mutable.MutableInt&nbsp;remaining,
            <a href="../../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a>[]&nbsp;locs,
diff --git a/devapidocs/org/apache/hadoop/hbase/client/ZKAsyncRegistry.Converter.html b/devapidocs/org/apache/hadoop/hbase/client/ZKAsyncRegistry.Converter.html
index 787fde7..325f4c7 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/ZKAsyncRegistry.Converter.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/ZKAsyncRegistry.Converter.html
@@ -105,7 +105,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private static interface <a href="../../../../../src-html/org/apache/hadoop/hbase/client/ZKAsyncRegistry.html#line.67">ZKAsyncRegistry.Converter</a>&lt;T&gt;</pre>
+<pre>private static interface <a href="../../../../../src-html/org/apache/hadoop/hbase/client/ZKAsyncRegistry.html#line.69">ZKAsyncRegistry.Converter</a>&lt;T&gt;</pre>
 </li>
 </ul>
 </div>
@@ -149,7 +149,7 @@ var activeTableTab = "activeTableTab";
 <ul class="blockListLast">
 <li class="blockList">
 <h4>convert</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/client/ZKAsyncRegistry.Converter.html" title="type parameter in ZKAsyncRegistry.Converter">T</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ZKAsyncRegistry.Converter.html#line.68">convert</a>(byte[]&nbsp;data)
+<pre><a href="../../../../../org/apache/hadoop/hbase/client/ZKAsyncRegistry.Converter.html" title="type parameter in ZKAsyncRegistry.Converter">T</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ZKAsyncRegistry.Converter.html#line.70">convert</a>(byte[]&nbsp;data)
    throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
diff --git a/devapidocs/org/apache/hadoop/hbase/client/ZKAsyncRegistry.html b/devapidocs/org/apache/hadoop/hbase/client/ZKAsyncRegistry.html
index 2296eec..b8bdf6e 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/ZKAsyncRegistry.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/ZKAsyncRegistry.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":9,"i4":10,"i5":10,"i6":10,"i7":9,"i8":9,"i9":10,"i10":10,"i11":10,"i12":9};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":9,"i4":10,"i5":10,"i6":10,"i7":9,"i8":9,"i9":10,"i10":10,"i11":10,"i12":10,"i13":9};
 var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -114,7 +114,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.Private
-class <a href="../../../../../src-html/org/apache/hadoop/hbase/client/ZKAsyncRegistry.html#line.54">ZKAsyncRegistry</a>
+class <a href="../../../../../src-html/org/apache/hadoop/hbase/client/ZKAsyncRegistry.html#line.56">ZKAsyncRegistry</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
 implements <a href="../../../../../org/apache/hadoop/hbase/client/AsyncRegistry.html" title="interface in org.apache.hadoop.hbase.client">AsyncRegistry</a></pre>
 <div class="block">Fetch the registry data from zookeeper.</div>
@@ -253,14 +253,19 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/AsyncRegistry.
 </td>
 </tr>
 <tr id="i10" class="altColor">
+<td class="colFirst"><code>private void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/ZKAsyncRegistry.html#getMetaRegionLocation-java.util.concurrent.CompletableFuture-java.util.List-">getMetaRegionLocation</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html?is-external=true" title="class or interface in java.util.concurrent">CompletableFuture</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/RegionLocatio [...]
+                     <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;metaReplicaZNodes)</code>&nbsp;</td>
+</tr>
+<tr id="i11" class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master">RegionState.State</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/ZKAsyncRegistry.html#getStateAndServerName-org.apache.hadoop.hbase.shaded.protobuf.generated.ZooKeeperProtos.MetaRegionServer-">getStateAndServerName</a></span>(org.apache.hadoop.hbase.shaded.protobuf.generated.ZooKeeperProtos.MetaRegionServer&nbsp;proto)</code>&nbsp;</td>
 </tr>
-<tr id="i11" class="rowColor">
+<tr id="i12" class="altColor">
 <td class="colFirst"><code>(package private) <a href="../../../../../org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html" title="class in org.apache.hadoop.hbase.zookeeper">ReadOnlyZKClient</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/ZKAsyncRegistry.html#getZKClient--">getZKClient</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i12" class="altColor">
+<tr id="i13" class="rowColor">
 <td class="colFirst"><code>private static void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/ZKAsyncRegistry.html#tryComplete-org.apache.commons.lang3.mutable.MutableInt-org.apache.hadoop.hbase.HRegionLocation:A-java.util.concurrent.CompletableFuture-">tryComplete</a></span>(org.apache.commons.lang3.mutable.MutableInt&nbsp;remaining,
            <a href="../../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a>[]&nbsp;locs,
@@ -294,7 +299,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/AsyncRegistry.
 <ul class="blockList">
 <li class="blockList">
 <h4>LOG</h4>
-<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/client/ZKAsyncRegistry.html#line.56">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/client/ZKAsyncRegistry.html#line.58">LOG</a></pre>
 </li>
 </ul>
 <a name="zk">
@@ -303,7 +308,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/AsyncRegistry.
 <ul class="blockList">
 <li class="blockList">
 <h4>zk</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html" title="class in org.apache.hadoop.hbase.zookeeper">ReadOnlyZKClient</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/ZKAsyncRegistry.html#line.58">zk</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html" title="class in org.apache.hadoop.hbase.zookeeper">ReadOnlyZKClient</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/ZKAsyncRegistry.html#line.60">zk</a></pre>
 </li>
 </ul>
 <a name="znodePaths">
@@ -312,7 +317,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/AsyncRegistry.
 <ul class="blockListLast">
 <li class="blockList">
 <h4>znodePaths</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/zookeeper/ZNodePaths.html" title="class in org.apache.hadoop.hbase.zookeeper">ZNodePaths</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/ZKAsyncRegistry.html#line.60">znodePaths</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/zookeeper/ZNodePaths.html" title="class in org.apache.hadoop.hbase.zookeeper">ZNodePaths</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/ZKAsyncRegistry.html#line.62">znodePaths</a></pre>
 </li>
 </ul>
 </li>
@@ -329,7 +334,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/AsyncRegistry.
 <ul class="blockListLast">
 <li class="blockList">
 <h4>ZKAsyncRegistry</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/client/ZKAsyncRegistry.html#line.62">ZKAsyncRegistry</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/client/ZKAsyncRegistry.html#line.64">ZKAsyncRegistry</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 </li>
 </ul>
 </li>
@@ -346,7 +351,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/AsyncRegistry.
 <ul class="blockList">
 <li class="blockList">
 <h4>getAndConvert</h4>
-<pre>private&nbsp;&lt;T&gt;&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html?is-external=true" title="class or interface in java.util.concurrent">CompletableFuture</a>&lt;T&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ZKAsyncRegistry.html#line.71">getAndConvert</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;path,
+<pre>private&nbsp;&lt;T&gt;&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html?is-external=true" title="class or interface in java.util.concurrent">CompletableFuture</a>&lt;T&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ZKAsyncRegistry.html#line.73">getAndConvert</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;path,
                                                <a href="../../../../../org/apache/hadoop/hbase/client/ZKAsyncRegistry.Converter.html" title="interface in org.apache.hadoop.hbase.client">ZKAsyncRegistry.Converter</a>&lt;T&gt;&nbsp;converter)</pre>
 </li>
 </ul>
@@ -356,7 +361,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/AsyncRegistry.
 <ul class="blockList">
 <li class="blockList">
 <h4>getClusterId</h4>
-<pre>private static&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/client/ZKAsyncRegistry.html#line.87">getClusterId</a>(byte[]&nbsp;data)
+<pre>private static&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/client/ZKAsyncRegistry.html#line.89">getClusterId</a>(byte[]&nbsp;data)
                             throws <a href="../../../../../org/apache/hadoop/hbase/exceptions/DeserializationException.html" title="class in org.apache.hadoop.hbase.exceptions">DeserializationException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -370,7 +375,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/AsyncRegistry.
 <ul class="blockList">
 <li class="blockList">
 <h4>getClusterId</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html?is-external=true" title="class or interface in java.util.concurrent">CompletableFuture</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ZKAsyncRegistry.html#line.96">getClusterId</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html?is-external=true" title="class or interface in java.util.concurrent">CompletableFuture</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ZKAsyncRegistry.html#line.98">getClusterId</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/AsyncRegistry.html#getClusterId--">AsyncRegistry</a></code></span></div>
 <div class="block">Should only be called once.
  <p>
@@ -387,7 +392,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/AsyncRegistry.
 <ul class="blockList">
 <li class="blockList">
 <h4>getZKClient</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html" title="class in org.apache.hadoop.hbase.zookeeper">ReadOnlyZKClient</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ZKAsyncRegistry.html#line.101">getZKClient</a>()</pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html" title="class in org.apache.hadoop.hbase.zookeeper">ReadOnlyZKClient</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ZKAsyncRegistry.html#line.103">getZKClient</a>()</pre>
 </li>
 </ul>
 <a name="getMetaProto-byte:A-">
@@ -396,7 +401,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/AsyncRegistry.
 <ul class="blockList">
 <li class="blockList">
 <h4>getMetaProto</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.ZooKeeperProtos.MetaRegionServer&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ZKAsyncRegistry.html#line.105">getMetaProto</a>(byte[]&nbsp;data)
+<pre>private static&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.ZooKeeperProtos.MetaRegionServer&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ZKAsyncRegistry.html#line.107">getMetaProto</a>(byte[]&nbsp;data)
                                                                                                         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -410,7 +415,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/AsyncRegistry.
 <ul class="blockList">
 <li class="blockList">
 <h4>tryComplete</h4>
-<pre>private static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ZKAsyncRegistry.html#line.115">tryComplete</a>(org.apache.commons.lang3.mutable.MutableInt&nbsp;remaining,
+<pre>private static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ZKAsyncRegistry.html#line.117">tryComplete</a>(org.apache.commons.lang3.mutable.MutableInt&nbsp;remaining,
                                 <a href="../../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a>[]&nbsp;locs,
                                 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html?is-external=true" title="class or interface in java.util.concurrent">CompletableFuture</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/RegionLocations.html" title="class in org.apache.hadoop.hbase">RegionLocations</a>&gt;&nbsp;future)</pre>
 </li>
@@ -421,7 +426,17 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/AsyncRegistry.
 <ul class="blockList">
 <li class="blockList">
 <h4>getStateAndServerName</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master">RegionState.State</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ZKAsyncReg [...]
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master">RegionState.State</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ZKAsyncReg [...]
+</li>
+</ul>
+<a name="getMetaRegionLocation-java.util.concurrent.CompletableFuture-java.util.List-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>getMetaRegionLocation</h4>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ZKAsyncRegistry.html#line.139">getMetaRegionLocation</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html?is-external=true" title="class or interface in java.util.concurrent">CompletableFuture</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/RegionLocations.html" title="class in org.apache.hadoop.hbase">RegionLocations</a>&gt;&nbsp;future,
+                                   <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;metaReplicaZNodes)</pre>
 </li>
 </ul>
 <a name="getMetaRegionLocation--">
@@ -430,7 +445,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/AsyncRegistry.
 <ul class="blockList">
 <li class="blockList">
 <h4>getMetaRegionLocation</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html?is-external=true" title="class or interface in java.util.concurrent">CompletableFuture</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/RegionLocations.html" title="class in org.apache.hadoop.hbase">RegionLocations</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ZKAsyncRegistry.html#line.138">getMetaRegionLocation</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html?is-external=true" title="class or interface in java.util.concurrent">CompletableFuture</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/RegionLocations.html" title="class in org.apache.hadoop.hbase">RegionLocations</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ZKAsyncRegistry.html#line.196">getMetaRegionLocation</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/AsyncRegistry.html#getMetaRegionLocation--">AsyncRegistry</a></code></span></div>
 <div class="block">Get the location of meta region.</div>
 <dl>
@@ -445,7 +460,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/AsyncRegistry.
 <ul class="blockList">
 <li class="blockList">
 <h4>getCurrentNrHRS</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html?is-external=true" title="class or interface in java.util.concurrent">CompletableFuture</a>&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/client/ZKAsyncRegistry.html#line.194">getCurrentNrHRS</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html?is-external=true" title="class or interface in java.util.concurrent">CompletableFuture</a>&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/client/ZKAsyncRegistry.html#line.213">getCurrentNrHRS</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/AsyncRegistry.html#getCurrentNrHRS--">AsyncRegistry</a></code></span></div>
 <div class="block">Get the number of 'running' regionservers.</div>
 <dl>
@@ -460,7 +475,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/AsyncRegistry.
 <ul class="blockList">
 <li class="blockList">
 <h4>getMasterProto</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.ZooKeeperProtos.Master&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ZKAsyncRegistry.html#line.198">getMasterProto</a>(byte[]&nbsp;data)
+<pre>private static&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.ZooKeeperProtos.Master&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ZKAsyncRegistry.html#line.217">getMasterProto</a>(byte[]&nbsp;data)
                                                                                                 throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -474,7 +489,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/AsyncRegistry.
 <ul class="blockList">
 <li class="blockList">
 <h4>getMasterAddress</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html?is-external=true" title="class or interface in java.util.concurrent">CompletableFuture</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ZKAsyncRegistry.html#line.208">getMasterAddress</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html?is-external=true" title="class or interface in java.util.concurrent">CompletableFuture</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ZKAsyncRegistry.html#line.227">getMasterAddress</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/AsyncRegistry.html#getMasterAddress--">AsyncRegistry</a></code></span></div>
 <div class="block">Get the address of HMaster.</div>
 <dl>
@@ -489,7 +504,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/AsyncRegistry.
 <ul class="blockList">
 <li class="blockList">
 <h4>getMasterInfoPort</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html?is-external=true" title="class or interface in java.util.concurrent">CompletableFuture</a>&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/client/ZKAsyncRegistry.html#line.221">getMasterInfoPort</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html?is-external=true" title="class or interface in java.util.concurrent">CompletableFuture</a>&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/client/ZKAsyncRegistry.html#line.240">getMasterInfoPort</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/AsyncRegistry.html#getMasterInfoPort--">AsyncRegistry</a></code></span></div>
 <div class="block">Get the info port of HMaster.</div>
 <dl>
@@ -504,7 +519,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/AsyncRegistry.
 <ul class="blockListLast">
 <li class="blockList">
 <h4>close</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ZKAsyncRegistry.html#line.227">close</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ZKAsyncRegistry.html#line.246">close</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/AsyncRegistry.html#close--">AsyncRegistry</a></code></span></div>
 <div class="block">Closes this instance and releases any system resources associated with it</div>
 <dl>
diff --git a/devapidocs/org/apache/hadoop/hbase/client/package-tree.html b/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
index 2e47f29..425a2e9 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
@@ -549,24 +549,24 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AbstractResponse.ResponseType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AbstractResponse.ResponseType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/RegionLocateType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">RegionLocateType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/MobCompactPartitionPolicy.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">MobCompactPartitionPolicy</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncScanSingleRegionRpcRetryingCaller.ScanControllerState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncScanSingleRegionRpcRetryingCaller.ScanControllerState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncRequestFutureImpl.Retry.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncRequestFutureImpl.Retry</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Durability</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/CompactionState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CompactionState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Scan.ReadType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Scan.ReadType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/MasterSwitchType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">MasterSwitchType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/ScannerCallable.MoreResults.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">ScannerCallable.MoreResults</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/MobCompactPartitionPolicy.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">MobCompactPartitionPolicy</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/RequestController.ReturnCode.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">RequestController.ReturnCode</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/RegionLocateType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">RegionLocateType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcessTask.SubmittedRows.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncProcessTask.SubmittedRows</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/SnapshotType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">SnapshotType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/ScannerCallable.MoreResults.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">ScannerCallable.MoreResults</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncRequestFutureImpl.Retry.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncRequestFutureImpl.Retry</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/CompactType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CompactType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Durability</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/IsolationLevel.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">IsolationLevel</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/TableState.State.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">TableState.State</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcessTask.SubmittedRows.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncProcessTask.SubmittedRows</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Consistency.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Consistency</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/CompactType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CompactType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/CompactionState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CompactionState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AbstractResponse.ResponseType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AbstractResponse.ResponseType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Scan.ReadType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Scan.ReadType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncScanSingleRegionRpcRetryingCaller.ScanControllerState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncScanSingleRegionRpcRetryingCaller.ScanControllerState</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncScanSingleRegionRpcRetryingCaller.ScanResumerState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncScanSingleRegionRpcRetryingCaller.ScanResumerState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/TableState.State.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">TableState.State</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/coprocessor/package-tree.html b/devapidocs/org/apache/hadoop/hbase/coprocessor/package-tree.html
index c51f7b2..dc618a4 100644
--- a/devapidocs/org/apache/hadoop/hbase/coprocessor/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/coprocessor/package-tree.html
@@ -201,8 +201,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.coprocessor.<a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.MutationType.html" title="enum in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">RegionObserver.MutationType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.coprocessor.<a href="../../../../../org/apache/hadoop/hbase/coprocessor/MetaTableMetrics.MetaTableOps.html" title="enum in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">MetaTableMetrics.MetaTableOps</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.coprocessor.<a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.MutationType.html" title="enum in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">RegionObserver.MutationType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html b/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
index 126073e..a34e392 100644
--- a/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
@@ -189,13 +189,13 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/BitComparator.BitwiseOp.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">BitComparator.BitwiseOp</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/Filter.ReturnCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">Filter.ReturnCode</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FilterWrapper.FilterRowRetCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FilterWrapper.FilterRowRetCode</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FilterList.Operator.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FilterList.Operator</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/RegexStringComparator.EngineType.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">RegexStringComparator.EngineType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.SatisfiesCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FuzzyRowFilter.SatisfiesCode</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/BitComparator.BitwiseOp.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">BitComparator.BitwiseOp</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FilterWrapper.FilterRowRetCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FilterWrapper.FilterRowRetCode</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.Order.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FuzzyRowFilter.Order</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/RegexStringComparator.EngineType.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">RegexStringComparator.EngineType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/http/package-tree.html b/devapidocs/org/apache/hadoop/hbase/http/package-tree.html
index 483ea4b..e1a5d8d 100644
--- a/devapidocs/org/apache/hadoop/hbase/http/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/http/package-tree.html
@@ -139,8 +139,8 @@
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
 <li type="circle">org.apache.hadoop.hbase.http.<a href="../../../../../org/apache/hadoop/hbase/http/ProfileServlet.Output.html" title="enum in org.apache.hadoop.hbase.http"><span class="typeNameLink">ProfileServlet.Output</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.http.<a href="../../../../../org/apache/hadoop/hbase/http/ProfileServlet.Event.html" title="enum in org.apache.hadoop.hbase.http"><span class="typeNameLink">ProfileServlet.Event</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.http.<a href="../../../../../org/apache/hadoop/hbase/http/HttpConfig.Policy.html" title="enum in org.apache.hadoop.hbase.http"><span class="typeNameLink">HttpConfig.Policy</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.http.<a href="../../../../../org/apache/hadoop/hbase/http/ProfileServlet.Event.html" title="enum in org.apache.hadoop.hbase.http"><span class="typeNameLink">ProfileServlet.Event</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html b/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
index b29287a..853cdc1 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
@@ -283,12 +283,12 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.BlockCategory.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockType.BlockCategory</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.MemoryType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">Cacheable.MemoryType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCacheFactory.ExternalBlockCaches.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockCacheFactory.ExternalBlockCaches</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.Writer.State.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">HFileBlock.Writer.State</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockPriority.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockPriority</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCacheFactory.ExternalBlockCaches.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockCacheFactory.ExternalBlockCaches</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.MemoryType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">Cacheable.MemoryType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html b/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
index cb4ea86..148fecd 100644
--- a/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
@@ -354,8 +354,8 @@
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
 <li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/BufferCallBeforeInitHandler.BufferCallAction.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">BufferCallBeforeInitHandler.BufferCallAction</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/CallEvent.Type.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">CallEvent.Type</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/MetricsHBaseServerSourceFactoryImpl.SourceStorage.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">MetricsHBaseServerSourceFactoryImpl.SourceStorage</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/CallEvent.Type.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">CallEvent.Type</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html b/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
index 2ee114f..03452ce 100644
--- a/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
@@ -298,9 +298,9 @@
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/RowCounter.RowCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">RowCounter.RowCounterMapper.Counters</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/SyncTable.SyncMapper.Counter.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">SyncTable.SyncMapper.Counter</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">CellCounter.CellCounterMapper.Counters</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableSplit.Version.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">TableSplit.Version</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">CellCounter.CellCounterMapper.Counters</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/SyncTable.SyncMapper.Counter.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">SyncTable.SyncMapper.Counter</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/ServerManager.FlushedSequenceIdFlusher.html b/devapidocs/org/apache/hadoop/hbase/master/ServerManager.FlushedSequenceIdFlusher.html
index a8a3341..332a883 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/ServerManager.FlushedSequenceIdFlusher.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/ServerManager.FlushedSequenceIdFlusher.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private class <a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.html#line.1170">ServerManager.FlushedSequenceIdFlusher</a>
+<pre>private class <a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.html#line.1174">ServerManager.FlushedSequenceIdFlusher</a>
 extends <a href="../../../../../org/apache/hadoop/hbase/ScheduledChore.html" title="class in org.apache.hadoop.hbase">ScheduledChore</a></pre>
 </li>
 </ul>
@@ -201,7 +201,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/ScheduledChore.html" tit
 <ul class="blockListLast">
 <li class="blockList">
 <h4>FlushedSequenceIdFlusher</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.FlushedSequenceIdFlusher.html#line.1172">FlushedSequenceIdFlusher</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.FlushedSequenceIdFlusher.html#line.1176">FlushedSequenceIdFlusher</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name,
                                 int&nbsp;p)</pre>
 </li>
 </ul>
@@ -219,7 +219,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/ScheduledChore.html" tit
 <ul class="blockListLast">
 <li class="blockList">
 <h4>chore</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.FlushedSequenceIdFlusher.html#line.1177">chore</a>()</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.FlushedSequenceIdFlusher.html#line.1181">chore</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/ScheduledChore.html#chore--">ScheduledChore</a></code></span></div>
 <div class="block">The task to execute on each scheduled execution of the Chore</div>
 <dl>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/ServerManager.html b/devapidocs/org/apache/hadoop/hbase/master/ServerManager.html
index ffef785..d22aa81 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/ServerManager.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/ServerManager.html
@@ -1661,7 +1661,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>removeDeletedRegionFromLoadedFlushedSequenceIds</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.html#line.1158">removeDeletedRegionFromLoadedFlushedSequenceIds</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.html#line.1162">removeDeletedRegionFromLoadedFlushedSequenceIds</a>()</pre>
 <div class="block">Regions may have been removed between latest persist of FlushedSequenceIds
  and master abort. So after loading FlushedSequenceIds from file, and after
  meta loaded, we need to remove the deleted region according to RegionStates.</div>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/assignment/package-tree.html b/devapidocs/org/apache/hadoop/hbase/master/assignment/package-tree.html
index e0b322d..f63d55a 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/assignment/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/assignment/package-tree.html
@@ -148,8 +148,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.master.assignment.<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/ServerState.html" title="enum in org.apache.hadoop.hbase.master.assignment"><span class="typeNameLink">ServerState</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.assignment.<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.TransitionType.html" title="enum in org.apache.hadoop.hbase.master.assignment"><span class="typeNameLink">TransitRegionStateProcedure.TransitionType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.assignment.<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/ServerState.html" title="enum in org.apache.hadoop.hbase.master.assignment"><span class="typeNameLink">ServerState</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html
index c49c655..848d41f 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html
@@ -198,8 +198,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.master.balancer.<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.LocalityType.html" title="enum in org.apache.hadoop.hbase.master.balancer"><span class="typeNameLink">BaseLoadBalancer.Cluster.LocalityType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.balancer.<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.Type.html" title="enum in org.apache.hadoop.hbase.master.balancer"><span class="typeNameLink">BaseLoadBalancer.Cluster.Action.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.balancer.<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.LocalityType.html" title="enum in org.apache.hadoop.hbase.master.balancer"><span class="typeNameLink">BaseLoadBalancer.Cluster.LocalityType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/package-tree.html b/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
index d63e14d..9faf92b 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
@@ -355,10 +355,10 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.ResubmitDirective.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">SplitLogManager.ResubmitDirective</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/MasterRpcServices.BalanceSwitchMode.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">MasterRpcServices.BalanceSwitchMode</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/MetricsMasterSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">MetricsMasterSourceFactoryImpl.FactoryStorage</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.TerminationStatus.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">SplitLogManager.TerminationStatus</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.ResubmitDirective.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">SplitLogManager.ResubmitDirective</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/MasterRpcServices.BalanceSwitchMode.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">MasterRpcServices.BalanceSwitchMode</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">RegionState.State</span></a></li>
 </ul>
 </li>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html b/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
index 5ea7aac..a8186f6 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
@@ -216,10 +216,10 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ServerProcedureInterface.ServerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">ServerProcedureInterface.ServerOperationType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/PeerProcedureInterface.PeerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">PeerProcedureInterface.PeerOperationType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.TableOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">TableProcedureInterface.TableOperationType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MetaProcedureInterface.MetaOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">MetaProcedureInterface.MetaOperationType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ServerProcedureInterface.ServerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">ServerProcedureInterface.ServerOperationType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/package-tree.html b/devapidocs/org/apache/hadoop/hbase/package-tree.html
index e02ad06..5ab3a08 100644
--- a/devapidocs/org/apache/hadoop/hbase/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/package-tree.html
@@ -433,19 +433,19 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/KeepDeletedCells.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeepDeletedCells</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Cell.Type.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Cell.Type</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Coprocessor.State.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Coprocessor.State</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Size.Unit.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Size.Unit</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HConstants.OperationStatusCode.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HConstants.OperationStatusCode</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/KeyValue.Type.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeyValue.Type</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CompareOperator.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompareOperator</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CellBuilderType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CellBuilderType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CompatibilitySingletonFactory.SingletonStorage.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompatibilitySingletonFactory.SingletonStorage</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MemoryCompactionPolicy.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MemoryCompactionPolicy</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HealthChecker.HealthCheckerExitStatus.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HealthChecker.HealthCheckerExitStatus</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ClusterMetrics.Option.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ClusterMetrics.Option</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/KeyValue.Type.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeyValue.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Coprocessor.State.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Coprocessor.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CompatibilitySingletonFactory.SingletonStorage.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompatibilitySingletonFactory.SingletonStorage</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MetaTableAccessor.QueryType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/KeepDeletedCells.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeepDeletedCells</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CompareOperator.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompareOperator</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HConstants.OperationStatusCode.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HConstants.OperationStatusCode</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MemoryCompactionPolicy.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MemoryCompactionPolicy</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Size.Unit.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Size.Unit</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Cell.Type.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Cell.Type</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html b/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
index ffe5114..da2c424 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
@@ -216,11 +216,11 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.LockState.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">Procedure.LockState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/LockedResourceType.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">LockedResourceType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">StateMachineProcedure.Flow</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/LockType.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">LockType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/RootProcedureState.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">RootProcedureState.State</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">StateMachineProcedure.Flow</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/LockedResourceType.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">LockedResourceType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.LockState.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">Procedure.LockState</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html b/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
index 72a25b7..ddc2ebc 100644
--- a/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
@@ -241,11 +241,11 @@
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/QuotaScope.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">QuotaScope</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/SpaceViolationPolicy.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">SpaceViolationPolicy</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/OperationQuota.OperationType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">OperationQuota.OperationType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/ThrottleType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">ThrottleType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/RpcThrottlingException.Type.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">RpcThrottlingException.Type</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/QuotaType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">QuotaType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/SpaceViolationPolicy.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">SpaceViolationPolicy</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/RpcThrottlingException.Type.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">RpcThrottlingException.Type</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html b/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
index 48ffc5b..05b65de 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -715,20 +715,20 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DefaultHeapMemoryTuner.StepDirection.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">DefaultHeapMemoryTuner.StepDirection</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/BloomType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">BloomType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.Operation.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">Region.Operation</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DefaultHeapMemoryTuner.StepDirection.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">DefaultHeapMemoryTuner.StepDirection</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">HRegion.FlushResult.Result</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.LimitScope.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScannerContext.LimitScope</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ChunkCreator.ChunkType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ChunkCreator.ChunkType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/CompactingMemStore.IndexType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">CompactingMemStore.IndexType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TimeRangeTracker.Type.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TimeRangeTracker.Type</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScanType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.NextState.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScannerContext.NextState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.Operation.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">Region.Operation</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">FlushType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsRegionServerSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MetricsRegionServerSourceFactoryImpl.FactoryStorage</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MemStoreCompactionStrategy.Action</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TimeRangeTracker.Type.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TimeRangeTracker.Type</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.LimitScope.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScannerContext.LimitScope</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.NextState.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScannerContext.NextState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ChunkCreator.ChunkType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ChunkCreator.ChunkType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">HRegion.FlushResult.Result</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/SplitLogWorker.TaskExecutor.Status.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">SplitLogWorker.TaskExecutor.Status</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/CompactingMemStore.IndexType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">CompactingMemStore.IndexType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsRegionServerSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MetricsRegionServerSourceFactoryImpl.FactoryStorage</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html b/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html
index 03a894e..b195b74 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html
@@ -131,8 +131,8 @@
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
 <li type="circle">org.apache.hadoop.hbase.regionserver.querymatcher.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/StripeCompactionScanQueryMatcher.DropDeletesInOutput.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">StripeCompactionScanQueryMatcher.DropDeletesInOutput</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.querymatcher.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/DeleteTracker.DeleteResult.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">DeleteTracker.DeleteResult</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.querymatcher.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">ScanQueryMatcher.MatchCode</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.querymatcher.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/DeleteTracker.DeleteResult.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">DeleteTracker.DeleteResult</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
index dcee643..5ef6472 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
@@ -247,10 +247,10 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/WALActionsListener.RollRequestReason.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">WALActionsListener.RollRequestReason</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/ProtobufLogReader.WALHdrResult.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">ProtobufLogReader.WALHdrResult</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/CompressionContext.DictionaryIndex.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">CompressionContext.DictionaryIndex</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/RingBufferTruck.Type.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">RingBufferTruck.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/WALActionsListener.RollRequestReason.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">WALActionsListener.RollRequestReason</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/CompressionContext.DictionaryIndex.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">CompressionContext.DictionaryIndex</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/replication/package-tree.html b/devapidocs/org/apache/hadoop/hbase/replication/package-tree.html
index 02505ac..818a04c 100644
--- a/devapidocs/org/apache/hadoop/hbase/replication/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/replication/package-tree.html
@@ -162,8 +162,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.replication.<a href="../../../../../org/apache/hadoop/hbase/replication/ReplicationPeer.PeerState.html" title="enum in org.apache.hadoop.hbase.replication"><span class="typeNameLink">ReplicationPeer.PeerState</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.replication.<a href="../../../../../org/apache/hadoop/hbase/replication/SyncReplicationState.html" title="enum in org.apache.hadoop.hbase.replication"><span class="typeNameLink">SyncReplicationState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.replication.<a href="../../../../../org/apache/hadoop/hbase/replication/ReplicationPeer.PeerState.html" title="enum in org.apache.hadoop.hbase.replication"><span class="typeNameLink">ReplicationPeer.PeerState</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/rest/model/package-tree.html b/devapidocs/org/apache/hadoop/hbase/rest/model/package-tree.html
index 7d70035..3aa879d 100644
--- a/devapidocs/org/apache/hadoop/hbase/rest/model/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/rest/model/package-tree.html
@@ -110,8 +110,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.rest.model.<a href="../../../../../../org/apache/hadoop/hbase/rest/model/ScannerModel.FilterModel.ByteArrayComparableModel.ComparatorType.html" title="enum in org.apache.hadoop.hbase.rest.model"><span class="typeNameLink">ScannerModel.FilterModel.ByteArrayComparableModel.ComparatorType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.rest.model.<a href="../../../../../../org/apache/hadoop/hbase/rest/model/ScannerModel.FilterModel.FilterType.html" title="enum in org.apache.hadoop.hbase.rest.model"><span class="typeNameLink">ScannerModel.FilterModel.FilterType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.rest.model.<a href="../../../../../../org/apache/hadoop/hbase/rest/model/ScannerModel.FilterModel.ByteArrayComparableModel.ComparatorType.html" title="enum in org.apache.hadoop.hbase.rest.model"><span class="typeNameLink">ScannerModel.FilterModel.ByteArrayComparableModel.ComparatorType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html b/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
index 2c1ff7e..fe5966a 100644
--- a/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
@@ -143,10 +143,10 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/Permission.Action.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">Permission.Action</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessControlFilter.Strategy.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">AccessControlFilter.Strategy</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">AccessController.OpType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/Permission.Action.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">Permission.Action</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/Permission.Scope.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">Permission.Scope</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessControlFilter.Strategy.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">AccessControlFilter.Strategy</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/security/package-tree.html b/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
index 4b0ca3e..3e32f6b 100644
--- a/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
@@ -192,8 +192,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslUtil.QualityOfProtection.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">SaslUtil.QualityOfProtection</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/AuthMethod.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">AuthMethod</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslUtil.QualityOfProtection.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">SaslUtil.QualityOfProtection</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslStatus.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">SaslStatus</span></a></li>
 </ul>
 </li>
diff --git a/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html b/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
index 47e3265..7edef14 100644
--- a/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
@@ -208,8 +208,8 @@
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
 <li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/ImplType.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">ImplType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/MetricsThriftServerSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">MetricsThriftServerSourceFactoryImpl.FactoryStorage</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/ThriftMetrics.ThriftServerType.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">ThriftMetrics.ThriftServerType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/MetricsThriftServerSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">MetricsThriftServerSourceFactoryImpl.FactoryStorage</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/util/package-tree.html b/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
index 3981d8e..d6a0001 100644
--- a/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
@@ -543,12 +543,12 @@
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PrettyPrinter.Unit.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PrettyPrinter.Unit</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/ChecksumType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">ChecksumType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Order.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Order</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/HBaseFsck.ErrorReporter.ERROR_CODE.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">HBaseFsck.ErrorReporter.ERROR_CODE</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.LexicographicalComparerHolder.PureJavaComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Bytes.LexicographicalComparerHolder.PureJavaComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PoolMap.PoolType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PoolMap.PoolType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.LexicographicalComparerHolder.UnsafeComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Bytes.LexicographicalComparerHolder.UnsafeComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/ChecksumType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">ChecksumType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/HBaseFsck.ErrorReporter.ERROR_CODE.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">HBaseFsck.ErrorReporter.ERROR_CODE</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Order.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Order</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/IdReadWriteLock.ReferenceType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">IdReadWriteLock.ReferenceType</span></a></li>
 </ul>
 </li>
diff --git a/devapidocs/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.Task.html b/devapidocs/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.Task.html
index b28f62e..2db628d 100644
--- a/devapidocs/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.Task.html
+++ b/devapidocs/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.Task.html
@@ -121,7 +121,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private abstract static class <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.79">ReadOnlyZKClient.Task</a>
+<pre>private abstract static class <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.80">ReadOnlyZKClient.Task</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
 implements <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Delayed.html?is-external=true" title="class or interface in java.util.concurrent">Delayed</a></pre>
 </li>
@@ -232,7 +232,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurre
 <ul class="blockListLast">
 <li class="blockList">
 <h4>time</h4>
-<pre>protected&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.Task.html#line.81">time</a></pre>
+<pre>protected&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.Task.html#line.82">time</a></pre>
 </li>
 </ul>
 </li>
@@ -249,7 +249,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurre
 <ul class="blockListLast">
 <li class="blockList">
 <h4>Task</h4>
-<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.Task.html#line.79">Task</a>()</pre>
+<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.Task.html#line.80">Task</a>()</pre>
 </li>
 </ul>
 </li>
@@ -266,7 +266,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurre
 <ul class="blockList">
 <li class="blockList">
 <h4>needZk</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.Task.html#line.83">needZk</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.Task.html#line.84">needZk</a>()</pre>
 </li>
 </ul>
 <a name="exec-org.apache.zookeeper.ZooKeeper-">
@@ -275,7 +275,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurre
 <ul class="blockList">
 <li class="blockList">
 <h4>exec</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.Task.html#line.87">exec</a>(org.apache.zookeeper.ZooKeeper&nbsp;zk)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.Task.html#line.88">exec</a>(org.apache.zookeeper.ZooKeeper&nbsp;zk)</pre>
 </li>
 </ul>
 <a name="connectFailed-java.io.IOException-">
@@ -284,7 +284,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurre
 <ul class="blockList">
 <li class="blockList">
 <h4>connectFailed</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.Task.html#line.90">connectFailed</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>&nbsp;e)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.Task.html#line.91">connectFailed</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>&nbsp;e)</pre>
 </li>
 </ul>
 <a name="closed-java.io.IOException-">
@@ -293,7 +293,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurre
 <ul class="blockList">
 <li class="blockList">
 <h4>closed</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.Task.html#line.93">closed</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>&nbsp;e)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.Task.html#line.94">closed</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>&nbsp;e)</pre>
 </li>
 </ul>
 <a name="compareTo-java.util.concurrent.Delayed-">
@@ -302,7 +302,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurre
 <ul class="blockList">
 <li class="blockList">
 <h4>compareTo</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.Task.html#line.97">compareTo</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Delayed.html?is-external=true" title="class or interface in java.util.concurrent">Delayed</a>&nbsp;o)</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.Task.html#line.98">compareTo</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Delayed.html?is-external=true" title="class or interface in java.util.concurrent">Delayed</a>&nbsp;o)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true#compareTo-T-" title="class or interface in java.lang">compareTo</a></code>&nbsp;in interface&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Delayed.html?is-external=true" title="class or interface in [...]
@@ -315,7 +315,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurre
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getDelay</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.Task.html#line.107">getDelay</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/TimeUnit.html?is-external=true" title="class or interface in java.util.concurrent">TimeUnit</a>&nbsp;unit)</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.Task.html#line.108">getDelay</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/TimeUnit.html?is-external=true" title="class or interface in java.util.concurrent">TimeUnit</a>&nbsp;unit)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Delayed.html?is-external=true#getDelay-java.util.concurrent.TimeUnit-" title="class or interface in java.util.concurrent">getDelay</a></code>&nbsp;in interface&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Delayed.html?is-external=true" title="class or interface in java.util.concurrent">Delayed</a></code></dd>
diff --git a/devapidocs/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.ZKTask.html b/devapidocs/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.ZKTask.html
index 181ac5c..0c5340b 100644
--- a/devapidocs/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.ZKTask.html
+++ b/devapidocs/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.ZKTask.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private abstract class <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.149">ReadOnlyZKClient.ZKTask</a>&lt;T&gt;
+<pre>private abstract class <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.150">ReadOnlyZKClient.ZKTask</a>&lt;T&gt;
 extends <a href="../../../../../org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.Task.html" title="class in org.apache.hadoop.hbase.zookeeper">ReadOnlyZKClient.Task</a></pre>
 </li>
 </ul>
@@ -268,7 +268,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClie
 <ul class="blockList">
 <li class="blockList">
 <h4>path</h4>
-<pre>protected final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.ZKTask.html#line.151">path</a></pre>
+<pre>protected final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.ZKTask.html#line.152">path</a></pre>
 </li>
 </ul>
 <a name="future">
@@ -277,7 +277,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClie
 <ul class="blockList">
 <li class="blockList">
 <h4>future</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html?is-external=true" title="class or interface in java.util.concurrent">CompletableFuture</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.ZKTask.html" title="type parameter in ReadOnlyZKClient.ZKTask">T</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.ZKTask.html#line.153">future</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html?is-external=true" title="class or interface in java.util.concurrent">CompletableFuture</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.ZKTask.html" title="type parameter in ReadOnlyZKClient.ZKTask">T</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.ZKTask.html#line.154">future</a></pre>
 </li>
 </ul>
 <a name="operationType">
@@ -286,7 +286,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClie
 <ul class="blockList">
 <li class="blockList">
 <h4>operationType</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.ZKTask.html#line.155">operationType</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.ZKTask.html#line.156">operationType</a></pre>
 </li>
 </ul>
 <a name="retries">
@@ -295,7 +295,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClie
 <ul class="blockListLast">
 <li class="blockList">
 <h4>retries</h4>
-<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.ZKTask.html#line.157">retries</a></pre>
+<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.ZKTask.html#line.158">retries</a></pre>
 </li>
 </ul>
 </li>
@@ -312,7 +312,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClie
 <ul class="blockListLast">
 <li class="blockList">
 <h4>ZKTask</h4>
-<pre>protected&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.ZKTask.html#line.159">ZKTask</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;path,
+<pre>protected&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.ZKTask.html#line.160">ZKTask</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;path,
                  <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html?is-external=true" title="class or interface in java.util.concurrent">CompletableFuture</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.ZKTask.html" title="type parameter in ReadOnlyZKClient.ZKTask">T</a>&gt;&nbsp;future,
                  <a href="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;operationType)</pre>
 </li>
@@ -333,7 +333,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClie
 <ul class="blockList">
 <li class="blockList">
 <h4>onComplete</h4>
-<pre>protected final&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.ZKTask.html#line.165">onComplete</a>(org.apache.zookeeper.ZooKeeper&nbsp;zk,
+<pre>protected final&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.ZKTask.html#line.166">onComplete</a>(org.apache.zookeeper.ZooKeeper&nbsp;zk,
                                 int&nbsp;rc,
                                 <a href="../../../../../org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.ZKTask.html" title="type parameter in ReadOnlyZKClient.ZKTask">T</a>&nbsp;ret,
                                 boolean&nbsp;errorIfNoNode)</pre>
@@ -345,7 +345,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClie
 <ul class="blockList">
 <li class="blockList">
 <h4>needZk</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.ZKTask.html#line.216">needZk</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.ZKTask.html#line.217">needZk</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.Task.html#needZk--">needZk</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.Task.html" title="class in org.apache.hadoop.hbase.zookeeper">ReadOnlyZKClient.Task</a></code></dd>
@@ -358,7 +358,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClie
 <ul class="blockList">
 <li class="blockList">
 <h4>doExec</h4>
-<pre>protected abstract&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.ZKTask.html#line.220">doExec</a>(org.apache.zookeeper.ZooKeeper&nbsp;zk)</pre>
+<pre>protected abstract&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.ZKTask.html#line.221">doExec</a>(org.apache.zookeeper.ZooKeeper&nbsp;zk)</pre>
 </li>
 </ul>
 <a name="exec-org.apache.zookeeper.ZooKeeper-">
@@ -367,7 +367,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClie
 <ul class="blockList">
 <li class="blockList">
 <h4>exec</h4>
-<pre>public final&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.ZKTask.html#line.223">exec</a>(org.apache.zookeeper.ZooKeeper&nbsp;zk)</pre>
+<pre>public final&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.ZKTask.html#line.224">exec</a>(org.apache.zookeeper.ZooKeeper&nbsp;zk)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.Task.html#exec-org.apache.zookeeper.ZooKeeper-">exec</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.Task.html" title="class in org.apache.hadoop.hbase.zookeeper">ReadOnlyZKClient.Task</a></code></dd>
@@ -380,7 +380,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClie
 <ul class="blockList">
 <li class="blockList">
 <h4>delay</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.ZKTask.html#line.228">delay</a>(long&nbsp;intervalMs,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.ZKTask.html#line.229">delay</a>(long&nbsp;intervalMs,
                      int&nbsp;maxRetries)</pre>
 </li>
 </ul>
@@ -390,7 +390,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClie
 <ul class="blockList">
 <li class="blockList">
 <h4>connectFailed</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.ZKTask.html#line.238">connectFailed</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>&nbsp;e)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.ZKTask.html#line.239">connectFailed</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>&nbsp;e)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.Task.html#connectFailed-java.io.IOException-">connectFailed</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.Task.html" title="class in org.apache.hadoop.hbase.zookeeper">ReadOnlyZKClient.Task</a></code></dd>
@@ -403,7 +403,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClie
 <ul class="blockListLast">
 <li class="blockList">
 <h4>closed</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.ZKTask.html#line.251">closed</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>&nbsp;e)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.ZKTask.html#line.252">closed</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>&nbsp;e)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.Task.html#closed-java.io.IOException-">closed</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.Task.html" title="class in org.apache.hadoop.hbase.zookeeper">ReadOnlyZKClient.Task</a></code></dd>
diff --git a/devapidocs/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html b/devapidocs/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html
index f8efc6a..4c85c99 100644
--- a/devapidocs/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html
+++ b/devapidocs/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10};
 var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -114,7 +114,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.Private
-public final class <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.50">ReadOnlyZKClient</a>
+public final class <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.51">ReadOnlyZKClient</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
 implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.html?is-external=true" title="class or interface in java.io">Closeable</a></pre>
 <div class="block">A very simple read only zookeeper implementation without watcher support.</div>
@@ -292,6 +292,10 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#getZk--">getZk</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i7" class="rowColor">
+<td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html?is-external=true" title="class or interface in java.util.concurrent">CompletableFuture</a>&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="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">Stri [...]
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#list-java.lang.String-">list</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;path)</code>&nbsp;</td>
+</tr>
+<tr id="i8" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#run--">run</a></span>()</code>&nbsp;</td>
 </tr>
@@ -323,7 +327,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.
 <ul class="blockList">
 <li class="blockList">
 <h4>LOG</h4>
-<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.52">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.53">LOG</a></pre>
 </li>
 </ul>
 <a name="RECOVERY_RETRY">
@@ -332,7 +336,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.
 <ul class="blockList">
 <li class="blockList">
 <h4>RECOVERY_RETRY</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.54">RECOVERY_RETRY</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.55">RECOVERY_RETRY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.zookeeper.ReadOnlyZKClient.RECOVERY_RETRY">Constant Field Values</a></dd>
@@ -345,7 +349,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_RECOVERY_RETRY</h4>
-<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.56">DEFAULT_RECOVERY_RETRY</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.57">DEFAULT_RECOVERY_RETRY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.zookeeper.ReadOnlyZKClient.DEFAULT_RECOVERY_RETRY">Constant Field Values</a></dd>
@@ -358,7 +362,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.
 <ul class="blockList">
 <li class="blockList">
 <h4>RECOVERY_RETRY_INTERVAL_MILLIS</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.58">RECOVERY_RETRY_INTERVAL_MILLIS</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.59">RECOVERY_RETRY_INTERVAL_MILLIS</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.zookeeper.ReadOnlyZKClient.RECOVERY_RETRY_INTERVAL_MILLIS">Constant Field Values</a></dd>
@@ -371,7 +375,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_RECOVERY_RETRY_INTERVAL_MILLIS</h4>
-<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.61">DEFAULT_RECOVERY_RETRY_INTERVAL_MILLIS</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.62">DEFAULT_RECOVERY_RETRY_INTERVAL_MILLIS</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.zookeeper.ReadOnlyZKClient.DEFAULT_RECOVERY_RETRY_INTERVAL_MILLIS">Constant Field Values</a></dd>
@@ -384,7 +388,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.
 <ul class="blockList">
 <li class="blockList">
 <h4>KEEPALIVE_MILLIS</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.63">KEEPALIVE_MILLIS</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.64">KEEPALIVE_MILLIS</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.zookeeper.ReadOnlyZKClient.KEEPALIVE_MILLIS">Constant Field Values</a></dd>
@@ -397,7 +401,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_KEEPALIVE_MILLIS</h4>
-<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.65">DEFAULT_KEEPALIVE_MILLIS</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.66">DEFAULT_KEEPALIVE_MILLIS</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.zookeeper.ReadOnlyZKClient.DEFAULT_KEEPALIVE_MILLIS">Constant Field Values</a></dd>
@@ -410,7 +414,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.
 <ul class="blockList">
 <li class="blockList">
 <h4>FAIL_FAST_CODES</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/EnumSet.html?is-external=true" title="class or interface in java.util">EnumSet</a>&lt;org.apache.zookeeper.KeeperException.Code&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.67">FAIL_FAST_CODES</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/EnumSet.html?is-external=true" title="class or interface in java.util">EnumSet</a>&lt;org.apache.zookeeper.KeeperException.Code&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.68">FAIL_FAST_CODES</a></pre>
 </li>
 </ul>
 <a name="connectString">
@@ -419,7 +423,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.
 <ul class="blockList">
 <li class="blockList">
 <h4>connectString</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.69">connectString</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.70">connectString</a></pre>
 </li>
 </ul>
 <a name="sessionTimeoutMs">
@@ -428,7 +432,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.
 <ul class="blockList">
 <li class="blockList">
 <h4>sessionTimeoutMs</h4>
-<pre>private final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.71">sessionTimeoutMs</a></pre>
+<pre>private final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.72">sessionTimeoutMs</a></pre>
 </li>
 </ul>
 <a name="maxRetries">
@@ -437,7 +441,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.
 <ul class="blockList">
 <li class="blockList">
 <h4>maxRetries</h4>
-<pre>private final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.73">maxRetries</a></pre>
+<pre>private final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.74">maxRetries</a></pre>
 </li>
 </ul>
 <a name="retryIntervalMs">
@@ -446,7 +450,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.
 <ul class="blockList">
 <li class="blockList">
 <h4>retryIntervalMs</h4>
-<pre>private final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.75">retryIntervalMs</a></pre>
+<pre>private final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.76">retryIntervalMs</a></pre>
 </li>
 </ul>
 <a name="keepAliveTimeMs">
@@ -455,7 +459,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.
 <ul class="blockList">
 <li class="blockList">
 <h4>keepAliveTimeMs</h4>
-<pre>private final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.77">keepAliveTimeMs</a></pre>
+<pre>private final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.78">keepAliveTimeMs</a></pre>
 </li>
 </ul>
 <a name="CLOSE">
@@ -464,7 +468,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.
 <ul class="blockList">
 <li class="blockList">
 <h4>CLOSE</h4>
-<pre>private static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.Task.html" title="class in org.apache.hadoop.hbase.zookeeper">ReadOnlyZKClient.Task</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.112">CLOSE</a></pre>
+<pre>private static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.Task.html" title="class in org.apache.hadoop.hbase.zookeeper">ReadOnlyZKClient.Task</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.113">CLOSE</a></pre>
 </li>
 </ul>
 <a name="tasks">
@@ -473,7 +477,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.
 <ul class="blockList">
 <li class="blockList">
 <h4>tasks</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/DelayQueue.html?is-external=true" title="class or interface in java.util.concurrent">DelayQueue</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.Task.html" title="class in org.apache.hadoop.hbase.zookeeper">ReadOnlyZKClient.Task</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.115">tasks</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/DelayQueue.html?is-external=true" title="class or interface in java.util.concurrent">DelayQueue</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.Task.html" title="class in org.apache.hadoop.hbase.zookeeper">ReadOnlyZKClient.Task</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.116">tasks</a></pre>
 </li>
 </ul>
 <a name="closed">
@@ -482,7 +486,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.
 <ul class="blockList">
 <li class="blockList">
 <h4>closed</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicBoolean.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicBoolean</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.117">closed</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicBoolean.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicBoolean</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.118">closed</a></pre>
 </li>
 </ul>
 <a name="zookeeper">
@@ -491,7 +495,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.
 <ul class="blockList">
 <li class="blockList">
 <h4>zookeeper</h4>
-<pre>org.apache.zookeeper.ZooKeeper <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.120">zookeeper</a></pre>
+<pre>org.apache.zookeeper.ZooKeeper <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.121">zookeeper</a></pre>
 </li>
 </ul>
 <a name="pendingRequests">
@@ -500,7 +504,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.
 <ul class="blockListLast">
 <li class="blockList">
 <h4>pendingRequests</h4>
-<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.122">pendingRequests</a></pre>
+<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.123">pendingRequests</a></pre>
 </li>
 </ul>
 </li>
@@ -517,7 +521,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.
 <ul class="blockListLast">
 <li class="blockList">
 <h4>ReadOnlyZKClient</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.128">ReadOnlyZKClient</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.129">ReadOnlyZKClient</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 </li>
 </ul>
 </li>
@@ -534,7 +538,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.
 <ul class="blockList">
 <li class="blockList">
 <h4>getId</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/zookeeper/ReadOnlyZKClient.html#line.124">getId</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/zookeeper/ReadOnlyZKClient.html#line.125">getId</a>()</pre>
 </li>
 </ul>
 <a name="get-java.lang.String-">
@@ -543,7 +547,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.
 <ul class="blockList">
 <li class="blockList">
 <h4>get</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html?is-external=true" title="class or interface in java.util.concurrent">CompletableFuture</a>&lt;byte[]&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.256">get</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;path)</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html?is-external=true" title="class or interface in java.util.concurrent">CompletableFuture</a>&lt;byte[]&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.257">get</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;path)</pre>
 </li>
 </ul>
 <a name="exists-java.lang.String-">
@@ -552,7 +556,16 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.
 <ul class="blockList">
 <li class="blockList">
 <h4>exists</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html?is-external=true" title="class or interface in java.util.concurrent">CompletableFuture</a>&lt;org.apache.zookeeper.data.Stat&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.272">exists</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">Strin [...]
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html?is-external=true" title="class or interface in java.util.concurrent">CompletableFuture</a>&lt;org.apache.zookeeper.data.Stat&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.273">exists</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">Strin [...]
+</li>
+</ul>
+<a name="list-java.lang.String-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>list</h4>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html?is-external=true" title="class or interface in java.util.concurrent">CompletableFuture</a>&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="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt; [...]
 </li>
 </ul>
 <a name="closeZk--">
@@ -561,7 +574,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.
 <ul class="blockList">
 <li class="blockList">
 <h4>closeZk</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.287">closeZk</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.304">closeZk</a>()</pre>
 </li>
 </ul>
 <a name="getZk--">
@@ -570,7 +583,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.
 <ul class="blockList">
 <li class="blockList">
 <h4>getZk</h4>
-<pre>private&nbsp;org.apache.zookeeper.ZooKeeper&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.297">getZk</a>()
+<pre>private&nbsp;org.apache.zookeeper.ZooKeeper&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.314">getZk</a>()
                                       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -584,7 +597,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.
 <ul class="blockList">
 <li class="blockList">
 <h4>run</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.305">run</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.322">run</a>()</pre>
 </li>
 </ul>
 <a name="close--">
@@ -593,7 +606,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.
 <ul class="blockList">
 <li class="blockList">
 <h4>close</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.344">close</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.361">close</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.html?is-external=true#close--" title="class or interface in java.io">close</a></code>&nbsp;in interface&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.html?is-external=true" title="class or interface in java.io">Closeable</a></code></dd>
@@ -608,7 +621,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getConnectString</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.352">getConnectString</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html#line.369">getConnectString</a>()</pre>
 </li>
 </ul>
 </li>
diff --git a/devapidocs/org/apache/hadoop/hbase/zookeeper/ZNodePaths.html b/devapidocs/org/apache/hadoop/hbase/zookeeper/ZNodePaths.html
index 69ff327..3445d70 100644
--- a/devapidocs/org/apache/hadoop/hbase/zookeeper/ZNodePaths.html
+++ b/devapidocs/org/apache/hadoop/hbase/zookeeper/ZNodePaths.html
@@ -618,7 +618,7 @@ public final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/S
 <div class="block">Parse the meta replicaId from the passed znode</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
-<dd><code>znode</code> - </dd>
+<dd><code>znode</code> - the name of the znode, does not include baseZNode</dd>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>replicaId</dd>
 </dl>
@@ -634,7 +634,7 @@ public final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/S
 <div class="block">Is it the default meta replica's znode</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
-<dd><code>znode</code> - </dd>
+<dd><code>znode</code> - the name of the znode, does not include baseZNode</dd>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>true or false</dd>
 </dl>
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/Version.html b/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
index 5ae33c3..e9b5616 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
@@ -18,9 +18,9 @@
 <span class="sourceLineNo">010</span>  public static final String version = "3.0.0-SNAPSHOT";<a name="line.10"></a>
 <span class="sourceLineNo">011</span>  public static final String revision = "Unknown";<a name="line.11"></a>
 <span class="sourceLineNo">012</span>  public static final String user = "jenkins";<a name="line.12"></a>
-<span class="sourceLineNo">013</span>  public static final String date = "Fri May 10 14:35:25 UTC 2019";<a name="line.13"></a>
+<span class="sourceLineNo">013</span>  public static final String date = "Sat May 11 14:34:49 UTC 2019";<a name="line.13"></a>
 <span class="sourceLineNo">014</span>  public static final String url = "file:///home/jenkins/jenkins-slave/workspace/hbase_generate_website/hbase";<a name="line.14"></a>
-<span class="sourceLineNo">015</span>  public static final String srcChecksum = "d3207878b048e8c902e2a3e9162791f0";<a name="line.15"></a>
+<span class="sourceLineNo">015</span>  public static final String srcChecksum = "07462550979c5f1c2a6e0a5b8b0f4caa";<a name="line.15"></a>
 <span class="sourceLineNo">016</span>}<a name="line.16"></a>
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/client/ZKAsyncRegistry.Converter.html b/devapidocs/src-html/org/apache/hadoop/hbase/client/ZKAsyncRegistry.Converter.html
index a6570b0..5097375 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/client/ZKAsyncRegistry.Converter.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/client/ZKAsyncRegistry.Converter.html
@@ -34,208 +34,227 @@
 <span class="sourceLineNo">026</span>import static org.apache.hadoop.hbase.zookeeper.ZKMetadata.removeMetaData;<a name="line.26"></a>
 <span class="sourceLineNo">027</span><a name="line.27"></a>
 <span class="sourceLineNo">028</span>import java.io.IOException;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import java.util.concurrent.CompletableFuture;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import org.apache.commons.lang3.mutable.MutableInt;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import org.apache.hadoop.conf.Configuration;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.ClusterId;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.HRegionLocation;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.RegionLocations;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.ServerName;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.exceptions.DeserializationException;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.master.RegionState;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.zookeeper.ReadOnlyZKClient;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.zookeeper.ZNodePaths;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.slf4j.Logger;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.slf4j.LoggerFactory;<a name="line.43"></a>
-<span class="sourceLineNo">044</span><a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.45"></a>
+<span class="sourceLineNo">029</span>import java.util.List;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import java.util.concurrent.CompletableFuture;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import java.util.stream.Collectors;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import org.apache.commons.lang3.mutable.MutableInt;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import org.apache.hadoop.conf.Configuration;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.ClusterId;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.HRegionLocation;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.RegionLocations;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.ServerName;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.exceptions.DeserializationException;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.master.RegionState;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.zookeeper.ReadOnlyZKClient;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.zookeeper.ZNodePaths;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.slf4j.Logger;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.slf4j.LoggerFactory;<a name="line.45"></a>
 <span class="sourceLineNo">046</span><a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ZooKeeperProtos;<a name="line.48"></a>
-<span class="sourceLineNo">049</span><a name="line.49"></a>
-<span class="sourceLineNo">050</span>/**<a name="line.50"></a>
-<span class="sourceLineNo">051</span> * Fetch the registry data from zookeeper.<a name="line.51"></a>
-<span class="sourceLineNo">052</span> */<a name="line.52"></a>
-<span class="sourceLineNo">053</span>@InterfaceAudience.Private<a name="line.53"></a>
-<span class="sourceLineNo">054</span>class ZKAsyncRegistry implements AsyncRegistry {<a name="line.54"></a>
-<span class="sourceLineNo">055</span><a name="line.55"></a>
-<span class="sourceLineNo">056</span>  private static final Logger LOG = LoggerFactory.getLogger(ZKAsyncRegistry.class);<a name="line.56"></a>
+<span class="sourceLineNo">047</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.47"></a>
+<span class="sourceLineNo">048</span><a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ZooKeeperProtos;<a name="line.50"></a>
+<span class="sourceLineNo">051</span><a name="line.51"></a>
+<span class="sourceLineNo">052</span>/**<a name="line.52"></a>
+<span class="sourceLineNo">053</span> * Fetch the registry data from zookeeper.<a name="line.53"></a>
+<span class="sourceLineNo">054</span> */<a name="line.54"></a>
+<span class="sourceLineNo">055</span>@InterfaceAudience.Private<a name="line.55"></a>
+<span class="sourceLineNo">056</span>class ZKAsyncRegistry implements AsyncRegistry {<a name="line.56"></a>
 <span class="sourceLineNo">057</span><a name="line.57"></a>
-<span class="sourceLineNo">058</span>  private final ReadOnlyZKClient zk;<a name="line.58"></a>
+<span class="sourceLineNo">058</span>  private static final Logger LOG = LoggerFactory.getLogger(ZKAsyncRegistry.class);<a name="line.58"></a>
 <span class="sourceLineNo">059</span><a name="line.59"></a>
-<span class="sourceLineNo">060</span>  private final ZNodePaths znodePaths;<a name="line.60"></a>
+<span class="sourceLineNo">060</span>  private final ReadOnlyZKClient zk;<a name="line.60"></a>
 <span class="sourceLineNo">061</span><a name="line.61"></a>
-<span class="sourceLineNo">062</span>  ZKAsyncRegistry(Configuration conf) {<a name="line.62"></a>
-<span class="sourceLineNo">063</span>    this.znodePaths = new ZNodePaths(conf);<a name="line.63"></a>
-<span class="sourceLineNo">064</span>    this.zk = new ReadOnlyZKClient(conf);<a name="line.64"></a>
-<span class="sourceLineNo">065</span>  }<a name="line.65"></a>
-<span class="sourceLineNo">066</span><a name="line.66"></a>
-<span class="sourceLineNo">067</span>  private interface Converter&lt;T&gt; {<a name="line.67"></a>
-<span class="sourceLineNo">068</span>    T convert(byte[] data) throws Exception;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>  }<a name="line.69"></a>
-<span class="sourceLineNo">070</span><a name="line.70"></a>
-<span class="sourceLineNo">071</span>  private &lt;T&gt; CompletableFuture&lt;T&gt; getAndConvert(String path, Converter&lt;T&gt; converter) {<a name="line.71"></a>
-<span class="sourceLineNo">072</span>    CompletableFuture&lt;T&gt; future = new CompletableFuture&lt;&gt;();<a name="line.72"></a>
-<span class="sourceLineNo">073</span>    addListener(zk.get(path), (data, error) -&gt; {<a name="line.73"></a>
-<span class="sourceLineNo">074</span>      if (error != null) {<a name="line.74"></a>
-<span class="sourceLineNo">075</span>        future.completeExceptionally(error);<a name="line.75"></a>
-<span class="sourceLineNo">076</span>        return;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>      }<a name="line.77"></a>
-<span class="sourceLineNo">078</span>      try {<a name="line.78"></a>
-<span class="sourceLineNo">079</span>        future.complete(converter.convert(data));<a name="line.79"></a>
-<span class="sourceLineNo">080</span>      } catch (Exception e) {<a name="line.80"></a>
-<span class="sourceLineNo">081</span>        future.completeExceptionally(e);<a name="line.81"></a>
-<span class="sourceLineNo">082</span>      }<a name="line.82"></a>
-<span class="sourceLineNo">083</span>    });<a name="line.83"></a>
-<span class="sourceLineNo">084</span>    return future;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>  }<a name="line.85"></a>
-<span class="sourceLineNo">086</span><a name="line.86"></a>
-<span class="sourceLineNo">087</span>  private static String getClusterId(byte[] data) throws DeserializationException {<a name="line.87"></a>
-<span class="sourceLineNo">088</span>    if (data == null || data.length == 0) {<a name="line.88"></a>
-<span class="sourceLineNo">089</span>      return null;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>    }<a name="line.90"></a>
-<span class="sourceLineNo">091</span>    data = removeMetaData(data);<a name="line.91"></a>
-<span class="sourceLineNo">092</span>    return ClusterId.parseFrom(data).toString();<a name="line.92"></a>
-<span class="sourceLineNo">093</span>  }<a name="line.93"></a>
-<span class="sourceLineNo">094</span><a name="line.94"></a>
-<span class="sourceLineNo">095</span>  @Override<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  public CompletableFuture&lt;String&gt; getClusterId() {<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    return getAndConvert(znodePaths.clusterIdZNode, ZKAsyncRegistry::getClusterId);<a name="line.97"></a>
-<span class="sourceLineNo">098</span>  }<a name="line.98"></a>
-<span class="sourceLineNo">099</span><a name="line.99"></a>
-<span class="sourceLineNo">100</span>  @VisibleForTesting<a name="line.100"></a>
-<span class="sourceLineNo">101</span>  ReadOnlyZKClient getZKClient() {<a name="line.101"></a>
-<span class="sourceLineNo">102</span>    return zk;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  }<a name="line.103"></a>
-<span class="sourceLineNo">104</span><a name="line.104"></a>
-<span class="sourceLineNo">105</span>  private static ZooKeeperProtos.MetaRegionServer getMetaProto(byte[] data) throws IOException {<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    if (data == null || data.length == 0) {<a name="line.106"></a>
-<span class="sourceLineNo">107</span>      return null;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>    }<a name="line.108"></a>
-<span class="sourceLineNo">109</span>    data = removeMetaData(data);<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    int prefixLen = lengthOfPBMagic();<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    return ZooKeeperProtos.MetaRegionServer.parser().parseFrom(data, prefixLen,<a name="line.111"></a>
-<span class="sourceLineNo">112</span>      data.length - prefixLen);<a name="line.112"></a>
-<span class="sourceLineNo">113</span>  }<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>  private static void tryComplete(MutableInt remaining, HRegionLocation[] locs,<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      CompletableFuture&lt;RegionLocations&gt; future) {<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    remaining.decrement();<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    if (remaining.intValue() &gt; 0) {<a name="line.118"></a>
-<span class="sourceLineNo">119</span>      return;<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    }<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    future.complete(new RegionLocations(locs));<a name="line.121"></a>
-<span class="sourceLineNo">122</span>  }<a name="line.122"></a>
-<span class="sourceLineNo">123</span><a name="line.123"></a>
-<span class="sourceLineNo">124</span>  private Pair&lt;RegionState.State, ServerName&gt; getStateAndServerName(<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      ZooKeeperProtos.MetaRegionServer proto) {<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    RegionState.State state;<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    if (proto.hasState()) {<a name="line.127"></a>
-<span class="sourceLineNo">128</span>      state = RegionState.State.convert(proto.getState());<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    } else {<a name="line.129"></a>
-<span class="sourceLineNo">130</span>      state = RegionState.State.OPEN;<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    }<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    HBaseProtos.ServerName snProto = proto.getServer();<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    return Pair.newPair(state,<a name="line.133"></a>
-<span class="sourceLineNo">134</span>      ServerName.valueOf(snProto.getHostName(), snProto.getPort(), snProto.getStartCode()));<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  }<a name="line.135"></a>
-<span class="sourceLineNo">136</span><a name="line.136"></a>
-<span class="sourceLineNo">137</span>  @Override<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  public CompletableFuture&lt;RegionLocations&gt; getMetaRegionLocation() {<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    CompletableFuture&lt;RegionLocations&gt; future = new CompletableFuture&lt;&gt;();<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    HRegionLocation[] locs = new HRegionLocation[znodePaths.metaReplicaZNodes.size()];<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    MutableInt remaining = new MutableInt(locs.length);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    znodePaths.metaReplicaZNodes.forEach((replicaId, path) -&gt; {<a name="line.142"></a>
-<span class="sourceLineNo">143</span>      if (replicaId == DEFAULT_REPLICA_ID) {<a name="line.143"></a>
-<span class="sourceLineNo">144</span>        addListener(getAndConvert(path, ZKAsyncRegistry::getMetaProto), (proto, error) -&gt; {<a name="line.144"></a>
-<span class="sourceLineNo">145</span>          if (error != null) {<a name="line.145"></a>
-<span class="sourceLineNo">146</span>            future.completeExceptionally(error);<a name="line.146"></a>
-<span class="sourceLineNo">147</span>            return;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>          }<a name="line.148"></a>
-<span class="sourceLineNo">149</span>          if (proto == null) {<a name="line.149"></a>
-<span class="sourceLineNo">150</span>            future.completeExceptionally(new IOException("Meta znode is null"));<a name="line.150"></a>
-<span class="sourceLineNo">151</span>            return;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>          }<a name="line.152"></a>
-<span class="sourceLineNo">153</span>          Pair&lt;RegionState.State, ServerName&gt; stateAndServerName = getStateAndServerName(proto);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>          if (stateAndServerName.getFirst() != RegionState.State.OPEN) {<a name="line.154"></a>
-<span class="sourceLineNo">155</span>            future.completeExceptionally(<a name="line.155"></a>
-<span class="sourceLineNo">156</span>              new IOException("Meta region is in state " + stateAndServerName.getFirst()));<a name="line.156"></a>
-<span class="sourceLineNo">157</span>            return;<a name="line.157"></a>
-<span class="sourceLineNo">158</span>          }<a name="line.158"></a>
-<span class="sourceLineNo">159</span>          locs[DEFAULT_REPLICA_ID] = new HRegionLocation(<a name="line.159"></a>
-<span class="sourceLineNo">160</span>            getRegionInfoForDefaultReplica(FIRST_META_REGIONINFO), stateAndServerName.getSecond());<a name="line.160"></a>
-<span class="sourceLineNo">161</span>          tryComplete(remaining, locs, future);<a name="line.161"></a>
-<span class="sourceLineNo">162</span>        });<a name="line.162"></a>
-<span class="sourceLineNo">163</span>      } else {<a name="line.163"></a>
-<span class="sourceLineNo">164</span>        addListener(getAndConvert(path, ZKAsyncRegistry::getMetaProto), (proto, error) -&gt; {<a name="line.164"></a>
-<span class="sourceLineNo">165</span>          if (future.isDone()) {<a name="line.165"></a>
-<span class="sourceLineNo">166</span>            return;<a name="line.166"></a>
-<span class="sourceLineNo">167</span>          }<a name="line.167"></a>
-<span class="sourceLineNo">168</span>          if (error != null) {<a name="line.168"></a>
-<span class="sourceLineNo">169</span>            LOG.warn("Failed to fetch " + path, error);<a name="line.169"></a>
-<span class="sourceLineNo">170</span>            locs[replicaId] = null;<a name="line.170"></a>
-<span class="sourceLineNo">171</span>          } else if (proto == null) {<a name="line.171"></a>
-<span class="sourceLineNo">172</span>            LOG.warn("Meta znode for replica " + replicaId + " is null");<a name="line.172"></a>
+<span class="sourceLineNo">062</span>  private final ZNodePaths znodePaths;<a name="line.62"></a>
+<span class="sourceLineNo">063</span><a name="line.63"></a>
+<span class="sourceLineNo">064</span>  ZKAsyncRegistry(Configuration conf) {<a name="line.64"></a>
+<span class="sourceLineNo">065</span>    this.znodePaths = new ZNodePaths(conf);<a name="line.65"></a>
+<span class="sourceLineNo">066</span>    this.zk = new ReadOnlyZKClient(conf);<a name="line.66"></a>
+<span class="sourceLineNo">067</span>  }<a name="line.67"></a>
+<span class="sourceLineNo">068</span><a name="line.68"></a>
+<span class="sourceLineNo">069</span>  private interface Converter&lt;T&gt; {<a name="line.69"></a>
+<span class="sourceLineNo">070</span>    T convert(byte[] data) throws Exception;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>  }<a name="line.71"></a>
+<span class="sourceLineNo">072</span><a name="line.72"></a>
+<span class="sourceLineNo">073</span>  private &lt;T&gt; CompletableFuture&lt;T&gt; getAndConvert(String path, Converter&lt;T&gt; converter) {<a name="line.73"></a>
+<span class="sourceLineNo">074</span>    CompletableFuture&lt;T&gt; future = new CompletableFuture&lt;&gt;();<a name="line.74"></a>
+<span class="sourceLineNo">075</span>    addListener(zk.get(path), (data, error) -&gt; {<a name="line.75"></a>
+<span class="sourceLineNo">076</span>      if (error != null) {<a name="line.76"></a>
+<span class="sourceLineNo">077</span>        future.completeExceptionally(error);<a name="line.77"></a>
+<span class="sourceLineNo">078</span>        return;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>      }<a name="line.79"></a>
+<span class="sourceLineNo">080</span>      try {<a name="line.80"></a>
+<span class="sourceLineNo">081</span>        future.complete(converter.convert(data));<a name="line.81"></a>
+<span class="sourceLineNo">082</span>      } catch (Exception e) {<a name="line.82"></a>
+<span class="sourceLineNo">083</span>        future.completeExceptionally(e);<a name="line.83"></a>
+<span class="sourceLineNo">084</span>      }<a name="line.84"></a>
+<span class="sourceLineNo">085</span>    });<a name="line.85"></a>
+<span class="sourceLineNo">086</span>    return future;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>  }<a name="line.87"></a>
+<span class="sourceLineNo">088</span><a name="line.88"></a>
+<span class="sourceLineNo">089</span>  private static String getClusterId(byte[] data) throws DeserializationException {<a name="line.89"></a>
+<span class="sourceLineNo">090</span>    if (data == null || data.length == 0) {<a name="line.90"></a>
+<span class="sourceLineNo">091</span>      return null;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>    }<a name="line.92"></a>
+<span class="sourceLineNo">093</span>    data = removeMetaData(data);<a name="line.93"></a>
+<span class="sourceLineNo">094</span>    return ClusterId.parseFrom(data).toString();<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  }<a name="line.95"></a>
+<span class="sourceLineNo">096</span><a name="line.96"></a>
+<span class="sourceLineNo">097</span>  @Override<a name="line.97"></a>
+<span class="sourceLineNo">098</span>  public CompletableFuture&lt;String&gt; getClusterId() {<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    return getAndConvert(znodePaths.clusterIdZNode, ZKAsyncRegistry::getClusterId);<a name="line.99"></a>
+<span class="sourceLineNo">100</span>  }<a name="line.100"></a>
+<span class="sourceLineNo">101</span><a name="line.101"></a>
+<span class="sourceLineNo">102</span>  @VisibleForTesting<a name="line.102"></a>
+<span class="sourceLineNo">103</span>  ReadOnlyZKClient getZKClient() {<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    return zk;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>  }<a name="line.105"></a>
+<span class="sourceLineNo">106</span><a name="line.106"></a>
+<span class="sourceLineNo">107</span>  private static ZooKeeperProtos.MetaRegionServer getMetaProto(byte[] data) throws IOException {<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    if (data == null || data.length == 0) {<a name="line.108"></a>
+<span class="sourceLineNo">109</span>      return null;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    }<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    data = removeMetaData(data);<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    int prefixLen = lengthOfPBMagic();<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    return ZooKeeperProtos.MetaRegionServer.parser().parseFrom(data, prefixLen,<a name="line.113"></a>
+<span class="sourceLineNo">114</span>      data.length - prefixLen);<a name="line.114"></a>
+<span class="sourceLineNo">115</span>  }<a name="line.115"></a>
+<span class="sourceLineNo">116</span><a name="line.116"></a>
+<span class="sourceLineNo">117</span>  private static void tryComplete(MutableInt remaining, HRegionLocation[] locs,<a name="line.117"></a>
+<span class="sourceLineNo">118</span>      CompletableFuture&lt;RegionLocations&gt; future) {<a name="line.118"></a>
+<span class="sourceLineNo">119</span>    remaining.decrement();<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    if (remaining.intValue() &gt; 0) {<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      return;<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    }<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    future.complete(new RegionLocations(locs));<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  }<a name="line.124"></a>
+<span class="sourceLineNo">125</span><a name="line.125"></a>
+<span class="sourceLineNo">126</span>  private Pair&lt;RegionState.State, ServerName&gt; getStateAndServerName(<a name="line.126"></a>
+<span class="sourceLineNo">127</span>      ZooKeeperProtos.MetaRegionServer proto) {<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    RegionState.State state;<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    if (proto.hasState()) {<a name="line.129"></a>
+<span class="sourceLineNo">130</span>      state = RegionState.State.convert(proto.getState());<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    } else {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      state = RegionState.State.OPEN;<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    }<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    HBaseProtos.ServerName snProto = proto.getServer();<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    return Pair.newPair(state,<a name="line.135"></a>
+<span class="sourceLineNo">136</span>      ServerName.valueOf(snProto.getHostName(), snProto.getPort(), snProto.getStartCode()));<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  }<a name="line.137"></a>
+<span class="sourceLineNo">138</span><a name="line.138"></a>
+<span class="sourceLineNo">139</span>  private void getMetaRegionLocation(CompletableFuture&lt;RegionLocations&gt; future,<a name="line.139"></a>
+<span class="sourceLineNo">140</span>      List&lt;String&gt; metaReplicaZNodes) {<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    HRegionLocation[] locs = new HRegionLocation[metaReplicaZNodes.size()];<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    MutableInt remaining = new MutableInt(locs.length);<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    for (String metaReplicaZNode : metaReplicaZNodes) {<a name="line.143"></a>
+<span class="sourceLineNo">144</span>      int replicaId = znodePaths.getMetaReplicaIdFromZnode(metaReplicaZNode);<a name="line.144"></a>
+<span class="sourceLineNo">145</span>      String path = ZNodePaths.joinZNode(znodePaths.baseZNode, metaReplicaZNode);<a name="line.145"></a>
+<span class="sourceLineNo">146</span>      if (replicaId == DEFAULT_REPLICA_ID) {<a name="line.146"></a>
+<span class="sourceLineNo">147</span>        addListener(getAndConvert(path, ZKAsyncRegistry::getMetaProto), (proto, error) -&gt; {<a name="line.147"></a>
+<span class="sourceLineNo">148</span>          if (error != null) {<a name="line.148"></a>
+<span class="sourceLineNo">149</span>            future.completeExceptionally(error);<a name="line.149"></a>
+<span class="sourceLineNo">150</span>            return;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>          }<a name="line.151"></a>
+<span class="sourceLineNo">152</span>          if (proto == null) {<a name="line.152"></a>
+<span class="sourceLineNo">153</span>            future.completeExceptionally(new IOException("Meta znode is null"));<a name="line.153"></a>
+<span class="sourceLineNo">154</span>            return;<a name="line.154"></a>
+<span class="sourceLineNo">155</span>          }<a name="line.155"></a>
+<span class="sourceLineNo">156</span>          Pair&lt;RegionState.State, ServerName&gt; stateAndServerName = getStateAndServerName(proto);<a name="line.156"></a>
+<span class="sourceLineNo">157</span>          if (stateAndServerName.getFirst() != RegionState.State.OPEN) {<a name="line.157"></a>
+<span class="sourceLineNo">158</span>            future.completeExceptionally(<a name="line.158"></a>
+<span class="sourceLineNo">159</span>              new IOException("Meta region is in state " + stateAndServerName.getFirst()));<a name="line.159"></a>
+<span class="sourceLineNo">160</span>            return;<a name="line.160"></a>
+<span class="sourceLineNo">161</span>          }<a name="line.161"></a>
+<span class="sourceLineNo">162</span>          locs[DEFAULT_REPLICA_ID] = new HRegionLocation(<a name="line.162"></a>
+<span class="sourceLineNo">163</span>            getRegionInfoForDefaultReplica(FIRST_META_REGIONINFO), stateAndServerName.getSecond());<a name="line.163"></a>
+<span class="sourceLineNo">164</span>          tryComplete(remaining, locs, future);<a name="line.164"></a>
+<span class="sourceLineNo">165</span>        });<a name="line.165"></a>
+<span class="sourceLineNo">166</span>      } else {<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        addListener(getAndConvert(path, ZKAsyncRegistry::getMetaProto), (proto, error) -&gt; {<a name="line.167"></a>
+<span class="sourceLineNo">168</span>          if (future.isDone()) {<a name="line.168"></a>
+<span class="sourceLineNo">169</span>            return;<a name="line.169"></a>
+<span class="sourceLineNo">170</span>          }<a name="line.170"></a>
+<span class="sourceLineNo">171</span>          if (error != null) {<a name="line.171"></a>
+<span class="sourceLineNo">172</span>            LOG.warn("Failed to fetch " + path, error);<a name="line.172"></a>
 <span class="sourceLineNo">173</span>            locs[replicaId] = null;<a name="line.173"></a>
-<span class="sourceLineNo">174</span>          } else {<a name="line.174"></a>
-<span class="sourceLineNo">175</span>            Pair&lt;RegionState.State, ServerName&gt; stateAndServerName = getStateAndServerName(proto);<a name="line.175"></a>
-<span class="sourceLineNo">176</span>            if (stateAndServerName.getFirst() != RegionState.State.OPEN) {<a name="line.176"></a>
-<span class="sourceLineNo">177</span>              LOG.warn("Meta region for replica " + replicaId + " is in state " +<a name="line.177"></a>
-<span class="sourceLineNo">178</span>                stateAndServerName.getFirst());<a name="line.178"></a>
-<span class="sourceLineNo">179</span>              locs[replicaId] = null;<a name="line.179"></a>
-<span class="sourceLineNo">180</span>            } else {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>              locs[replicaId] =<a name="line.181"></a>
-<span class="sourceLineNo">182</span>                new HRegionLocation(getRegionInfoForReplica(FIRST_META_REGIONINFO, replicaId),<a name="line.182"></a>
-<span class="sourceLineNo">183</span>                  stateAndServerName.getSecond());<a name="line.183"></a>
-<span class="sourceLineNo">184</span>            }<a name="line.184"></a>
-<span class="sourceLineNo">185</span>          }<a name="line.185"></a>
-<span class="sourceLineNo">186</span>          tryComplete(remaining, locs, future);<a name="line.186"></a>
-<span class="sourceLineNo">187</span>        });<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      }<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    });<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    return future;<a name="line.190"></a>
-<span class="sourceLineNo">191</span>  }<a name="line.191"></a>
-<span class="sourceLineNo">192</span><a name="line.192"></a>
-<span class="sourceLineNo">193</span>  @Override<a name="line.193"></a>
-<span class="sourceLineNo">194</span>  public CompletableFuture&lt;Integer&gt; getCurrentNrHRS() {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    return zk.exists(znodePaths.rsZNode).thenApply(s -&gt; s != null ? s.getNumChildren() : 0);<a name="line.195"></a>
-<span class="sourceLineNo">196</span>  }<a name="line.196"></a>
-<span class="sourceLineNo">197</span><a name="line.197"></a>
-<span class="sourceLineNo">198</span>  private static ZooKeeperProtos.Master getMasterProto(byte[] data) throws IOException {<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    if (data == null || data.length == 0) {<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      return null;<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    }<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    data = removeMetaData(data);<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    int prefixLen = lengthOfPBMagic();<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    return ZooKeeperProtos.Master.parser().parseFrom(data, prefixLen, data.length - prefixLen);<a name="line.204"></a>
-<span class="sourceLineNo">205</span>  }<a name="line.205"></a>
-<span class="sourceLineNo">206</span><a name="line.206"></a>
-<span class="sourceLineNo">207</span>  @Override<a name="line.207"></a>
-<span class="sourceLineNo">208</span>  public CompletableFuture&lt;ServerName&gt; getMasterAddress() {<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    return getAndConvert(znodePaths.masterAddressZNode, ZKAsyncRegistry::getMasterProto)<a name="line.209"></a>
-<span class="sourceLineNo">210</span>        .thenApply(proto -&gt; {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>          if (proto == null) {<a name="line.211"></a>
-<span class="sourceLineNo">212</span>            return null;<a name="line.212"></a>
-<span class="sourceLineNo">213</span>          }<a name="line.213"></a>
-<span class="sourceLineNo">214</span>          HBaseProtos.ServerName snProto = proto.getMaster();<a name="line.214"></a>
-<span class="sourceLineNo">215</span>          return ServerName.valueOf(snProto.getHostName(), snProto.getPort(),<a name="line.215"></a>
-<span class="sourceLineNo">216</span>            snProto.getStartCode());<a name="line.216"></a>
-<span class="sourceLineNo">217</span>        });<a name="line.217"></a>
-<span class="sourceLineNo">218</span>  }<a name="line.218"></a>
-<span class="sourceLineNo">219</span><a name="line.219"></a>
-<span class="sourceLineNo">220</span>  @Override<a name="line.220"></a>
-<span class="sourceLineNo">221</span>  public CompletableFuture&lt;Integer&gt; getMasterInfoPort() {<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    return getAndConvert(znodePaths.masterAddressZNode, ZKAsyncRegistry::getMasterProto)<a name="line.222"></a>
-<span class="sourceLineNo">223</span>        .thenApply(proto -&gt; proto != null ? proto.getInfoPort() : 0);<a name="line.223"></a>
+<span class="sourceLineNo">174</span>          } else if (proto == null) {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>            LOG.warn("Meta znode for replica " + replicaId + " is null");<a name="line.175"></a>
+<span class="sourceLineNo">176</span>            locs[replicaId] = null;<a name="line.176"></a>
+<span class="sourceLineNo">177</span>          } else {<a name="line.177"></a>
+<span class="sourceLineNo">178</span>            Pair&lt;RegionState.State, ServerName&gt; stateAndServerName = getStateAndServerName(proto);<a name="line.178"></a>
+<span class="sourceLineNo">179</span>            if (stateAndServerName.getFirst() != RegionState.State.OPEN) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>              LOG.warn("Meta region for replica " + replicaId + " is in state " +<a name="line.180"></a>
+<span class="sourceLineNo">181</span>                stateAndServerName.getFirst());<a name="line.181"></a>
+<span class="sourceLineNo">182</span>              locs[replicaId] = null;<a name="line.182"></a>
+<span class="sourceLineNo">183</span>            } else {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>              locs[replicaId] =<a name="line.184"></a>
+<span class="sourceLineNo">185</span>                new HRegionLocation(getRegionInfoForReplica(FIRST_META_REGIONINFO, replicaId),<a name="line.185"></a>
+<span class="sourceLineNo">186</span>                  stateAndServerName.getSecond());<a name="line.186"></a>
+<span class="sourceLineNo">187</span>            }<a name="line.187"></a>
+<span class="sourceLineNo">188</span>          }<a name="line.188"></a>
+<span class="sourceLineNo">189</span>          tryComplete(remaining, locs, future);<a name="line.189"></a>
+<span class="sourceLineNo">190</span>        });<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      }<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    }<a name="line.192"></a>
+<span class="sourceLineNo">193</span>  }<a name="line.193"></a>
+<span class="sourceLineNo">194</span><a name="line.194"></a>
+<span class="sourceLineNo">195</span>  @Override<a name="line.195"></a>
+<span class="sourceLineNo">196</span>  public CompletableFuture&lt;RegionLocations&gt; getMetaRegionLocation() {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    CompletableFuture&lt;RegionLocations&gt; future = new CompletableFuture&lt;&gt;();<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    addListener(<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      zk.list(znodePaths.baseZNode)<a name="line.199"></a>
+<span class="sourceLineNo">200</span>        .thenApply(children -&gt; children.stream()<a name="line.200"></a>
+<span class="sourceLineNo">201</span>          .filter(c -&gt; c.startsWith(znodePaths.metaZNodePrefix)).collect(Collectors.toList())),<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      (metaReplicaZNodes, error) -&gt; {<a name="line.202"></a>
+<span class="sourceLineNo">203</span>        if (error != null) {<a name="line.203"></a>
+<span class="sourceLineNo">204</span>          future.completeExceptionally(error);<a name="line.204"></a>
+<span class="sourceLineNo">205</span>          return;<a name="line.205"></a>
+<span class="sourceLineNo">206</span>        }<a name="line.206"></a>
+<span class="sourceLineNo">207</span>        getMetaRegionLocation(future, metaReplicaZNodes);<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      });<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    return future;<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>  @Override<a name="line.212"></a>
+<span class="sourceLineNo">213</span>  public CompletableFuture&lt;Integer&gt; getCurrentNrHRS() {<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    return zk.exists(znodePaths.rsZNode).thenApply(s -&gt; s != null ? s.getNumChildren() : 0);<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 static ZooKeeperProtos.Master getMasterProto(byte[] data) throws IOException {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    if (data == null || data.length == 0) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      return null;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    }<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    data = removeMetaData(data);<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    int prefixLen = lengthOfPBMagic();<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    return ZooKeeperProtos.Master.parser().parseFrom(data, prefixLen, data.length - prefixLen);<a name="line.223"></a>
 <span class="sourceLineNo">224</span>  }<a name="line.224"></a>
 <span class="sourceLineNo">225</span><a name="line.225"></a>
 <span class="sourceLineNo">226</span>  @Override<a name="line.226"></a>
-<span class="sourceLineNo">227</span>  public void close() {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    zk.close();<a name="line.228"></a>
-<span class="sourceLineNo">229</span>  }<a name="line.229"></a>
-<span class="sourceLineNo">230</span>}<a name="line.230"></a>
+<span class="sourceLineNo">227</span>  public CompletableFuture&lt;ServerName&gt; getMasterAddress() {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    return getAndConvert(znodePaths.masterAddressZNode, ZKAsyncRegistry::getMasterProto)<a name="line.228"></a>
+<span class="sourceLineNo">229</span>        .thenApply(proto -&gt; {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>          if (proto == null) {<a name="line.230"></a>
+<span class="sourceLineNo">231</span>            return null;<a name="line.231"></a>
+<span class="sourceLineNo">232</span>          }<a name="line.232"></a>
+<span class="sourceLineNo">233</span>          HBaseProtos.ServerName snProto = proto.getMaster();<a name="line.233"></a>
+<span class="sourceLineNo">234</span>          return ServerName.valueOf(snProto.getHostName(), snProto.getPort(),<a name="line.234"></a>
+<span class="sourceLineNo">235</span>            snProto.getStartCode());<a name="line.235"></a>
+<span class="sourceLineNo">236</span>        });<a name="line.236"></a>
+<span class="sourceLineNo">237</span>  }<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>  @Override<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  public CompletableFuture&lt;Integer&gt; getMasterInfoPort() {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    return getAndConvert(znodePaths.masterAddressZNode, ZKAsyncRegistry::getMasterProto)<a name="line.241"></a>
+<span class="sourceLineNo">242</span>        .thenApply(proto -&gt; proto != null ? proto.getInfoPort() : 0);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  }<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>  @Override<a name="line.245"></a>
+<span class="sourceLineNo">246</span>  public void close() {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    zk.close();<a name="line.247"></a>
+<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
+<span class="sourceLineNo">249</span>}<a name="line.249"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/client/ZKAsyncRegistry.html b/devapidocs/src-html/org/apache/hadoop/hbase/client/ZKAsyncRegistry.html
index a6570b0..5097375 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/client/ZKAsyncRegistry.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/client/ZKAsyncRegistry.html
@@ -34,208 +34,227 @@
 <span class="sourceLineNo">026</span>import static org.apache.hadoop.hbase.zookeeper.ZKMetadata.removeMetaData;<a name="line.26"></a>
 <span class="sourceLineNo">027</span><a name="line.27"></a>
 <span class="sourceLineNo">028</span>import java.io.IOException;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import java.util.concurrent.CompletableFuture;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import org.apache.commons.lang3.mutable.MutableInt;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import org.apache.hadoop.conf.Configuration;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.ClusterId;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.HRegionLocation;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.RegionLocations;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.ServerName;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.exceptions.DeserializationException;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.master.RegionState;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.zookeeper.ReadOnlyZKClient;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.zookeeper.ZNodePaths;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.slf4j.Logger;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.slf4j.LoggerFactory;<a name="line.43"></a>
-<span class="sourceLineNo">044</span><a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.45"></a>
+<span class="sourceLineNo">029</span>import java.util.List;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import java.util.concurrent.CompletableFuture;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import java.util.stream.Collectors;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import org.apache.commons.lang3.mutable.MutableInt;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import org.apache.hadoop.conf.Configuration;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.ClusterId;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.HRegionLocation;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.RegionLocations;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.ServerName;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.exceptions.DeserializationException;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.master.RegionState;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.zookeeper.ReadOnlyZKClient;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.zookeeper.ZNodePaths;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.slf4j.Logger;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.slf4j.LoggerFactory;<a name="line.45"></a>
 <span class="sourceLineNo">046</span><a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ZooKeeperProtos;<a name="line.48"></a>
-<span class="sourceLineNo">049</span><a name="line.49"></a>
-<span class="sourceLineNo">050</span>/**<a name="line.50"></a>
-<span class="sourceLineNo">051</span> * Fetch the registry data from zookeeper.<a name="line.51"></a>
-<span class="sourceLineNo">052</span> */<a name="line.52"></a>
-<span class="sourceLineNo">053</span>@InterfaceAudience.Private<a name="line.53"></a>
-<span class="sourceLineNo">054</span>class ZKAsyncRegistry implements AsyncRegistry {<a name="line.54"></a>
-<span class="sourceLineNo">055</span><a name="line.55"></a>
-<span class="sourceLineNo">056</span>  private static final Logger LOG = LoggerFactory.getLogger(ZKAsyncRegistry.class);<a name="line.56"></a>
+<span class="sourceLineNo">047</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.47"></a>
+<span class="sourceLineNo">048</span><a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ZooKeeperProtos;<a name="line.50"></a>
+<span class="sourceLineNo">051</span><a name="line.51"></a>
+<span class="sourceLineNo">052</span>/**<a name="line.52"></a>
+<span class="sourceLineNo">053</span> * Fetch the registry data from zookeeper.<a name="line.53"></a>
+<span class="sourceLineNo">054</span> */<a name="line.54"></a>
+<span class="sourceLineNo">055</span>@InterfaceAudience.Private<a name="line.55"></a>
+<span class="sourceLineNo">056</span>class ZKAsyncRegistry implements AsyncRegistry {<a name="line.56"></a>
 <span class="sourceLineNo">057</span><a name="line.57"></a>
-<span class="sourceLineNo">058</span>  private final ReadOnlyZKClient zk;<a name="line.58"></a>
+<span class="sourceLineNo">058</span>  private static final Logger LOG = LoggerFactory.getLogger(ZKAsyncRegistry.class);<a name="line.58"></a>
 <span class="sourceLineNo">059</span><a name="line.59"></a>
-<span class="sourceLineNo">060</span>  private final ZNodePaths znodePaths;<a name="line.60"></a>
+<span class="sourceLineNo">060</span>  private final ReadOnlyZKClient zk;<a name="line.60"></a>
 <span class="sourceLineNo">061</span><a name="line.61"></a>
-<span class="sourceLineNo">062</span>  ZKAsyncRegistry(Configuration conf) {<a name="line.62"></a>
-<span class="sourceLineNo">063</span>    this.znodePaths = new ZNodePaths(conf);<a name="line.63"></a>
-<span class="sourceLineNo">064</span>    this.zk = new ReadOnlyZKClient(conf);<a name="line.64"></a>
-<span class="sourceLineNo">065</span>  }<a name="line.65"></a>
-<span class="sourceLineNo">066</span><a name="line.66"></a>
-<span class="sourceLineNo">067</span>  private interface Converter&lt;T&gt; {<a name="line.67"></a>
-<span class="sourceLineNo">068</span>    T convert(byte[] data) throws Exception;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>  }<a name="line.69"></a>
-<span class="sourceLineNo">070</span><a name="line.70"></a>
-<span class="sourceLineNo">071</span>  private &lt;T&gt; CompletableFuture&lt;T&gt; getAndConvert(String path, Converter&lt;T&gt; converter) {<a name="line.71"></a>
-<span class="sourceLineNo">072</span>    CompletableFuture&lt;T&gt; future = new CompletableFuture&lt;&gt;();<a name="line.72"></a>
-<span class="sourceLineNo">073</span>    addListener(zk.get(path), (data, error) -&gt; {<a name="line.73"></a>
-<span class="sourceLineNo">074</span>      if (error != null) {<a name="line.74"></a>
-<span class="sourceLineNo">075</span>        future.completeExceptionally(error);<a name="line.75"></a>
-<span class="sourceLineNo">076</span>        return;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>      }<a name="line.77"></a>
-<span class="sourceLineNo">078</span>      try {<a name="line.78"></a>
-<span class="sourceLineNo">079</span>        future.complete(converter.convert(data));<a name="line.79"></a>
-<span class="sourceLineNo">080</span>      } catch (Exception e) {<a name="line.80"></a>
-<span class="sourceLineNo">081</span>        future.completeExceptionally(e);<a name="line.81"></a>
-<span class="sourceLineNo">082</span>      }<a name="line.82"></a>
-<span class="sourceLineNo">083</span>    });<a name="line.83"></a>
-<span class="sourceLineNo">084</span>    return future;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>  }<a name="line.85"></a>
-<span class="sourceLineNo">086</span><a name="line.86"></a>
-<span class="sourceLineNo">087</span>  private static String getClusterId(byte[] data) throws DeserializationException {<a name="line.87"></a>
-<span class="sourceLineNo">088</span>    if (data == null || data.length == 0) {<a name="line.88"></a>
-<span class="sourceLineNo">089</span>      return null;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>    }<a name="line.90"></a>
-<span class="sourceLineNo">091</span>    data = removeMetaData(data);<a name="line.91"></a>
-<span class="sourceLineNo">092</span>    return ClusterId.parseFrom(data).toString();<a name="line.92"></a>
-<span class="sourceLineNo">093</span>  }<a name="line.93"></a>
-<span class="sourceLineNo">094</span><a name="line.94"></a>
-<span class="sourceLineNo">095</span>  @Override<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  public CompletableFuture&lt;String&gt; getClusterId() {<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    return getAndConvert(znodePaths.clusterIdZNode, ZKAsyncRegistry::getClusterId);<a name="line.97"></a>
-<span class="sourceLineNo">098</span>  }<a name="line.98"></a>
-<span class="sourceLineNo">099</span><a name="line.99"></a>
-<span class="sourceLineNo">100</span>  @VisibleForTesting<a name="line.100"></a>
-<span class="sourceLineNo">101</span>  ReadOnlyZKClient getZKClient() {<a name="line.101"></a>
-<span class="sourceLineNo">102</span>    return zk;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  }<a name="line.103"></a>
-<span class="sourceLineNo">104</span><a name="line.104"></a>
-<span class="sourceLineNo">105</span>  private static ZooKeeperProtos.MetaRegionServer getMetaProto(byte[] data) throws IOException {<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    if (data == null || data.length == 0) {<a name="line.106"></a>
-<span class="sourceLineNo">107</span>      return null;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>    }<a name="line.108"></a>
-<span class="sourceLineNo">109</span>    data = removeMetaData(data);<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    int prefixLen = lengthOfPBMagic();<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    return ZooKeeperProtos.MetaRegionServer.parser().parseFrom(data, prefixLen,<a name="line.111"></a>
-<span class="sourceLineNo">112</span>      data.length - prefixLen);<a name="line.112"></a>
-<span class="sourceLineNo">113</span>  }<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>  private static void tryComplete(MutableInt remaining, HRegionLocation[] locs,<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      CompletableFuture&lt;RegionLocations&gt; future) {<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    remaining.decrement();<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    if (remaining.intValue() &gt; 0) {<a name="line.118"></a>
-<span class="sourceLineNo">119</span>      return;<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    }<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    future.complete(new RegionLocations(locs));<a name="line.121"></a>
-<span class="sourceLineNo">122</span>  }<a name="line.122"></a>
-<span class="sourceLineNo">123</span><a name="line.123"></a>
-<span class="sourceLineNo">124</span>  private Pair&lt;RegionState.State, ServerName&gt; getStateAndServerName(<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      ZooKeeperProtos.MetaRegionServer proto) {<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    RegionState.State state;<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    if (proto.hasState()) {<a name="line.127"></a>
-<span class="sourceLineNo">128</span>      state = RegionState.State.convert(proto.getState());<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    } else {<a name="line.129"></a>
-<span class="sourceLineNo">130</span>      state = RegionState.State.OPEN;<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    }<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    HBaseProtos.ServerName snProto = proto.getServer();<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    return Pair.newPair(state,<a name="line.133"></a>
-<span class="sourceLineNo">134</span>      ServerName.valueOf(snProto.getHostName(), snProto.getPort(), snProto.getStartCode()));<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  }<a name="line.135"></a>
-<span class="sourceLineNo">136</span><a name="line.136"></a>
-<span class="sourceLineNo">137</span>  @Override<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  public CompletableFuture&lt;RegionLocations&gt; getMetaRegionLocation() {<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    CompletableFuture&lt;RegionLocations&gt; future = new CompletableFuture&lt;&gt;();<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    HRegionLocation[] locs = new HRegionLocation[znodePaths.metaReplicaZNodes.size()];<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    MutableInt remaining = new MutableInt(locs.length);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    znodePaths.metaReplicaZNodes.forEach((replicaId, path) -&gt; {<a name="line.142"></a>
-<span class="sourceLineNo">143</span>      if (replicaId == DEFAULT_REPLICA_ID) {<a name="line.143"></a>
-<span class="sourceLineNo">144</span>        addListener(getAndConvert(path, ZKAsyncRegistry::getMetaProto), (proto, error) -&gt; {<a name="line.144"></a>
-<span class="sourceLineNo">145</span>          if (error != null) {<a name="line.145"></a>
-<span class="sourceLineNo">146</span>            future.completeExceptionally(error);<a name="line.146"></a>
-<span class="sourceLineNo">147</span>            return;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>          }<a name="line.148"></a>
-<span class="sourceLineNo">149</span>          if (proto == null) {<a name="line.149"></a>
-<span class="sourceLineNo">150</span>            future.completeExceptionally(new IOException("Meta znode is null"));<a name="line.150"></a>
-<span class="sourceLineNo">151</span>            return;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>          }<a name="line.152"></a>
-<span class="sourceLineNo">153</span>          Pair&lt;RegionState.State, ServerName&gt; stateAndServerName = getStateAndServerName(proto);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>          if (stateAndServerName.getFirst() != RegionState.State.OPEN) {<a name="line.154"></a>
-<span class="sourceLineNo">155</span>            future.completeExceptionally(<a name="line.155"></a>
-<span class="sourceLineNo">156</span>              new IOException("Meta region is in state " + stateAndServerName.getFirst()));<a name="line.156"></a>
-<span class="sourceLineNo">157</span>            return;<a name="line.157"></a>
-<span class="sourceLineNo">158</span>          }<a name="line.158"></a>
-<span class="sourceLineNo">159</span>          locs[DEFAULT_REPLICA_ID] = new HRegionLocation(<a name="line.159"></a>
-<span class="sourceLineNo">160</span>            getRegionInfoForDefaultReplica(FIRST_META_REGIONINFO), stateAndServerName.getSecond());<a name="line.160"></a>
-<span class="sourceLineNo">161</span>          tryComplete(remaining, locs, future);<a name="line.161"></a>
-<span class="sourceLineNo">162</span>        });<a name="line.162"></a>
-<span class="sourceLineNo">163</span>      } else {<a name="line.163"></a>
-<span class="sourceLineNo">164</span>        addListener(getAndConvert(path, ZKAsyncRegistry::getMetaProto), (proto, error) -&gt; {<a name="line.164"></a>
-<span class="sourceLineNo">165</span>          if (future.isDone()) {<a name="line.165"></a>
-<span class="sourceLineNo">166</span>            return;<a name="line.166"></a>
-<span class="sourceLineNo">167</span>          }<a name="line.167"></a>
-<span class="sourceLineNo">168</span>          if (error != null) {<a name="line.168"></a>
-<span class="sourceLineNo">169</span>            LOG.warn("Failed to fetch " + path, error);<a name="line.169"></a>
-<span class="sourceLineNo">170</span>            locs[replicaId] = null;<a name="line.170"></a>
-<span class="sourceLineNo">171</span>          } else if (proto == null) {<a name="line.171"></a>
-<span class="sourceLineNo">172</span>            LOG.warn("Meta znode for replica " + replicaId + " is null");<a name="line.172"></a>
+<span class="sourceLineNo">062</span>  private final ZNodePaths znodePaths;<a name="line.62"></a>
+<span class="sourceLineNo">063</span><a name="line.63"></a>
+<span class="sourceLineNo">064</span>  ZKAsyncRegistry(Configuration conf) {<a name="line.64"></a>
+<span class="sourceLineNo">065</span>    this.znodePaths = new ZNodePaths(conf);<a name="line.65"></a>
+<span class="sourceLineNo">066</span>    this.zk = new ReadOnlyZKClient(conf);<a name="line.66"></a>
+<span class="sourceLineNo">067</span>  }<a name="line.67"></a>
+<span class="sourceLineNo">068</span><a name="line.68"></a>
+<span class="sourceLineNo">069</span>  private interface Converter&lt;T&gt; {<a name="line.69"></a>
+<span class="sourceLineNo">070</span>    T convert(byte[] data) throws Exception;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>  }<a name="line.71"></a>
+<span class="sourceLineNo">072</span><a name="line.72"></a>
+<span class="sourceLineNo">073</span>  private &lt;T&gt; CompletableFuture&lt;T&gt; getAndConvert(String path, Converter&lt;T&gt; converter) {<a name="line.73"></a>
+<span class="sourceLineNo">074</span>    CompletableFuture&lt;T&gt; future = new CompletableFuture&lt;&gt;();<a name="line.74"></a>
+<span class="sourceLineNo">075</span>    addListener(zk.get(path), (data, error) -&gt; {<a name="line.75"></a>
+<span class="sourceLineNo">076</span>      if (error != null) {<a name="line.76"></a>
+<span class="sourceLineNo">077</span>        future.completeExceptionally(error);<a name="line.77"></a>
+<span class="sourceLineNo">078</span>        return;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>      }<a name="line.79"></a>
+<span class="sourceLineNo">080</span>      try {<a name="line.80"></a>
+<span class="sourceLineNo">081</span>        future.complete(converter.convert(data));<a name="line.81"></a>
+<span class="sourceLineNo">082</span>      } catch (Exception e) {<a name="line.82"></a>
+<span class="sourceLineNo">083</span>        future.completeExceptionally(e);<a name="line.83"></a>
+<span class="sourceLineNo">084</span>      }<a name="line.84"></a>
+<span class="sourceLineNo">085</span>    });<a name="line.85"></a>
+<span class="sourceLineNo">086</span>    return future;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>  }<a name="line.87"></a>
+<span class="sourceLineNo">088</span><a name="line.88"></a>
+<span class="sourceLineNo">089</span>  private static String getClusterId(byte[] data) throws DeserializationException {<a name="line.89"></a>
+<span class="sourceLineNo">090</span>    if (data == null || data.length == 0) {<a name="line.90"></a>
+<span class="sourceLineNo">091</span>      return null;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>    }<a name="line.92"></a>
+<span class="sourceLineNo">093</span>    data = removeMetaData(data);<a name="line.93"></a>
+<span class="sourceLineNo">094</span>    return ClusterId.parseFrom(data).toString();<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  }<a name="line.95"></a>
+<span class="sourceLineNo">096</span><a name="line.96"></a>
+<span class="sourceLineNo">097</span>  @Override<a name="line.97"></a>
+<span class="sourceLineNo">098</span>  public CompletableFuture&lt;String&gt; getClusterId() {<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    return getAndConvert(znodePaths.clusterIdZNode, ZKAsyncRegistry::getClusterId);<a name="line.99"></a>
+<span class="sourceLineNo">100</span>  }<a name="line.100"></a>
+<span class="sourceLineNo">101</span><a name="line.101"></a>
+<span class="sourceLineNo">102</span>  @VisibleForTesting<a name="line.102"></a>
+<span class="sourceLineNo">103</span>  ReadOnlyZKClient getZKClient() {<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    return zk;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>  }<a name="line.105"></a>
+<span class="sourceLineNo">106</span><a name="line.106"></a>
+<span class="sourceLineNo">107</span>  private static ZooKeeperProtos.MetaRegionServer getMetaProto(byte[] data) throws IOException {<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    if (data == null || data.length == 0) {<a name="line.108"></a>
+<span class="sourceLineNo">109</span>      return null;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    }<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    data = removeMetaData(data);<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    int prefixLen = lengthOfPBMagic();<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    return ZooKeeperProtos.MetaRegionServer.parser().parseFrom(data, prefixLen,<a name="line.113"></a>
+<span class="sourceLineNo">114</span>      data.length - prefixLen);<a name="line.114"></a>
+<span class="sourceLineNo">115</span>  }<a name="line.115"></a>
+<span class="sourceLineNo">116</span><a name="line.116"></a>
+<span class="sourceLineNo">117</span>  private static void tryComplete(MutableInt remaining, HRegionLocation[] locs,<a name="line.117"></a>
+<span class="sourceLineNo">118</span>      CompletableFuture&lt;RegionLocations&gt; future) {<a name="line.118"></a>
+<span class="sourceLineNo">119</span>    remaining.decrement();<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    if (remaining.intValue() &gt; 0) {<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      return;<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    }<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    future.complete(new RegionLocations(locs));<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  }<a name="line.124"></a>
+<span class="sourceLineNo">125</span><a name="line.125"></a>
+<span class="sourceLineNo">126</span>  private Pair&lt;RegionState.State, ServerName&gt; getStateAndServerName(<a name="line.126"></a>
+<span class="sourceLineNo">127</span>      ZooKeeperProtos.MetaRegionServer proto) {<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    RegionState.State state;<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    if (proto.hasState()) {<a name="line.129"></a>
+<span class="sourceLineNo">130</span>      state = RegionState.State.convert(proto.getState());<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    } else {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      state = RegionState.State.OPEN;<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    }<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    HBaseProtos.ServerName snProto = proto.getServer();<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    return Pair.newPair(state,<a name="line.135"></a>
+<span class="sourceLineNo">136</span>      ServerName.valueOf(snProto.getHostName(), snProto.getPort(), snProto.getStartCode()));<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  }<a name="line.137"></a>
+<span class="sourceLineNo">138</span><a name="line.138"></a>
+<span class="sourceLineNo">139</span>  private void getMetaRegionLocation(CompletableFuture&lt;RegionLocations&gt; future,<a name="line.139"></a>
+<span class="sourceLineNo">140</span>      List&lt;String&gt; metaReplicaZNodes) {<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    HRegionLocation[] locs = new HRegionLocation[metaReplicaZNodes.size()];<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    MutableInt remaining = new MutableInt(locs.length);<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    for (String metaReplicaZNode : metaReplicaZNodes) {<a name="line.143"></a>
+<span class="sourceLineNo">144</span>      int replicaId = znodePaths.getMetaReplicaIdFromZnode(metaReplicaZNode);<a name="line.144"></a>
+<span class="sourceLineNo">145</span>      String path = ZNodePaths.joinZNode(znodePaths.baseZNode, metaReplicaZNode);<a name="line.145"></a>
+<span class="sourceLineNo">146</span>      if (replicaId == DEFAULT_REPLICA_ID) {<a name="line.146"></a>
+<span class="sourceLineNo">147</span>        addListener(getAndConvert(path, ZKAsyncRegistry::getMetaProto), (proto, error) -&gt; {<a name="line.147"></a>
+<span class="sourceLineNo">148</span>          if (error != null) {<a name="line.148"></a>
+<span class="sourceLineNo">149</span>            future.completeExceptionally(error);<a name="line.149"></a>
+<span class="sourceLineNo">150</span>            return;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>          }<a name="line.151"></a>
+<span class="sourceLineNo">152</span>          if (proto == null) {<a name="line.152"></a>
+<span class="sourceLineNo">153</span>            future.completeExceptionally(new IOException("Meta znode is null"));<a name="line.153"></a>
+<span class="sourceLineNo">154</span>            return;<a name="line.154"></a>
+<span class="sourceLineNo">155</span>          }<a name="line.155"></a>
+<span class="sourceLineNo">156</span>          Pair&lt;RegionState.State, ServerName&gt; stateAndServerName = getStateAndServerName(proto);<a name="line.156"></a>
+<span class="sourceLineNo">157</span>          if (stateAndServerName.getFirst() != RegionState.State.OPEN) {<a name="line.157"></a>
+<span class="sourceLineNo">158</span>            future.completeExceptionally(<a name="line.158"></a>
+<span class="sourceLineNo">159</span>              new IOException("Meta region is in state " + stateAndServerName.getFirst()));<a name="line.159"></a>
+<span class="sourceLineNo">160</span>            return;<a name="line.160"></a>
+<span class="sourceLineNo">161</span>          }<a name="line.161"></a>
+<span class="sourceLineNo">162</span>          locs[DEFAULT_REPLICA_ID] = new HRegionLocation(<a name="line.162"></a>
+<span class="sourceLineNo">163</span>            getRegionInfoForDefaultReplica(FIRST_META_REGIONINFO), stateAndServerName.getSecond());<a name="line.163"></a>
+<span class="sourceLineNo">164</span>          tryComplete(remaining, locs, future);<a name="line.164"></a>
+<span class="sourceLineNo">165</span>        });<a name="line.165"></a>
+<span class="sourceLineNo">166</span>      } else {<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        addListener(getAndConvert(path, ZKAsyncRegistry::getMetaProto), (proto, error) -&gt; {<a name="line.167"></a>
+<span class="sourceLineNo">168</span>          if (future.isDone()) {<a name="line.168"></a>
+<span class="sourceLineNo">169</span>            return;<a name="line.169"></a>
+<span class="sourceLineNo">170</span>          }<a name="line.170"></a>
+<span class="sourceLineNo">171</span>          if (error != null) {<a name="line.171"></a>
+<span class="sourceLineNo">172</span>            LOG.warn("Failed to fetch " + path, error);<a name="line.172"></a>
 <span class="sourceLineNo">173</span>            locs[replicaId] = null;<a name="line.173"></a>
-<span class="sourceLineNo">174</span>          } else {<a name="line.174"></a>
-<span class="sourceLineNo">175</span>            Pair&lt;RegionState.State, ServerName&gt; stateAndServerName = getStateAndServerName(proto);<a name="line.175"></a>
-<span class="sourceLineNo">176</span>            if (stateAndServerName.getFirst() != RegionState.State.OPEN) {<a name="line.176"></a>
-<span class="sourceLineNo">177</span>              LOG.warn("Meta region for replica " + replicaId + " is in state " +<a name="line.177"></a>
-<span class="sourceLineNo">178</span>                stateAndServerName.getFirst());<a name="line.178"></a>
-<span class="sourceLineNo">179</span>              locs[replicaId] = null;<a name="line.179"></a>
-<span class="sourceLineNo">180</span>            } else {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>              locs[replicaId] =<a name="line.181"></a>
-<span class="sourceLineNo">182</span>                new HRegionLocation(getRegionInfoForReplica(FIRST_META_REGIONINFO, replicaId),<a name="line.182"></a>
-<span class="sourceLineNo">183</span>                  stateAndServerName.getSecond());<a name="line.183"></a>
-<span class="sourceLineNo">184</span>            }<a name="line.184"></a>
-<span class="sourceLineNo">185</span>          }<a name="line.185"></a>
-<span class="sourceLineNo">186</span>          tryComplete(remaining, locs, future);<a name="line.186"></a>
-<span class="sourceLineNo">187</span>        });<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      }<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    });<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    return future;<a name="line.190"></a>
-<span class="sourceLineNo">191</span>  }<a name="line.191"></a>
-<span class="sourceLineNo">192</span><a name="line.192"></a>
-<span class="sourceLineNo">193</span>  @Override<a name="line.193"></a>
-<span class="sourceLineNo">194</span>  public CompletableFuture&lt;Integer&gt; getCurrentNrHRS() {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    return zk.exists(znodePaths.rsZNode).thenApply(s -&gt; s != null ? s.getNumChildren() : 0);<a name="line.195"></a>
-<span class="sourceLineNo">196</span>  }<a name="line.196"></a>
-<span class="sourceLineNo">197</span><a name="line.197"></a>
-<span class="sourceLineNo">198</span>  private static ZooKeeperProtos.Master getMasterProto(byte[] data) throws IOException {<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    if (data == null || data.length == 0) {<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      return null;<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    }<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    data = removeMetaData(data);<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    int prefixLen = lengthOfPBMagic();<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    return ZooKeeperProtos.Master.parser().parseFrom(data, prefixLen, data.length - prefixLen);<a name="line.204"></a>
-<span class="sourceLineNo">205</span>  }<a name="line.205"></a>
-<span class="sourceLineNo">206</span><a name="line.206"></a>
-<span class="sourceLineNo">207</span>  @Override<a name="line.207"></a>
-<span class="sourceLineNo">208</span>  public CompletableFuture&lt;ServerName&gt; getMasterAddress() {<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    return getAndConvert(znodePaths.masterAddressZNode, ZKAsyncRegistry::getMasterProto)<a name="line.209"></a>
-<span class="sourceLineNo">210</span>        .thenApply(proto -&gt; {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>          if (proto == null) {<a name="line.211"></a>
-<span class="sourceLineNo">212</span>            return null;<a name="line.212"></a>
-<span class="sourceLineNo">213</span>          }<a name="line.213"></a>
-<span class="sourceLineNo">214</span>          HBaseProtos.ServerName snProto = proto.getMaster();<a name="line.214"></a>
-<span class="sourceLineNo">215</span>          return ServerName.valueOf(snProto.getHostName(), snProto.getPort(),<a name="line.215"></a>
-<span class="sourceLineNo">216</span>            snProto.getStartCode());<a name="line.216"></a>
-<span class="sourceLineNo">217</span>        });<a name="line.217"></a>
-<span class="sourceLineNo">218</span>  }<a name="line.218"></a>
-<span class="sourceLineNo">219</span><a name="line.219"></a>
-<span class="sourceLineNo">220</span>  @Override<a name="line.220"></a>
-<span class="sourceLineNo">221</span>  public CompletableFuture&lt;Integer&gt; getMasterInfoPort() {<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    return getAndConvert(znodePaths.masterAddressZNode, ZKAsyncRegistry::getMasterProto)<a name="line.222"></a>
-<span class="sourceLineNo">223</span>        .thenApply(proto -&gt; proto != null ? proto.getInfoPort() : 0);<a name="line.223"></a>
+<span class="sourceLineNo">174</span>          } else if (proto == null) {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>            LOG.warn("Meta znode for replica " + replicaId + " is null");<a name="line.175"></a>
+<span class="sourceLineNo">176</span>            locs[replicaId] = null;<a name="line.176"></a>
+<span class="sourceLineNo">177</span>          } else {<a name="line.177"></a>
+<span class="sourceLineNo">178</span>            Pair&lt;RegionState.State, ServerName&gt; stateAndServerName = getStateAndServerName(proto);<a name="line.178"></a>
+<span class="sourceLineNo">179</span>            if (stateAndServerName.getFirst() != RegionState.State.OPEN) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>              LOG.warn("Meta region for replica " + replicaId + " is in state " +<a name="line.180"></a>
+<span class="sourceLineNo">181</span>                stateAndServerName.getFirst());<a name="line.181"></a>
+<span class="sourceLineNo">182</span>              locs[replicaId] = null;<a name="line.182"></a>
+<span class="sourceLineNo">183</span>            } else {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>              locs[replicaId] =<a name="line.184"></a>
+<span class="sourceLineNo">185</span>                new HRegionLocation(getRegionInfoForReplica(FIRST_META_REGIONINFO, replicaId),<a name="line.185"></a>
+<span class="sourceLineNo">186</span>                  stateAndServerName.getSecond());<a name="line.186"></a>
+<span class="sourceLineNo">187</span>            }<a name="line.187"></a>
+<span class="sourceLineNo">188</span>          }<a name="line.188"></a>
+<span class="sourceLineNo">189</span>          tryComplete(remaining, locs, future);<a name="line.189"></a>
+<span class="sourceLineNo">190</span>        });<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      }<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    }<a name="line.192"></a>
+<span class="sourceLineNo">193</span>  }<a name="line.193"></a>
+<span class="sourceLineNo">194</span><a name="line.194"></a>
+<span class="sourceLineNo">195</span>  @Override<a name="line.195"></a>
+<span class="sourceLineNo">196</span>  public CompletableFuture&lt;RegionLocations&gt; getMetaRegionLocation() {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    CompletableFuture&lt;RegionLocations&gt; future = new CompletableFuture&lt;&gt;();<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    addListener(<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      zk.list(znodePaths.baseZNode)<a name="line.199"></a>
+<span class="sourceLineNo">200</span>        .thenApply(children -&gt; children.stream()<a name="line.200"></a>
+<span class="sourceLineNo">201</span>          .filter(c -&gt; c.startsWith(znodePaths.metaZNodePrefix)).collect(Collectors.toList())),<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      (metaReplicaZNodes, error) -&gt; {<a name="line.202"></a>
+<span class="sourceLineNo">203</span>        if (error != null) {<a name="line.203"></a>
+<span class="sourceLineNo">204</span>          future.completeExceptionally(error);<a name="line.204"></a>
+<span class="sourceLineNo">205</span>          return;<a name="line.205"></a>
+<span class="sourceLineNo">206</span>        }<a name="line.206"></a>
+<span class="sourceLineNo">207</span>        getMetaRegionLocation(future, metaReplicaZNodes);<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      });<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    return future;<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>  @Override<a name="line.212"></a>
+<span class="sourceLineNo">213</span>  public CompletableFuture&lt;Integer&gt; getCurrentNrHRS() {<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    return zk.exists(znodePaths.rsZNode).thenApply(s -&gt; s != null ? s.getNumChildren() : 0);<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 static ZooKeeperProtos.Master getMasterProto(byte[] data) throws IOException {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    if (data == null || data.length == 0) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      return null;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    }<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    data = removeMetaData(data);<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    int prefixLen = lengthOfPBMagic();<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    return ZooKeeperProtos.Master.parser().parseFrom(data, prefixLen, data.length - prefixLen);<a name="line.223"></a>
 <span class="sourceLineNo">224</span>  }<a name="line.224"></a>
 <span class="sourceLineNo">225</span><a name="line.225"></a>
 <span class="sourceLineNo">226</span>  @Override<a name="line.226"></a>
-<span class="sourceLineNo">227</span>  public void close() {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    zk.close();<a name="line.228"></a>
-<span class="sourceLineNo">229</span>  }<a name="line.229"></a>
-<span class="sourceLineNo">230</span>}<a name="line.230"></a>
+<span class="sourceLineNo">227</span>  public CompletableFuture&lt;ServerName&gt; getMasterAddress() {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    return getAndConvert(znodePaths.masterAddressZNode, ZKAsyncRegistry::getMasterProto)<a name="line.228"></a>
+<span class="sourceLineNo">229</span>        .thenApply(proto -&gt; {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>          if (proto == null) {<a name="line.230"></a>
+<span class="sourceLineNo">231</span>            return null;<a name="line.231"></a>
+<span class="sourceLineNo">232</span>          }<a name="line.232"></a>
+<span class="sourceLineNo">233</span>          HBaseProtos.ServerName snProto = proto.getMaster();<a name="line.233"></a>
+<span class="sourceLineNo">234</span>          return ServerName.valueOf(snProto.getHostName(), snProto.getPort(),<a name="line.234"></a>
+<span class="sourceLineNo">235</span>            snProto.getStartCode());<a name="line.235"></a>
+<span class="sourceLineNo">236</span>        });<a name="line.236"></a>
+<span class="sourceLineNo">237</span>  }<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>  @Override<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  public CompletableFuture&lt;Integer&gt; getMasterInfoPort() {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    return getAndConvert(znodePaths.masterAddressZNode, ZKAsyncRegistry::getMasterProto)<a name="line.241"></a>
+<span class="sourceLineNo">242</span>        .thenApply(proto -&gt; proto != null ? proto.getInfoPort() : 0);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  }<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>  @Override<a name="line.245"></a>
+<span class="sourceLineNo">246</span>  public void close() {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    zk.close();<a name="line.247"></a>
+<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
+<span class="sourceLineNo">249</span>}<a name="line.249"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.InitializationMonitor.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.InitializationMonitor.html
index 2890261..0ddc884 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.InitializationMonitor.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.InitializationMonitor.html
@@ -1015,7 +1015,7 @@
 <span class="sourceLineNo">1007</span>    try {<a name="line.1007"></a>
 <span class="sourceLineNo">1008</span>      this.serverManager.loadLastFlushedSequenceIds();<a name="line.1008"></a>
 <span class="sourceLineNo">1009</span>    } catch (IOException e) {<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      LOG.debug("Failed to load last flushed sequence id of regions"<a name="line.1010"></a>
+<span class="sourceLineNo">1010</span>      LOG.info("Failed to load last flushed sequence id of regions"<a name="line.1010"></a>
 <span class="sourceLineNo">1011</span>          + " from file system", e);<a name="line.1011"></a>
 <span class="sourceLineNo">1012</span>    }<a name="line.1012"></a>
 <span class="sourceLineNo">1013</span>    // Set ourselves as active Master now our claim has succeeded up in zk.<a name="line.1013"></a>
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.MasterStoppedException.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.MasterStoppedException.html
index 2890261..0ddc884 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.MasterStoppedException.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.MasterStoppedException.html
@@ -1015,7 +1015,7 @@
 <span class="sourceLineNo">1007</span>    try {<a name="line.1007"></a>
 <span class="sourceLineNo">1008</span>      this.serverManager.loadLastFlushedSequenceIds();<a name="line.1008"></a>
 <span class="sourceLineNo">1009</span>    } catch (IOException e) {<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      LOG.debug("Failed to load last flushed sequence id of regions"<a name="line.1010"></a>
+<span class="sourceLineNo">1010</span>      LOG.info("Failed to load last flushed sequence id of regions"<a name="line.1010"></a>
 <span class="sourceLineNo">1011</span>          + " from file system", e);<a name="line.1011"></a>
 <span class="sourceLineNo">1012</span>    }<a name="line.1012"></a>
 <span class="sourceLineNo">1013</span>    // Set ourselves as active Master now our claim has succeeded up in zk.<a name="line.1013"></a>
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.RedirectServlet.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.RedirectServlet.html
index 2890261..0ddc884 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.RedirectServlet.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.RedirectServlet.html
@@ -1015,7 +1015,7 @@
 <span class="sourceLineNo">1007</span>    try {<a name="line.1007"></a>
 <span class="sourceLineNo">1008</span>      this.serverManager.loadLastFlushedSequenceIds();<a name="line.1008"></a>
 <span class="sourceLineNo">1009</span>    } catch (IOException e) {<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      LOG.debug("Failed to load last flushed sequence id of regions"<a name="line.1010"></a>
+<span class="sourceLineNo">1010</span>      LOG.info("Failed to load last flushed sequence id of regions"<a name="line.1010"></a>
 <span class="sourceLineNo">1011</span>          + " from file system", e);<a name="line.1011"></a>
 <span class="sourceLineNo">1012</span>    }<a name="line.1012"></a>
 <span class="sourceLineNo">1013</span>    // Set ourselves as active Master now our claim has succeeded up in zk.<a name="line.1013"></a>
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.TableDescriptorGetter.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.TableDescriptorGetter.html
index 2890261..0ddc884 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.TableDescriptorGetter.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.TableDescriptorGetter.html
@@ -1015,7 +1015,7 @@
 <span class="sourceLineNo">1007</span>    try {<a name="line.1007"></a>
 <span class="sourceLineNo">1008</span>      this.serverManager.loadLastFlushedSequenceIds();<a name="line.1008"></a>
 <span class="sourceLineNo">1009</span>    } catch (IOException e) {<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      LOG.debug("Failed to load last flushed sequence id of regions"<a name="line.1010"></a>
+<span class="sourceLineNo">1010</span>      LOG.info("Failed to load last flushed sequence id of regions"<a name="line.1010"></a>
 <span class="sourceLineNo">1011</span>          + " from file system", e);<a name="line.1011"></a>
 <span class="sourceLineNo">1012</span>    }<a name="line.1012"></a>
 <span class="sourceLineNo">1013</span>    // Set ourselves as active Master now our claim has succeeded up in zk.<a name="line.1013"></a>
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.html
index 2890261..0ddc884 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.html
@@ -1015,7 +1015,7 @@
 <span class="sourceLineNo">1007</span>    try {<a name="line.1007"></a>
 <span class="sourceLineNo">1008</span>      this.serverManager.loadLastFlushedSequenceIds();<a name="line.1008"></a>
 <span class="sourceLineNo">1009</span>    } catch (IOException e) {<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      LOG.debug("Failed to load last flushed sequence id of regions"<a name="line.1010"></a>
+<span class="sourceLineNo">1010</span>      LOG.info("Failed to load last flushed sequence id of regions"<a name="line.1010"></a>
 <span class="sourceLineNo">1011</span>          + " from file system", e);<a name="line.1011"></a>
 <span class="sourceLineNo">1012</span>    }<a name="line.1012"></a>
 <span class="sourceLineNo">1013</span>    // Set ourselves as active Master now our claim has succeeded up in zk.<a name="line.1013"></a>
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/ServerManager.FlushedSequenceIdFlusher.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/ServerManager.FlushedSequenceIdFlusher.html
index aa0f061..669d56d 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/ServerManager.FlushedSequenceIdFlusher.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/ServerManager.FlushedSequenceIdFlusher.html
@@ -1134,64 +1134,68 @@
 <span class="sourceLineNo">1126</span>    try {<a name="line.1126"></a>
 <span class="sourceLineNo">1127</span>      FlushedSequenceId flushedSequenceId =<a name="line.1127"></a>
 <span class="sourceLineNo">1128</span>          FlushedSequenceId.parseDelimitedFrom(in);<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      for (FlushedRegionSequenceId flushedRegionSequenceId : flushedSequenceId<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>          .getRegionSequenceIdList()) {<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>        byte[] encodedRegionName = flushedRegionSequenceId<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>            .getRegionEncodedName().toByteArray();<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>        flushedSequenceIdByRegion<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>            .putIfAbsent(encodedRegionName, flushedRegionSequenceId.getSeqId());<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>        if (flushedRegionSequenceId.getStoresList() != null<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>            &amp;&amp; flushedRegionSequenceId.getStoresList().size() != 0) {<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>          ConcurrentNavigableMap&lt;byte[], Long&gt; storeFlushedSequenceId =<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>              computeIfAbsent(storeFlushedSequenceIdsByRegion, encodedRegionName,<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>                () -&gt; new ConcurrentSkipListMap&lt;&gt;(Bytes.BYTES_COMPARATOR));<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>          for (FlushedStoreSequenceId flushedStoreSequenceId : flushedRegionSequenceId<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>              .getStoresList()) {<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>            storeFlushedSequenceId<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>                .put(flushedStoreSequenceId.getFamily().toByteArray(),<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>                    flushedStoreSequenceId.getSeqId());<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>          }<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>        }<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>      }<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    } finally {<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>      in.close();<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    }<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>  }<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span><a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>  /**<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>   * Regions may have been removed between latest persist of FlushedSequenceIds<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>   * and master abort. So after loading FlushedSequenceIds from file, and after<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>   * meta loaded, we need to remove the deleted region according to RegionStates.<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>   */<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>  public void removeDeletedRegionFromLoadedFlushedSequenceIds() {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>    RegionStates regionStates = master.getAssignmentManager().getRegionStates();<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>    Iterator&lt;byte[]&gt; it = flushedSequenceIdByRegion.keySet().iterator();<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    while(it.hasNext()) {<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>      byte[] regionEncodedName = it.next();<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>      if (regionStates.getRegionState(Bytes.toStringBinary(regionEncodedName)) == null) {<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>        it.remove();<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>        storeFlushedSequenceIdsByRegion.remove(regionEncodedName);<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>      }<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>    }<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>  }<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span><a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>  private class FlushedSequenceIdFlusher extends ScheduledChore {<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span><a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>    public FlushedSequenceIdFlusher(String name, int p) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>      super(name, master, p, 60 * 1000); //delay one minute before first execute<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>    }<a name="line.1174"></a>
+<span class="sourceLineNo">1129</span>      if (flushedSequenceId == null) {<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>        LOG.info(".lastflushedseqids found at {} is empty", lastFlushedSeqIdPath);<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>        return;<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>      }<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>      for (FlushedRegionSequenceId flushedRegionSequenceId : flushedSequenceId<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>          .getRegionSequenceIdList()) {<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>        byte[] encodedRegionName = flushedRegionSequenceId<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>            .getRegionEncodedName().toByteArray();<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>        flushedSequenceIdByRegion<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>            .putIfAbsent(encodedRegionName, flushedRegionSequenceId.getSeqId());<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>        if (flushedRegionSequenceId.getStoresList() != null<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>            &amp;&amp; flushedRegionSequenceId.getStoresList().size() != 0) {<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>          ConcurrentNavigableMap&lt;byte[], Long&gt; storeFlushedSequenceId =<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>              computeIfAbsent(storeFlushedSequenceIdsByRegion, encodedRegionName,<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>                () -&gt; new ConcurrentSkipListMap&lt;&gt;(Bytes.BYTES_COMPARATOR));<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>          for (FlushedStoreSequenceId flushedStoreSequenceId : flushedRegionSequenceId<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>              .getStoresList()) {<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>            storeFlushedSequenceId<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>                .put(flushedStoreSequenceId.getFamily().toByteArray(),<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>                    flushedStoreSequenceId.getSeqId());<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>          }<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>        }<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>      }<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    } finally {<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>      in.close();<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>    }<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>  }<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span><a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>  /**<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>   * Regions may have been removed between latest persist of FlushedSequenceIds<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>   * and master abort. So after loading FlushedSequenceIds from file, and after<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>   * meta loaded, we need to remove the deleted region according to RegionStates.<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>   */<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>  public void removeDeletedRegionFromLoadedFlushedSequenceIds() {<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>    RegionStates regionStates = master.getAssignmentManager().getRegionStates();<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>    Iterator&lt;byte[]&gt; it = flushedSequenceIdByRegion.keySet().iterator();<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>    while(it.hasNext()) {<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>      byte[] regionEncodedName = it.next();<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>      if (regionStates.getRegionState(Bytes.toStringBinary(regionEncodedName)) == null) {<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>        it.remove();<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>        storeFlushedSequenceIdsByRegion.remove(regionEncodedName);<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>      }<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>    }<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>  }<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span><a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>  private class FlushedSequenceIdFlusher extends ScheduledChore {<a name="line.1174"></a>
 <span class="sourceLineNo">1175</span><a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>    @Override<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>    protected void chore() {<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>      try {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>        persistRegionLastFlushedSequenceIds();<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>      } catch (IOException e) {<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>        LOG.debug("Failed to persist last flushed sequence id of regions"<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>            + " to file system", e);<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      }<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>  }<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>}<a name="line.1186"></a>
+<span class="sourceLineNo">1176</span>    public FlushedSequenceIdFlusher(String name, int p) {<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>      super(name, master, p, 60 * 1000); //delay one minute before first execute<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>    }<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span><a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>    @Override<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>    protected void chore() {<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>      try {<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>        persistRegionLastFlushedSequenceIds();<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>      } catch (IOException e) {<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>        LOG.debug("Failed to persist last flushed sequence id of regions"<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>            + " to file system", e);<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>      }<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>    }<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>  }<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>}<a name="line.1190"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/ServerManager.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/ServerManager.html
index aa0f061..669d56d 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/ServerManager.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/ServerManager.html
@@ -1134,64 +1134,68 @@
 <span class="sourceLineNo">1126</span>    try {<a name="line.1126"></a>
 <span class="sourceLineNo">1127</span>      FlushedSequenceId flushedSequenceId =<a name="line.1127"></a>
 <span class="sourceLineNo">1128</span>          FlushedSequenceId.parseDelimitedFrom(in);<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      for (FlushedRegionSequenceId flushedRegionSequenceId : flushedSequenceId<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>          .getRegionSequenceIdList()) {<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>        byte[] encodedRegionName = flushedRegionSequenceId<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>            .getRegionEncodedName().toByteArray();<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>        flushedSequenceIdByRegion<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>            .putIfAbsent(encodedRegionName, flushedRegionSequenceId.getSeqId());<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>        if (flushedRegionSequenceId.getStoresList() != null<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>            &amp;&amp; flushedRegionSequenceId.getStoresList().size() != 0) {<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>          ConcurrentNavigableMap&lt;byte[], Long&gt; storeFlushedSequenceId =<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>              computeIfAbsent(storeFlushedSequenceIdsByRegion, encodedRegionName,<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>                () -&gt; new ConcurrentSkipListMap&lt;&gt;(Bytes.BYTES_COMPARATOR));<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>          for (FlushedStoreSequenceId flushedStoreSequenceId : flushedRegionSequenceId<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>              .getStoresList()) {<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>            storeFlushedSequenceId<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>                .put(flushedStoreSequenceId.getFamily().toByteArray(),<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>                    flushedStoreSequenceId.getSeqId());<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>          }<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>        }<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>      }<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    } finally {<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>      in.close();<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    }<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>  }<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span><a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>  /**<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>   * Regions may have been removed between latest persist of FlushedSequenceIds<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>   * and master abort. So after loading FlushedSequenceIds from file, and after<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>   * meta loaded, we need to remove the deleted region according to RegionStates.<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>   */<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>  public void removeDeletedRegionFromLoadedFlushedSequenceIds() {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>    RegionStates regionStates = master.getAssignmentManager().getRegionStates();<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>    Iterator&lt;byte[]&gt; it = flushedSequenceIdByRegion.keySet().iterator();<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    while(it.hasNext()) {<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>      byte[] regionEncodedName = it.next();<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>      if (regionStates.getRegionState(Bytes.toStringBinary(regionEncodedName)) == null) {<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>        it.remove();<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>        storeFlushedSequenceIdsByRegion.remove(regionEncodedName);<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>      }<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>    }<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>  }<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span><a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>  private class FlushedSequenceIdFlusher extends ScheduledChore {<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span><a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>    public FlushedSequenceIdFlusher(String name, int p) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>      super(name, master, p, 60 * 1000); //delay one minute before first execute<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>    }<a name="line.1174"></a>
+<span class="sourceLineNo">1129</span>      if (flushedSequenceId == null) {<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>        LOG.info(".lastflushedseqids found at {} is empty", lastFlushedSeqIdPath);<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>        return;<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>      }<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>      for (FlushedRegionSequenceId flushedRegionSequenceId : flushedSequenceId<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>          .getRegionSequenceIdList()) {<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>        byte[] encodedRegionName = flushedRegionSequenceId<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>            .getRegionEncodedName().toByteArray();<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>        flushedSequenceIdByRegion<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>            .putIfAbsent(encodedRegionName, flushedRegionSequenceId.getSeqId());<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>        if (flushedRegionSequenceId.getStoresList() != null<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>            &amp;&amp; flushedRegionSequenceId.getStoresList().size() != 0) {<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>          ConcurrentNavigableMap&lt;byte[], Long&gt; storeFlushedSequenceId =<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>              computeIfAbsent(storeFlushedSequenceIdsByRegion, encodedRegionName,<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>                () -&gt; new ConcurrentSkipListMap&lt;&gt;(Bytes.BYTES_COMPARATOR));<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>          for (FlushedStoreSequenceId flushedStoreSequenceId : flushedRegionSequenceId<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>              .getStoresList()) {<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>            storeFlushedSequenceId<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>                .put(flushedStoreSequenceId.getFamily().toByteArray(),<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>                    flushedStoreSequenceId.getSeqId());<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>          }<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>        }<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>      }<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    } finally {<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>      in.close();<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>    }<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>  }<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span><a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>  /**<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>   * Regions may have been removed between latest persist of FlushedSequenceIds<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>   * and master abort. So after loading FlushedSequenceIds from file, and after<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>   * meta loaded, we need to remove the deleted region according to RegionStates.<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>   */<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>  public void removeDeletedRegionFromLoadedFlushedSequenceIds() {<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>    RegionStates regionStates = master.getAssignmentManager().getRegionStates();<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>    Iterator&lt;byte[]&gt; it = flushedSequenceIdByRegion.keySet().iterator();<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>    while(it.hasNext()) {<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>      byte[] regionEncodedName = it.next();<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>      if (regionStates.getRegionState(Bytes.toStringBinary(regionEncodedName)) == null) {<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>        it.remove();<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>        storeFlushedSequenceIdsByRegion.remove(regionEncodedName);<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>      }<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>    }<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>  }<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span><a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>  private class FlushedSequenceIdFlusher extends ScheduledChore {<a name="line.1174"></a>
 <span class="sourceLineNo">1175</span><a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>    @Override<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>    protected void chore() {<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>      try {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>        persistRegionLastFlushedSequenceIds();<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>      } catch (IOException e) {<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>        LOG.debug("Failed to persist last flushed sequence id of regions"<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>            + " to file system", e);<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      }<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>  }<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>}<a name="line.1186"></a>
+<span class="sourceLineNo">1176</span>    public FlushedSequenceIdFlusher(String name, int p) {<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>      super(name, master, p, 60 * 1000); //delay one minute before first execute<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>    }<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span><a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>    @Override<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>    protected void chore() {<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>      try {<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>        persistRegionLastFlushedSequenceIds();<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>      } catch (IOException e) {<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>        LOG.debug("Failed to persist last flushed sequence id of regions"<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>            + " to file system", e);<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>      }<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>    }<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>  }<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>}<a name="line.1190"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.Task.html b/devapidocs/src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.Task.html
index 51a1259..d782768 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.Task.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.Task.html
@@ -32,335 +32,352 @@
 <span class="sourceLineNo">024</span>import java.io.IOException;<a name="line.24"></a>
 <span class="sourceLineNo">025</span>import java.util.Arrays;<a name="line.25"></a>
 <span class="sourceLineNo">026</span>import java.util.EnumSet;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import java.util.concurrent.CompletableFuture;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import java.util.concurrent.DelayQueue;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import java.util.concurrent.Delayed;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import java.util.concurrent.TimeUnit;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import java.util.concurrent.atomic.AtomicBoolean;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.apache.hadoop.conf.Configuration;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.DoNotRetryIOException;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.util.FutureUtils;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.zookeeper.KeeperException;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.zookeeper.KeeperException.Code;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.zookeeper.ZooKeeper;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.zookeeper.data.Stat;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.slf4j.Logger;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.slf4j.LoggerFactory;<a name="line.42"></a>
-<span class="sourceLineNo">043</span><a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.44"></a>
-<span class="sourceLineNo">045</span><a name="line.45"></a>
-<span class="sourceLineNo">046</span>/**<a name="line.46"></a>
-<span class="sourceLineNo">047</span> * A very simple read only zookeeper implementation without watcher support.<a name="line.47"></a>
-<span class="sourceLineNo">048</span> */<a name="line.48"></a>
-<span class="sourceLineNo">049</span>@InterfaceAudience.Private<a name="line.49"></a>
-<span class="sourceLineNo">050</span>public final class ReadOnlyZKClient implements Closeable {<a name="line.50"></a>
-<span class="sourceLineNo">051</span><a name="line.51"></a>
-<span class="sourceLineNo">052</span>  private static final Logger LOG = LoggerFactory.getLogger(ReadOnlyZKClient.class);<a name="line.52"></a>
-<span class="sourceLineNo">053</span><a name="line.53"></a>
-<span class="sourceLineNo">054</span>  public static final String RECOVERY_RETRY = "zookeeper.recovery.retry";<a name="line.54"></a>
-<span class="sourceLineNo">055</span><a name="line.55"></a>
-<span class="sourceLineNo">056</span>  private static final int DEFAULT_RECOVERY_RETRY = 30;<a name="line.56"></a>
-<span class="sourceLineNo">057</span><a name="line.57"></a>
-<span class="sourceLineNo">058</span>  public static final String RECOVERY_RETRY_INTERVAL_MILLIS =<a name="line.58"></a>
-<span class="sourceLineNo">059</span>      "zookeeper.recovery.retry.intervalmill";<a name="line.59"></a>
-<span class="sourceLineNo">060</span><a name="line.60"></a>
-<span class="sourceLineNo">061</span>  private static final int DEFAULT_RECOVERY_RETRY_INTERVAL_MILLIS = 1000;<a name="line.61"></a>
-<span class="sourceLineNo">062</span><a name="line.62"></a>
-<span class="sourceLineNo">063</span>  public static final String KEEPALIVE_MILLIS = "zookeeper.keep-alive.time";<a name="line.63"></a>
-<span class="sourceLineNo">064</span><a name="line.64"></a>
-<span class="sourceLineNo">065</span>  private static final int DEFAULT_KEEPALIVE_MILLIS = 60000;<a name="line.65"></a>
-<span class="sourceLineNo">066</span><a name="line.66"></a>
-<span class="sourceLineNo">067</span>  private static final EnumSet&lt;Code&gt; FAIL_FAST_CODES = EnumSet.of(Code.NOAUTH, Code.AUTHFAILED);<a name="line.67"></a>
-<span class="sourceLineNo">068</span><a name="line.68"></a>
-<span class="sourceLineNo">069</span>  private final String connectString;<a name="line.69"></a>
-<span class="sourceLineNo">070</span><a name="line.70"></a>
-<span class="sourceLineNo">071</span>  private final int sessionTimeoutMs;<a name="line.71"></a>
-<span class="sourceLineNo">072</span><a name="line.72"></a>
-<span class="sourceLineNo">073</span>  private final int maxRetries;<a name="line.73"></a>
-<span class="sourceLineNo">074</span><a name="line.74"></a>
-<span class="sourceLineNo">075</span>  private final int retryIntervalMs;<a name="line.75"></a>
-<span class="sourceLineNo">076</span><a name="line.76"></a>
-<span class="sourceLineNo">077</span>  private final int keepAliveTimeMs;<a name="line.77"></a>
-<span class="sourceLineNo">078</span><a name="line.78"></a>
-<span class="sourceLineNo">079</span>  private static abstract class Task implements Delayed {<a name="line.79"></a>
-<span class="sourceLineNo">080</span><a name="line.80"></a>
-<span class="sourceLineNo">081</span>    protected long time = System.nanoTime();<a name="line.81"></a>
-<span class="sourceLineNo">082</span><a name="line.82"></a>
-<span class="sourceLineNo">083</span>    public boolean needZk() {<a name="line.83"></a>
-<span class="sourceLineNo">084</span>      return false;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>    }<a name="line.85"></a>
-<span class="sourceLineNo">086</span><a name="line.86"></a>
-<span class="sourceLineNo">087</span>    public void exec(ZooKeeper zk) {<a name="line.87"></a>
-<span class="sourceLineNo">088</span>    }<a name="line.88"></a>
-<span class="sourceLineNo">089</span><a name="line.89"></a>
-<span class="sourceLineNo">090</span>    public void connectFailed(IOException e) {<a name="line.90"></a>
-<span class="sourceLineNo">091</span>    }<a name="line.91"></a>
-<span class="sourceLineNo">092</span><a name="line.92"></a>
-<span class="sourceLineNo">093</span>    public void closed(IOException e) {<a name="line.93"></a>
-<span class="sourceLineNo">094</span>    }<a name="line.94"></a>
-<span class="sourceLineNo">095</span><a name="line.95"></a>
-<span class="sourceLineNo">096</span>    @Override<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    public int compareTo(Delayed o) {<a name="line.97"></a>
-<span class="sourceLineNo">098</span>      Task that = (Task) o;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>      int c = Long.compare(time, that.time);<a name="line.99"></a>
-<span class="sourceLineNo">100</span>      if (c != 0) {<a name="line.100"></a>
-<span class="sourceLineNo">101</span>        return c;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>      }<a name="line.102"></a>
-<span class="sourceLineNo">103</span>      return Integer.compare(System.identityHashCode(this), System.identityHashCode(that));<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    }<a name="line.104"></a>
-<span class="sourceLineNo">105</span><a name="line.105"></a>
-<span class="sourceLineNo">106</span>    @Override<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    public long getDelay(TimeUnit unit) {<a name="line.107"></a>
-<span class="sourceLineNo">108</span>      return unit.convert(time - System.nanoTime(), TimeUnit.NANOSECONDS);<a name="line.108"></a>
-<span class="sourceLineNo">109</span>    }<a name="line.109"></a>
-<span class="sourceLineNo">110</span>  }<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>  private static final Task CLOSE = new Task() {<a name="line.112"></a>
-<span class="sourceLineNo">113</span>  };<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>  private final DelayQueue&lt;Task&gt; tasks = new DelayQueue&lt;&gt;();<a name="line.115"></a>
-<span class="sourceLineNo">116</span><a name="line.116"></a>
-<span class="sourceLineNo">117</span>  private final AtomicBoolean closed = new AtomicBoolean(false);<a name="line.117"></a>
-<span class="sourceLineNo">118</span><a name="line.118"></a>
-<span class="sourceLineNo">119</span>  @VisibleForTesting<a name="line.119"></a>
-<span class="sourceLineNo">120</span>  ZooKeeper zookeeper;<a name="line.120"></a>
-<span class="sourceLineNo">121</span><a name="line.121"></a>
-<span class="sourceLineNo">122</span>  private int pendingRequests = 0;<a name="line.122"></a>
-<span class="sourceLineNo">123</span><a name="line.123"></a>
-<span class="sourceLineNo">124</span>  private String getId() {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    return String.format("0x%08x", System.identityHashCode(this));<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  }<a name="line.126"></a>
-<span class="sourceLineNo">127</span><a name="line.127"></a>
-<span class="sourceLineNo">128</span>  public ReadOnlyZKClient(Configuration conf) {<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    // We might use a different ZK for client access<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    String clientZkQuorumServers = ZKConfig.getClientZKQuorumServersString(conf);<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    if (clientZkQuorumServers != null) {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>      this.connectString = clientZkQuorumServers;<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    } else {<a name="line.133"></a>
-<span class="sourceLineNo">134</span>      this.connectString = ZKConfig.getZKQuorumServersString(conf);<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    }<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    this.sessionTimeoutMs = conf.getInt(ZK_SESSION_TIMEOUT, DEFAULT_ZK_SESSION_TIMEOUT);<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    this.maxRetries = conf.getInt(RECOVERY_RETRY, DEFAULT_RECOVERY_RETRY);<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    this.retryIntervalMs =<a name="line.138"></a>
-<span class="sourceLineNo">139</span>        conf.getInt(RECOVERY_RETRY_INTERVAL_MILLIS, DEFAULT_RECOVERY_RETRY_INTERVAL_MILLIS);<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    this.keepAliveTimeMs = conf.getInt(KEEPALIVE_MILLIS, DEFAULT_KEEPALIVE_MILLIS);<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    LOG.debug(<a name="line.141"></a>
-<span class="sourceLineNo">142</span>      "Connect {} to {} with session timeout={}ms, retries {}, " +<a name="line.142"></a>
-<span class="sourceLineNo">143</span>        "retry interval {}ms, keepAlive={}ms",<a name="line.143"></a>
-<span class="sourceLineNo">144</span>      getId(), connectString, sessionTimeoutMs, maxRetries, retryIntervalMs, keepAliveTimeMs);<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    Threads.setDaemonThreadRunning(new Thread(this::run),<a name="line.145"></a>
-<span class="sourceLineNo">146</span>      "ReadOnlyZKClient-" + connectString + "@" + getId());<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  }<a name="line.147"></a>
-<span class="sourceLineNo">148</span><a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private abstract class ZKTask&lt;T&gt; extends Task {<a name="line.149"></a>
-<span class="sourceLineNo">150</span><a name="line.150"></a>
-<span class="sourceLineNo">151</span>    protected final String path;<a name="line.151"></a>
-<span class="sourceLineNo">152</span><a name="line.152"></a>
-<span class="sourceLineNo">153</span>    private final CompletableFuture&lt;T&gt; future;<a name="line.153"></a>
-<span class="sourceLineNo">154</span><a name="line.154"></a>
-<span class="sourceLineNo">155</span>    private final String operationType;<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>    private int retries;<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>    protected ZKTask(String path, CompletableFuture&lt;T&gt; future, String operationType) {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>      this.path = path;<a name="line.160"></a>
-<span class="sourceLineNo">161</span>      this.future = future;<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      this.operationType = operationType;<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    }<a name="line.163"></a>
-<span class="sourceLineNo">164</span><a name="line.164"></a>
-<span class="sourceLineNo">165</span>    protected final void onComplete(ZooKeeper zk, int rc, T ret, boolean errorIfNoNode) {<a name="line.165"></a>
-<span class="sourceLineNo">166</span>      tasks.add(new Task() {<a name="line.166"></a>
-<span class="sourceLineNo">167</span><a name="line.167"></a>
-<span class="sourceLineNo">168</span>        @Override<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        public void exec(ZooKeeper alwaysNull) {<a name="line.169"></a>
-<span class="sourceLineNo">170</span>          pendingRequests--;<a name="line.170"></a>
-<span class="sourceLineNo">171</span>          Code code = Code.get(rc);<a name="line.171"></a>
-<span class="sourceLineNo">172</span>          if (code == Code.OK) {<a name="line.172"></a>
-<span class="sourceLineNo">173</span>            future.complete(ret);<a name="line.173"></a>
-<span class="sourceLineNo">174</span>          } else if (code == Code.NONODE) {<a name="line.174"></a>
-<span class="sourceLineNo">175</span>            if (errorIfNoNode) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>              future.completeExceptionally(KeeperException.create(code, path));<a name="line.176"></a>
-<span class="sourceLineNo">177</span>            } else {<a name="line.177"></a>
-<span class="sourceLineNo">178</span>              future.complete(ret);<a name="line.178"></a>
-<span class="sourceLineNo">179</span>            }<a name="line.179"></a>
-<span class="sourceLineNo">180</span>          } else if (FAIL_FAST_CODES.contains(code)) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>            future.completeExceptionally(KeeperException.create(code, path));<a name="line.181"></a>
-<span class="sourceLineNo">182</span>          } else {<a name="line.182"></a>
-<span class="sourceLineNo">183</span>            if (code == Code.SESSIONEXPIRED) {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>              LOG.warn("{} to {} session expired, close and reconnect", getId(), connectString);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>              try {<a name="line.185"></a>
-<span class="sourceLineNo">186</span>                zk.close();<a name="line.186"></a>
-<span class="sourceLineNo">187</span>              } catch (InterruptedException e) {<a name="line.187"></a>
-<span class="sourceLineNo">188</span>              }<a name="line.188"></a>
-<span class="sourceLineNo">189</span>            }<a name="line.189"></a>
-<span class="sourceLineNo">190</span>            if (ZKTask.this.delay(retryIntervalMs, maxRetries)) {<a name="line.190"></a>
-<span class="sourceLineNo">191</span>              LOG.warn("{} to {} failed for {} of {}, code = {}, retries = {}", getId(),<a name="line.191"></a>
-<span class="sourceLineNo">192</span>                connectString, operationType, path, code, ZKTask.this.retries);<a name="line.192"></a>
-<span class="sourceLineNo">193</span>              tasks.add(ZKTask.this);<a name="line.193"></a>
-<span class="sourceLineNo">194</span>            } else {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>              LOG.warn("{} to {} failed for {} of {}, code = {}, retries = {}, give up", getId(),<a name="line.195"></a>
-<span class="sourceLineNo">196</span>                connectString, operationType, path, code, ZKTask.this.retries);<a name="line.196"></a>
-<span class="sourceLineNo">197</span>              future.completeExceptionally(KeeperException.create(code, path));<a name="line.197"></a>
-<span class="sourceLineNo">198</span>            }<a name="line.198"></a>
-<span class="sourceLineNo">199</span>          }<a name="line.199"></a>
-<span class="sourceLineNo">200</span>        }<a name="line.200"></a>
-<span class="sourceLineNo">201</span><a name="line.201"></a>
-<span class="sourceLineNo">202</span>        @Override<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        public void closed(IOException e) {<a name="line.203"></a>
-<span class="sourceLineNo">204</span>          // It may happen that a request is succeeded and the onComplete has been called and pushed<a name="line.204"></a>
-<span class="sourceLineNo">205</span>          // us into the task queue, but before we get called a close is called and here we will<a name="line.205"></a>
-<span class="sourceLineNo">206</span>          // fail the request, although it is succeeded actually.<a name="line.206"></a>
-<span class="sourceLineNo">207</span>          // This is not a perfect solution but anyway, it is better than hang the requests for<a name="line.207"></a>
-<span class="sourceLineNo">208</span>          // ever, and also acceptable as if you close the zk client before actually getting the<a name="line.208"></a>
-<span class="sourceLineNo">209</span>          // response then a failure is always possible.<a name="line.209"></a>
-<span class="sourceLineNo">210</span>          future.completeExceptionally(e);<a name="line.210"></a>
-<span class="sourceLineNo">211</span>        }<a name="line.211"></a>
-<span class="sourceLineNo">212</span>      });<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    }<a name="line.213"></a>
-<span class="sourceLineNo">214</span><a name="line.214"></a>
-<span class="sourceLineNo">215</span>    @Override<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    public boolean needZk() {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      return true;<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    }<a name="line.218"></a>
-<span class="sourceLineNo">219</span><a name="line.219"></a>
-<span class="sourceLineNo">220</span>    protected abstract void doExec(ZooKeeper zk);<a name="line.220"></a>
-<span class="sourceLineNo">221</span><a name="line.221"></a>
-<span class="sourceLineNo">222</span>    @Override<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final void exec(ZooKeeper zk) {<a name="line.223"></a>
-<span class="sourceLineNo">224</span>      pendingRequests++;<a name="line.224"></a>
-<span class="sourceLineNo">225</span>      doExec(zk);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    }<a name="line.226"></a>
-<span class="sourceLineNo">227</span><a name="line.227"></a>
-<span class="sourceLineNo">228</span>    public boolean delay(long intervalMs, int maxRetries) {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      if (retries &gt;= maxRetries) {<a name="line.229"></a>
-<span class="sourceLineNo">230</span>        return false;<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      }<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      retries++;<a name="line.232"></a>
-<span class="sourceLineNo">233</span>      time = System.nanoTime() + TimeUnit.MILLISECONDS.toNanos(intervalMs);<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      return true;<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    }<a name="line.235"></a>
-<span class="sourceLineNo">236</span><a name="line.236"></a>
-<span class="sourceLineNo">237</span>    @Override<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    public void connectFailed(IOException e) {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      if (delay(retryIntervalMs, maxRetries)) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>        LOG.warn("{} to {} failed to connect to zk fo {} of {}, retries = {}", getId(),<a name="line.240"></a>
-<span class="sourceLineNo">241</span>          connectString, operationType, path, retries, e);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>        tasks.add(this);<a name="line.242"></a>
-<span class="sourceLineNo">243</span>      } else {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>        LOG.warn("{} to {} failed to connect to zk fo {} of {}, retries = {}, give up", getId(),<a name="line.244"></a>
-<span class="sourceLineNo">245</span>          connectString, operationType, path, retries, e);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>        future.completeExceptionally(e);<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><a name="line.249"></a>
-<span class="sourceLineNo">250</span>    @Override<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    public void closed(IOException e) {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      future.completeExceptionally(e);<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    }<a name="line.253"></a>
-<span class="sourceLineNo">254</span>  }<a name="line.254"></a>
-<span class="sourceLineNo">255</span><a name="line.255"></a>
-<span class="sourceLineNo">256</span>  public CompletableFuture&lt;byte[]&gt; get(String path) {<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    if (closed.get()) {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>      return FutureUtils.failedFuture(new DoNotRetryIOException("Client already closed"));<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    }<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    CompletableFuture&lt;byte[]&gt; future = new CompletableFuture&lt;&gt;();<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    tasks.add(new ZKTask&lt;byte[]&gt;(path, future, "get") {<a name="line.261"></a>
-<span class="sourceLineNo">262</span><a name="line.262"></a>
-<span class="sourceLineNo">263</span>      @Override<a name="line.263"></a>
-<span class="sourceLineNo">264</span>      protected void doExec(ZooKeeper zk) {<a name="line.264"></a>
-<span class="sourceLineNo">265</span>        zk.getData(path, false,<a name="line.265"></a>
-<span class="sourceLineNo">266</span>            (rc, path, ctx, data, stat) -&gt; onComplete(zk, rc, data, true), null);<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      }<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    });<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    return future;<a name="line.269"></a>
-<span class="sourceLineNo">270</span>  }<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>  public CompletableFuture&lt;Stat&gt; exists(String path) {<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    if (closed.get()) {<a name="line.273"></a>
-<span class="sourceLineNo">274</span>      return FutureUtils.failedFuture(new DoNotRetryIOException("Client already closed"));<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    }<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    CompletableFuture&lt;Stat&gt; future = new CompletableFuture&lt;&gt;();<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    tasks.add(new ZKTask&lt;Stat&gt;(path, future, "exists") {<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>      @Override<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      protected void doExec(ZooKeeper zk) {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>        zk.exists(path, false, (rc, path, ctx, stat) -&gt; onComplete(zk, rc, stat, false), null);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      }<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    });<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    return future;<a name="line.284"></a>
-<span class="sourceLineNo">285</span>  }<a name="line.285"></a>
-<span class="sourceLineNo">286</span><a name="line.286"></a>
-<span class="sourceLineNo">287</span>  private void closeZk() {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    if (zookeeper != null) {<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      try {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>        zookeeper.close();<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      } catch (InterruptedException e) {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      }<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      zookeeper = null;<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    }<a name="line.294"></a>
-<span class="sourceLineNo">295</span>  }<a name="line.295"></a>
-<span class="sourceLineNo">296</span><a name="line.296"></a>
-<span class="sourceLineNo">297</span>  private ZooKeeper getZk() throws IOException {<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    // may be closed when session expired<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    if (zookeeper == null || !zookeeper.getState().isAlive()) {<a name="line.299"></a>
-<span class="sourceLineNo">300</span>      zookeeper = new ZooKeeper(connectString, sessionTimeoutMs, e -&gt; {});<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    }<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    return zookeeper;<a name="line.302"></a>
-<span class="sourceLineNo">303</span>  }<a name="line.303"></a>
-<span class="sourceLineNo">304</span><a name="line.304"></a>
-<span class="sourceLineNo">305</span>  private void run() {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    for (;;) {<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      Task task;<a name="line.307"></a>
-<span class="sourceLineNo">308</span>      try {<a name="line.308"></a>
-<span class="sourceLineNo">309</span>        task = tasks.poll(keepAliveTimeMs, TimeUnit.MILLISECONDS);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      } catch (InterruptedException e) {<a name="line.310"></a>
-<span class="sourceLineNo">311</span>        continue;<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      }<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      if (task == CLOSE) {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        break;<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      }<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      if (task == null) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        if (pendingRequests == 0) {<a name="line.317"></a>
-<span class="sourceLineNo">318</span>          LOG.trace("{} to {} inactive for {}ms; closing (Will reconnect when new requests)",<a name="line.318"></a>
-<span class="sourceLineNo">319</span>            getId(), connectString, keepAliveTimeMs);<a name="line.319"></a>
-<span class="sourceLineNo">320</span>          closeZk();<a name="line.320"></a>
-<span class="sourceLineNo">321</span>        }<a name="line.321"></a>
-<span class="sourceLineNo">322</span>        continue;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      }<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      if (!task.needZk()) {<a name="line.324"></a>
-<span class="sourceLineNo">325</span>        task.exec(null);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      } else {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>        ZooKeeper zk;<a name="line.327"></a>
-<span class="sourceLineNo">328</span>        try {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>          zk = getZk();<a name="line.329"></a>
-<span class="sourceLineNo">330</span>        } catch (IOException e) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>          task.connectFailed(e);<a name="line.331"></a>
-<span class="sourceLineNo">332</span>          continue;<a name="line.332"></a>
-<span class="sourceLineNo">333</span>        }<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        task.exec(zk);<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>    closeZk();<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    DoNotRetryIOException error = new DoNotRetryIOException("Client already closed");<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    Arrays.stream(tasks.toArray(new Task[0])).forEach(t -&gt; t.closed(error));<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    tasks.clear();<a name="line.340"></a>
-<span class="sourceLineNo">341</span>  }<a name="line.341"></a>
-<span class="sourceLineNo">342</span><a name="line.342"></a>
-<span class="sourceLineNo">343</span>  @Override<a name="line.343"></a>
-<span class="sourceLineNo">344</span>  public void close() {<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    if (closed.compareAndSet(false, true)) {<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      LOG.debug("Close zookeeper connection {} to {}", getId(), connectString);<a name="line.346"></a>
-<span class="sourceLineNo">347</span>      tasks.add(CLOSE);<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    }<a name="line.348"></a>
-<span class="sourceLineNo">349</span>  }<a name="line.349"></a>
-<span class="sourceLineNo">350</span><a name="line.350"></a>
-<span class="sourceLineNo">351</span>  @VisibleForTesting<a name="line.351"></a>
-<span class="sourceLineNo">352</span>  public String getConnectString() {<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    return connectString;<a name="line.353"></a>
-<span class="sourceLineNo">354</span>  }<a name="line.354"></a>
-<span class="sourceLineNo">355</span>}<a name="line.355"></a>
+<span class="sourceLineNo">027</span>import java.util.List;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import java.util.concurrent.CompletableFuture;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import java.util.concurrent.DelayQueue;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import java.util.concurrent.Delayed;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import java.util.concurrent.TimeUnit;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import java.util.concurrent.atomic.AtomicBoolean;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import org.apache.hadoop.conf.Configuration;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.DoNotRetryIOException;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.util.FutureUtils;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.zookeeper.KeeperException;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.zookeeper.KeeperException.Code;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.zookeeper.ZooKeeper;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.zookeeper.data.Stat;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.slf4j.Logger;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.slf4j.LoggerFactory;<a name="line.43"></a>
+<span class="sourceLineNo">044</span><a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.45"></a>
+<span class="sourceLineNo">046</span><a name="line.46"></a>
+<span class="sourceLineNo">047</span>/**<a name="line.47"></a>
+<span class="sourceLineNo">048</span> * A very simple read only zookeeper implementation without watcher support.<a name="line.48"></a>
+<span class="sourceLineNo">049</span> */<a name="line.49"></a>
+<span class="sourceLineNo">050</span>@InterfaceAudience.Private<a name="line.50"></a>
+<span class="sourceLineNo">051</span>public final class ReadOnlyZKClient implements Closeable {<a name="line.51"></a>
+<span class="sourceLineNo">052</span><a name="line.52"></a>
+<span class="sourceLineNo">053</span>  private static final Logger LOG = LoggerFactory.getLogger(ReadOnlyZKClient.class);<a name="line.53"></a>
+<span class="sourceLineNo">054</span><a name="line.54"></a>
+<span class="sourceLineNo">055</span>  public static final String RECOVERY_RETRY = "zookeeper.recovery.retry";<a name="line.55"></a>
+<span class="sourceLineNo">056</span><a name="line.56"></a>
+<span class="sourceLineNo">057</span>  private static final int DEFAULT_RECOVERY_RETRY = 30;<a name="line.57"></a>
+<span class="sourceLineNo">058</span><a name="line.58"></a>
+<span class="sourceLineNo">059</span>  public static final String RECOVERY_RETRY_INTERVAL_MILLIS =<a name="line.59"></a>
+<span class="sourceLineNo">060</span>      "zookeeper.recovery.retry.intervalmill";<a name="line.60"></a>
+<span class="sourceLineNo">061</span><a name="line.61"></a>
+<span class="sourceLineNo">062</span>  private static final int DEFAULT_RECOVERY_RETRY_INTERVAL_MILLIS = 1000;<a name="line.62"></a>
+<span class="sourceLineNo">063</span><a name="line.63"></a>
+<span class="sourceLineNo">064</span>  public static final String KEEPALIVE_MILLIS = "zookeeper.keep-alive.time";<a name="line.64"></a>
+<span class="sourceLineNo">065</span><a name="line.65"></a>
+<span class="sourceLineNo">066</span>  private static final int DEFAULT_KEEPALIVE_MILLIS = 60000;<a name="line.66"></a>
+<span class="sourceLineNo">067</span><a name="line.67"></a>
+<span class="sourceLineNo">068</span>  private static final EnumSet&lt;Code&gt; FAIL_FAST_CODES = EnumSet.of(Code.NOAUTH, Code.AUTHFAILED);<a name="line.68"></a>
+<span class="sourceLineNo">069</span><a name="line.69"></a>
+<span class="sourceLineNo">070</span>  private final String connectString;<a name="line.70"></a>
+<span class="sourceLineNo">071</span><a name="line.71"></a>
+<span class="sourceLineNo">072</span>  private final int sessionTimeoutMs;<a name="line.72"></a>
+<span class="sourceLineNo">073</span><a name="line.73"></a>
+<span class="sourceLineNo">074</span>  private final int maxRetries;<a name="line.74"></a>
+<span class="sourceLineNo">075</span><a name="line.75"></a>
+<span class="sourceLineNo">076</span>  private final int retryIntervalMs;<a name="line.76"></a>
+<span class="sourceLineNo">077</span><a name="line.77"></a>
+<span class="sourceLineNo">078</span>  private final int keepAliveTimeMs;<a name="line.78"></a>
+<span class="sourceLineNo">079</span><a name="line.79"></a>
+<span class="sourceLineNo">080</span>  private static abstract class Task implements Delayed {<a name="line.80"></a>
+<span class="sourceLineNo">081</span><a name="line.81"></a>
+<span class="sourceLineNo">082</span>    protected long time = System.nanoTime();<a name="line.82"></a>
+<span class="sourceLineNo">083</span><a name="line.83"></a>
+<span class="sourceLineNo">084</span>    public boolean needZk() {<a name="line.84"></a>
+<span class="sourceLineNo">085</span>      return false;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>    }<a name="line.86"></a>
+<span class="sourceLineNo">087</span><a name="line.87"></a>
+<span class="sourceLineNo">088</span>    public void exec(ZooKeeper zk) {<a name="line.88"></a>
+<span class="sourceLineNo">089</span>    }<a name="line.89"></a>
+<span class="sourceLineNo">090</span><a name="line.90"></a>
+<span class="sourceLineNo">091</span>    public void connectFailed(IOException e) {<a name="line.91"></a>
+<span class="sourceLineNo">092</span>    }<a name="line.92"></a>
+<span class="sourceLineNo">093</span><a name="line.93"></a>
+<span class="sourceLineNo">094</span>    public void closed(IOException e) {<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    }<a name="line.95"></a>
+<span class="sourceLineNo">096</span><a name="line.96"></a>
+<span class="sourceLineNo">097</span>    @Override<a name="line.97"></a>
+<span class="sourceLineNo">098</span>    public int compareTo(Delayed o) {<a name="line.98"></a>
+<span class="sourceLineNo">099</span>      Task that = (Task) o;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>      int c = Long.compare(time, that.time);<a name="line.100"></a>
+<span class="sourceLineNo">101</span>      if (c != 0) {<a name="line.101"></a>
+<span class="sourceLineNo">102</span>        return c;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>      }<a name="line.103"></a>
+<span class="sourceLineNo">104</span>      return Integer.compare(System.identityHashCode(this), System.identityHashCode(that));<a name="line.104"></a>
+<span class="sourceLineNo">105</span>    }<a name="line.105"></a>
+<span class="sourceLineNo">106</span><a name="line.106"></a>
+<span class="sourceLineNo">107</span>    @Override<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    public long getDelay(TimeUnit unit) {<a name="line.108"></a>
+<span class="sourceLineNo">109</span>      return unit.convert(time - System.nanoTime(), TimeUnit.NANOSECONDS);<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    }<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  }<a name="line.111"></a>
+<span class="sourceLineNo">112</span><a name="line.112"></a>
+<span class="sourceLineNo">113</span>  private static final Task CLOSE = new Task() {<a name="line.113"></a>
+<span class="sourceLineNo">114</span>  };<a name="line.114"></a>
+<span class="sourceLineNo">115</span><a name="line.115"></a>
+<span class="sourceLineNo">116</span>  private final DelayQueue&lt;Task&gt; tasks = new DelayQueue&lt;&gt;();<a name="line.116"></a>
+<span class="sourceLineNo">117</span><a name="line.117"></a>
+<span class="sourceLineNo">118</span>  private final AtomicBoolean closed = new AtomicBoolean(false);<a name="line.118"></a>
+<span class="sourceLineNo">119</span><a name="line.119"></a>
+<span class="sourceLineNo">120</span>  @VisibleForTesting<a name="line.120"></a>
+<span class="sourceLineNo">121</span>  ZooKeeper zookeeper;<a name="line.121"></a>
+<span class="sourceLineNo">122</span><a name="line.122"></a>
+<span class="sourceLineNo">123</span>  private int pendingRequests = 0;<a name="line.123"></a>
+<span class="sourceLineNo">124</span><a name="line.124"></a>
+<span class="sourceLineNo">125</span>  private String getId() {<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    return String.format("0x%08x", System.identityHashCode(this));<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  }<a name="line.127"></a>
+<span class="sourceLineNo">128</span><a name="line.128"></a>
+<span class="sourceLineNo">129</span>  public ReadOnlyZKClient(Configuration conf) {<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    // We might use a different ZK for client access<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    String clientZkQuorumServers = ZKConfig.getClientZKQuorumServersString(conf);<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    if (clientZkQuorumServers != null) {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>      this.connectString = clientZkQuorumServers;<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    } else {<a name="line.134"></a>
+<span class="sourceLineNo">135</span>      this.connectString = ZKConfig.getZKQuorumServersString(conf);<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    }<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    this.sessionTimeoutMs = conf.getInt(ZK_SESSION_TIMEOUT, DEFAULT_ZK_SESSION_TIMEOUT);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    this.maxRetries = conf.getInt(RECOVERY_RETRY, DEFAULT_RECOVERY_RETRY);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    this.retryIntervalMs =<a name="line.139"></a>
+<span class="sourceLineNo">140</span>        conf.getInt(RECOVERY_RETRY_INTERVAL_MILLIS, DEFAULT_RECOVERY_RETRY_INTERVAL_MILLIS);<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    this.keepAliveTimeMs = conf.getInt(KEEPALIVE_MILLIS, DEFAULT_KEEPALIVE_MILLIS);<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    LOG.debug(<a name="line.142"></a>
+<span class="sourceLineNo">143</span>      "Connect {} to {} with session timeout={}ms, retries {}, " +<a name="line.143"></a>
+<span class="sourceLineNo">144</span>        "retry interval {}ms, keepAlive={}ms",<a name="line.144"></a>
+<span class="sourceLineNo">145</span>      getId(), connectString, sessionTimeoutMs, maxRetries, retryIntervalMs, keepAliveTimeMs);<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    Threads.setDaemonThreadRunning(new Thread(this::run),<a name="line.146"></a>
+<span class="sourceLineNo">147</span>      "ReadOnlyZKClient-" + connectString + "@" + getId());<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  }<a name="line.148"></a>
+<span class="sourceLineNo">149</span><a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private abstract class ZKTask&lt;T&gt; extends Task {<a name="line.150"></a>
+<span class="sourceLineNo">151</span><a name="line.151"></a>
+<span class="sourceLineNo">152</span>    protected final String path;<a name="line.152"></a>
+<span class="sourceLineNo">153</span><a name="line.153"></a>
+<span class="sourceLineNo">154</span>    private final CompletableFuture&lt;T&gt; future;<a name="line.154"></a>
+<span class="sourceLineNo">155</span><a name="line.155"></a>
+<span class="sourceLineNo">156</span>    private final String operationType;<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>    private int retries;<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>    protected ZKTask(String path, CompletableFuture&lt;T&gt; future, String operationType) {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>      this.path = path;<a name="line.161"></a>
+<span class="sourceLineNo">162</span>      this.future = future;<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      this.operationType = operationType;<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    }<a name="line.164"></a>
+<span class="sourceLineNo">165</span><a name="line.165"></a>
+<span class="sourceLineNo">166</span>    protected final void onComplete(ZooKeeper zk, int rc, T ret, boolean errorIfNoNode) {<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      tasks.add(new Task() {<a name="line.167"></a>
+<span class="sourceLineNo">168</span><a name="line.168"></a>
+<span class="sourceLineNo">169</span>        @Override<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        public void exec(ZooKeeper alwaysNull) {<a name="line.170"></a>
+<span class="sourceLineNo">171</span>          pendingRequests--;<a name="line.171"></a>
+<span class="sourceLineNo">172</span>          Code code = Code.get(rc);<a name="line.172"></a>
+<span class="sourceLineNo">173</span>          if (code == Code.OK) {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>            future.complete(ret);<a name="line.174"></a>
+<span class="sourceLineNo">175</span>          } else if (code == Code.NONODE) {<a name="line.175"></a>
+<span class="sourceLineNo">176</span>            if (errorIfNoNode) {<a name="line.176"></a>
+<span class="sourceLineNo">177</span>              future.completeExceptionally(KeeperException.create(code, path));<a name="line.177"></a>
+<span class="sourceLineNo">178</span>            } else {<a name="line.178"></a>
+<span class="sourceLineNo">179</span>              future.complete(ret);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>            }<a name="line.180"></a>
+<span class="sourceLineNo">181</span>          } else if (FAIL_FAST_CODES.contains(code)) {<a name="line.181"></a>
+<span class="sourceLineNo">182</span>            future.completeExceptionally(KeeperException.create(code, path));<a name="line.182"></a>
+<span class="sourceLineNo">183</span>          } else {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>            if (code == Code.SESSIONEXPIRED) {<a name="line.184"></a>
+<span class="sourceLineNo">185</span>              LOG.warn("{} to {} session expired, close and reconnect", getId(), connectString);<a name="line.185"></a>
+<span class="sourceLineNo">186</span>              try {<a name="line.186"></a>
+<span class="sourceLineNo">187</span>                zk.close();<a name="line.187"></a>
+<span class="sourceLineNo">188</span>              } catch (InterruptedException e) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>              }<a name="line.189"></a>
+<span class="sourceLineNo">190</span>            }<a name="line.190"></a>
+<span class="sourceLineNo">191</span>            if (ZKTask.this.delay(retryIntervalMs, maxRetries)) {<a name="line.191"></a>
+<span class="sourceLineNo">192</span>              LOG.warn("{} to {} failed for {} of {}, code = {}, retries = {}", getId(),<a name="line.192"></a>
+<span class="sourceLineNo">193</span>                connectString, operationType, path, code, ZKTask.this.retries);<a name="line.193"></a>
+<span class="sourceLineNo">194</span>              tasks.add(ZKTask.this);<a name="line.194"></a>
+<span class="sourceLineNo">195</span>            } else {<a name="line.195"></a>
+<span class="sourceLineNo">196</span>              LOG.warn("{} to {} failed for {} of {}, code = {}, retries = {}, give up", getId(),<a name="line.196"></a>
+<span class="sourceLineNo">197</span>                connectString, operationType, path, code, ZKTask.this.retries);<a name="line.197"></a>
+<span class="sourceLineNo">198</span>              future.completeExceptionally(KeeperException.create(code, path));<a name="line.198"></a>
+<span class="sourceLineNo">199</span>            }<a name="line.199"></a>
+<span class="sourceLineNo">200</span>          }<a name="line.200"></a>
+<span class="sourceLineNo">201</span>        }<a name="line.201"></a>
+<span class="sourceLineNo">202</span><a name="line.202"></a>
+<span class="sourceLineNo">203</span>        @Override<a name="line.203"></a>
+<span class="sourceLineNo">204</span>        public void closed(IOException e) {<a name="line.204"></a>
+<span class="sourceLineNo">205</span>          // It may happen that a request is succeeded and the onComplete has been called and pushed<a name="line.205"></a>
+<span class="sourceLineNo">206</span>          // us into the task queue, but before we get called a close is called and here we will<a name="line.206"></a>
+<span class="sourceLineNo">207</span>          // fail the request, although it is succeeded actually.<a name="line.207"></a>
+<span class="sourceLineNo">208</span>          // This is not a perfect solution but anyway, it is better than hang the requests for<a name="line.208"></a>
+<span class="sourceLineNo">209</span>          // ever, and also acceptable as if you close the zk client before actually getting the<a name="line.209"></a>
+<span class="sourceLineNo">210</span>          // response then a failure is always possible.<a name="line.210"></a>
+<span class="sourceLineNo">211</span>          future.completeExceptionally(e);<a name="line.211"></a>
+<span class="sourceLineNo">212</span>        }<a name="line.212"></a>
+<span class="sourceLineNo">213</span>      });<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    }<a name="line.214"></a>
+<span class="sourceLineNo">215</span><a name="line.215"></a>
+<span class="sourceLineNo">216</span>    @Override<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    public boolean needZk() {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      return true;<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    }<a name="line.219"></a>
+<span class="sourceLineNo">220</span><a name="line.220"></a>
+<span class="sourceLineNo">221</span>    protected abstract void doExec(ZooKeeper zk);<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>    @Override<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final void exec(ZooKeeper zk) {<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      pendingRequests++;<a name="line.225"></a>
+<span class="sourceLineNo">226</span>      doExec(zk);<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    }<a name="line.227"></a>
+<span class="sourceLineNo">228</span><a name="line.228"></a>
+<span class="sourceLineNo">229</span>    public boolean delay(long intervalMs, int maxRetries) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      if (retries &gt;= maxRetries) {<a name="line.230"></a>
+<span class="sourceLineNo">231</span>        return false;<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      }<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      retries++;<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      time = System.nanoTime() + TimeUnit.MILLISECONDS.toNanos(intervalMs);<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      return true;<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>    @Override<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    public void connectFailed(IOException e) {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      if (delay(retryIntervalMs, maxRetries)) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>        LOG.warn("{} to {} failed to connect to zk fo {} of {}, retries = {}", getId(),<a name="line.241"></a>
+<span class="sourceLineNo">242</span>          connectString, operationType, path, retries, e);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        tasks.add(this);<a name="line.243"></a>
+<span class="sourceLineNo">244</span>      } else {<a name="line.244"></a>
+<span class="sourceLineNo">245</span>        LOG.warn("{} to {} failed to connect to zk fo {} of {}, retries = {}, give up", getId(),<a name="line.245"></a>
+<span class="sourceLineNo">246</span>          connectString, operationType, path, retries, e);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>        future.completeExceptionally(e);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      }<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>    @Override<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    public void closed(IOException e) {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      future.completeExceptionally(e);<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    }<a name="line.254"></a>
+<span class="sourceLineNo">255</span>  }<a name="line.255"></a>
+<span class="sourceLineNo">256</span><a name="line.256"></a>
+<span class="sourceLineNo">257</span>  public CompletableFuture&lt;byte[]&gt; get(String path) {<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    if (closed.get()) {<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      return FutureUtils.failedFuture(new DoNotRetryIOException("Client already closed"));<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    }<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    CompletableFuture&lt;byte[]&gt; future = new CompletableFuture&lt;&gt;();<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    tasks.add(new ZKTask&lt;byte[]&gt;(path, future, "get") {<a name="line.262"></a>
+<span class="sourceLineNo">263</span><a name="line.263"></a>
+<span class="sourceLineNo">264</span>      @Override<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      protected void doExec(ZooKeeper zk) {<a name="line.265"></a>
+<span class="sourceLineNo">266</span>        zk.getData(path, false,<a name="line.266"></a>
+<span class="sourceLineNo">267</span>            (rc, path, ctx, data, stat) -&gt; onComplete(zk, rc, data, true), null);<a name="line.267"></a>
+<span class="sourceLineNo">268</span>      }<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    });<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    return future;<a name="line.270"></a>
+<span class="sourceLineNo">271</span>  }<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>  public CompletableFuture&lt;Stat&gt; exists(String path) {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    if (closed.get()) {<a name="line.274"></a>
+<span class="sourceLineNo">275</span>      return FutureUtils.failedFuture(new DoNotRetryIOException("Client already closed"));<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    }<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    CompletableFuture&lt;Stat&gt; future = new CompletableFuture&lt;&gt;();<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    tasks.add(new ZKTask&lt;Stat&gt;(path, future, "exists") {<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>      @Override<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      protected void doExec(ZooKeeper zk) {<a name="line.281"></a>
+<span class="sourceLineNo">282</span>        zk.exists(path, false, (rc, path, ctx, stat) -&gt; onComplete(zk, rc, stat, false), null);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      }<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    });<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    return future;<a name="line.285"></a>
+<span class="sourceLineNo">286</span>  }<a name="line.286"></a>
+<span class="sourceLineNo">287</span><a name="line.287"></a>
+<span class="sourceLineNo">288</span>  public CompletableFuture&lt;List&lt;String&gt;&gt; list(String path) {<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    if (closed.get()) {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>      return FutureUtils.failedFuture(new DoNotRetryIOException("Client already closed"));<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    }<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    CompletableFuture&lt;List&lt;String&gt;&gt; future = new CompletableFuture&lt;&gt;();<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    tasks.add(new ZKTask&lt;List&lt;String&gt;&gt;(path, future, "list") {<a name="line.293"></a>
+<span class="sourceLineNo">294</span><a name="line.294"></a>
+<span class="sourceLineNo">295</span>      @Override<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      protected void doExec(ZooKeeper zk) {<a name="line.296"></a>
+<span class="sourceLineNo">297</span>        zk.getChildren(path, false, (rc, path, ctx, children) -&gt; onComplete(zk, rc, children, true),<a name="line.297"></a>
+<span class="sourceLineNo">298</span>          null);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>      }<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    });<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    return future;<a name="line.301"></a>
+<span class="sourceLineNo">302</span>  }<a name="line.302"></a>
+<span class="sourceLineNo">303</span><a name="line.303"></a>
+<span class="sourceLineNo">304</span>  private void closeZk() {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    if (zookeeper != null) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>      try {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        zookeeper.close();<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      } catch (InterruptedException e) {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      }<a name="line.309"></a>
+<span class="sourceLineNo">310</span>      zookeeper = null;<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    }<a name="line.311"></a>
+<span class="sourceLineNo">312</span>  }<a name="line.312"></a>
+<span class="sourceLineNo">313</span><a name="line.313"></a>
+<span class="sourceLineNo">314</span>  private ZooKeeper getZk() throws IOException {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    // may be closed when session expired<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    if (zookeeper == null || !zookeeper.getState().isAlive()) {<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      zookeeper = new ZooKeeper(connectString, sessionTimeoutMs, e -&gt; {});<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    }<a name="line.318"></a>
+<span class="sourceLineNo">319</span>    return zookeeper;<a name="line.319"></a>
+<span class="sourceLineNo">320</span>  }<a name="line.320"></a>
+<span class="sourceLineNo">321</span><a name="line.321"></a>
+<span class="sourceLineNo">322</span>  private void run() {<a name="line.322"></a>
+<span class="sourceLineNo">323</span>    for (;;) {<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      Task task;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      try {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>        task = tasks.poll(keepAliveTimeMs, TimeUnit.MILLISECONDS);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      } catch (InterruptedException e) {<a name="line.327"></a>
+<span class="sourceLineNo">328</span>        continue;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      }<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      if (task == CLOSE) {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>        break;<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      }<a name="line.332"></a>
+<span class="sourceLineNo">333</span>      if (task == null) {<a name="line.333"></a>
+<span class="sourceLineNo">334</span>        if (pendingRequests == 0) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>          LOG.trace("{} to {} inactive for {}ms; closing (Will reconnect when new requests)",<a name="line.335"></a>
+<span class="sourceLineNo">336</span>            getId(), connectString, keepAliveTimeMs);<a name="line.336"></a>
+<span class="sourceLineNo">337</span>          closeZk();<a name="line.337"></a>
+<span class="sourceLineNo">338</span>        }<a name="line.338"></a>
+<span class="sourceLineNo">339</span>        continue;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>      }<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      if (!task.needZk()) {<a name="line.341"></a>
+<span class="sourceLineNo">342</span>        task.exec(null);<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      } else {<a name="line.343"></a>
+<span class="sourceLineNo">344</span>        ZooKeeper zk;<a name="line.344"></a>
+<span class="sourceLineNo">345</span>        try {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>          zk = getZk();<a name="line.346"></a>
+<span class="sourceLineNo">347</span>        } catch (IOException e) {<a name="line.347"></a>
+<span class="sourceLineNo">348</span>          task.connectFailed(e);<a name="line.348"></a>
+<span class="sourceLineNo">349</span>          continue;<a name="line.349"></a>
+<span class="sourceLineNo">350</span>        }<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        task.exec(zk);<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      }<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    }<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    closeZk();<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    DoNotRetryIOException error = new DoNotRetryIOException("Client already closed");<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    Arrays.stream(tasks.toArray(new Task[0])).forEach(t -&gt; t.closed(error));<a name="line.356"></a>
+<span class="sourceLineNo">357</span>    tasks.clear();<a name="line.357"></a>
+<span class="sourceLineNo">358</span>  }<a name="line.358"></a>
+<span class="sourceLineNo">359</span><a name="line.359"></a>
+<span class="sourceLineNo">360</span>  @Override<a name="line.360"></a>
+<span class="sourceLineNo">361</span>  public void close() {<a name="line.361"></a>
+<span class="sourceLineNo">362</span>    if (closed.compareAndSet(false, true)) {<a name="line.362"></a>
+<span class="sourceLineNo">363</span>      LOG.debug("Close zookeeper connection {} to {}", getId(), connectString);<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      tasks.add(CLOSE);<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    }<a name="line.365"></a>
+<span class="sourceLineNo">366</span>  }<a name="line.366"></a>
+<span class="sourceLineNo">367</span><a name="line.367"></a>
+<span class="sourceLineNo">368</span>  @VisibleForTesting<a name="line.368"></a>
+<span class="sourceLineNo">369</span>  public String getConnectString() {<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    return connectString;<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  }<a name="line.371"></a>
+<span class="sourceLineNo">372</span>}<a name="line.372"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.ZKTask.html b/devapidocs/src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.ZKTask.html
index 51a1259..d782768 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.ZKTask.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.ZKTask.html
@@ -32,335 +32,352 @@
 <span class="sourceLineNo">024</span>import java.io.IOException;<a name="line.24"></a>
 <span class="sourceLineNo">025</span>import java.util.Arrays;<a name="line.25"></a>
 <span class="sourceLineNo">026</span>import java.util.EnumSet;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import java.util.concurrent.CompletableFuture;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import java.util.concurrent.DelayQueue;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import java.util.concurrent.Delayed;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import java.util.concurrent.TimeUnit;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import java.util.concurrent.atomic.AtomicBoolean;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.apache.hadoop.conf.Configuration;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.DoNotRetryIOException;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.util.FutureUtils;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.zookeeper.KeeperException;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.zookeeper.KeeperException.Code;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.zookeeper.ZooKeeper;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.zookeeper.data.Stat;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.slf4j.Logger;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.slf4j.LoggerFactory;<a name="line.42"></a>
-<span class="sourceLineNo">043</span><a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.44"></a>
-<span class="sourceLineNo">045</span><a name="line.45"></a>
-<span class="sourceLineNo">046</span>/**<a name="line.46"></a>
-<span class="sourceLineNo">047</span> * A very simple read only zookeeper implementation without watcher support.<a name="line.47"></a>
-<span class="sourceLineNo">048</span> */<a name="line.48"></a>
-<span class="sourceLineNo">049</span>@InterfaceAudience.Private<a name="line.49"></a>
-<span class="sourceLineNo">050</span>public final class ReadOnlyZKClient implements Closeable {<a name="line.50"></a>
-<span class="sourceLineNo">051</span><a name="line.51"></a>
-<span class="sourceLineNo">052</span>  private static final Logger LOG = LoggerFactory.getLogger(ReadOnlyZKClient.class);<a name="line.52"></a>
-<span class="sourceLineNo">053</span><a name="line.53"></a>
-<span class="sourceLineNo">054</span>  public static final String RECOVERY_RETRY = "zookeeper.recovery.retry";<a name="line.54"></a>
-<span class="sourceLineNo">055</span><a name="line.55"></a>
-<span class="sourceLineNo">056</span>  private static final int DEFAULT_RECOVERY_RETRY = 30;<a name="line.56"></a>
-<span class="sourceLineNo">057</span><a name="line.57"></a>
-<span class="sourceLineNo">058</span>  public static final String RECOVERY_RETRY_INTERVAL_MILLIS =<a name="line.58"></a>
-<span class="sourceLineNo">059</span>      "zookeeper.recovery.retry.intervalmill";<a name="line.59"></a>
-<span class="sourceLineNo">060</span><a name="line.60"></a>
-<span class="sourceLineNo">061</span>  private static final int DEFAULT_RECOVERY_RETRY_INTERVAL_MILLIS = 1000;<a name="line.61"></a>
-<span class="sourceLineNo">062</span><a name="line.62"></a>
-<span class="sourceLineNo">063</span>  public static final String KEEPALIVE_MILLIS = "zookeeper.keep-alive.time";<a name="line.63"></a>
-<span class="sourceLineNo">064</span><a name="line.64"></a>
-<span class="sourceLineNo">065</span>  private static final int DEFAULT_KEEPALIVE_MILLIS = 60000;<a name="line.65"></a>
-<span class="sourceLineNo">066</span><a name="line.66"></a>
-<span class="sourceLineNo">067</span>  private static final EnumSet&lt;Code&gt; FAIL_FAST_CODES = EnumSet.of(Code.NOAUTH, Code.AUTHFAILED);<a name="line.67"></a>
-<span class="sourceLineNo">068</span><a name="line.68"></a>
-<span class="sourceLineNo">069</span>  private final String connectString;<a name="line.69"></a>
-<span class="sourceLineNo">070</span><a name="line.70"></a>
-<span class="sourceLineNo">071</span>  private final int sessionTimeoutMs;<a name="line.71"></a>
-<span class="sourceLineNo">072</span><a name="line.72"></a>
-<span class="sourceLineNo">073</span>  private final int maxRetries;<a name="line.73"></a>
-<span class="sourceLineNo">074</span><a name="line.74"></a>
-<span class="sourceLineNo">075</span>  private final int retryIntervalMs;<a name="line.75"></a>
-<span class="sourceLineNo">076</span><a name="line.76"></a>
-<span class="sourceLineNo">077</span>  private final int keepAliveTimeMs;<a name="line.77"></a>
-<span class="sourceLineNo">078</span><a name="line.78"></a>
-<span class="sourceLineNo">079</span>  private static abstract class Task implements Delayed {<a name="line.79"></a>
-<span class="sourceLineNo">080</span><a name="line.80"></a>
-<span class="sourceLineNo">081</span>    protected long time = System.nanoTime();<a name="line.81"></a>
-<span class="sourceLineNo">082</span><a name="line.82"></a>
-<span class="sourceLineNo">083</span>    public boolean needZk() {<a name="line.83"></a>
-<span class="sourceLineNo">084</span>      return false;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>    }<a name="line.85"></a>
-<span class="sourceLineNo">086</span><a name="line.86"></a>
-<span class="sourceLineNo">087</span>    public void exec(ZooKeeper zk) {<a name="line.87"></a>
-<span class="sourceLineNo">088</span>    }<a name="line.88"></a>
-<span class="sourceLineNo">089</span><a name="line.89"></a>
-<span class="sourceLineNo">090</span>    public void connectFailed(IOException e) {<a name="line.90"></a>
-<span class="sourceLineNo">091</span>    }<a name="line.91"></a>
-<span class="sourceLineNo">092</span><a name="line.92"></a>
-<span class="sourceLineNo">093</span>    public void closed(IOException e) {<a name="line.93"></a>
-<span class="sourceLineNo">094</span>    }<a name="line.94"></a>
-<span class="sourceLineNo">095</span><a name="line.95"></a>
-<span class="sourceLineNo">096</span>    @Override<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    public int compareTo(Delayed o) {<a name="line.97"></a>
-<span class="sourceLineNo">098</span>      Task that = (Task) o;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>      int c = Long.compare(time, that.time);<a name="line.99"></a>
-<span class="sourceLineNo">100</span>      if (c != 0) {<a name="line.100"></a>
-<span class="sourceLineNo">101</span>        return c;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>      }<a name="line.102"></a>
-<span class="sourceLineNo">103</span>      return Integer.compare(System.identityHashCode(this), System.identityHashCode(that));<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    }<a name="line.104"></a>
-<span class="sourceLineNo">105</span><a name="line.105"></a>
-<span class="sourceLineNo">106</span>    @Override<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    public long getDelay(TimeUnit unit) {<a name="line.107"></a>
-<span class="sourceLineNo">108</span>      return unit.convert(time - System.nanoTime(), TimeUnit.NANOSECONDS);<a name="line.108"></a>
-<span class="sourceLineNo">109</span>    }<a name="line.109"></a>
-<span class="sourceLineNo">110</span>  }<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>  private static final Task CLOSE = new Task() {<a name="line.112"></a>
-<span class="sourceLineNo">113</span>  };<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>  private final DelayQueue&lt;Task&gt; tasks = new DelayQueue&lt;&gt;();<a name="line.115"></a>
-<span class="sourceLineNo">116</span><a name="line.116"></a>
-<span class="sourceLineNo">117</span>  private final AtomicBoolean closed = new AtomicBoolean(false);<a name="line.117"></a>
-<span class="sourceLineNo">118</span><a name="line.118"></a>
-<span class="sourceLineNo">119</span>  @VisibleForTesting<a name="line.119"></a>
-<span class="sourceLineNo">120</span>  ZooKeeper zookeeper;<a name="line.120"></a>
-<span class="sourceLineNo">121</span><a name="line.121"></a>
-<span class="sourceLineNo">122</span>  private int pendingRequests = 0;<a name="line.122"></a>
-<span class="sourceLineNo">123</span><a name="line.123"></a>
-<span class="sourceLineNo">124</span>  private String getId() {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    return String.format("0x%08x", System.identityHashCode(this));<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  }<a name="line.126"></a>
-<span class="sourceLineNo">127</span><a name="line.127"></a>
-<span class="sourceLineNo">128</span>  public ReadOnlyZKClient(Configuration conf) {<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    // We might use a different ZK for client access<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    String clientZkQuorumServers = ZKConfig.getClientZKQuorumServersString(conf);<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    if (clientZkQuorumServers != null) {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>      this.connectString = clientZkQuorumServers;<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    } else {<a name="line.133"></a>
-<span class="sourceLineNo">134</span>      this.connectString = ZKConfig.getZKQuorumServersString(conf);<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    }<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    this.sessionTimeoutMs = conf.getInt(ZK_SESSION_TIMEOUT, DEFAULT_ZK_SESSION_TIMEOUT);<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    this.maxRetries = conf.getInt(RECOVERY_RETRY, DEFAULT_RECOVERY_RETRY);<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    this.retryIntervalMs =<a name="line.138"></a>
-<span class="sourceLineNo">139</span>        conf.getInt(RECOVERY_RETRY_INTERVAL_MILLIS, DEFAULT_RECOVERY_RETRY_INTERVAL_MILLIS);<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    this.keepAliveTimeMs = conf.getInt(KEEPALIVE_MILLIS, DEFAULT_KEEPALIVE_MILLIS);<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    LOG.debug(<a name="line.141"></a>
-<span class="sourceLineNo">142</span>      "Connect {} to {} with session timeout={}ms, retries {}, " +<a name="line.142"></a>
-<span class="sourceLineNo">143</span>        "retry interval {}ms, keepAlive={}ms",<a name="line.143"></a>
-<span class="sourceLineNo">144</span>      getId(), connectString, sessionTimeoutMs, maxRetries, retryIntervalMs, keepAliveTimeMs);<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    Threads.setDaemonThreadRunning(new Thread(this::run),<a name="line.145"></a>
-<span class="sourceLineNo">146</span>      "ReadOnlyZKClient-" + connectString + "@" + getId());<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  }<a name="line.147"></a>
-<span class="sourceLineNo">148</span><a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private abstract class ZKTask&lt;T&gt; extends Task {<a name="line.149"></a>
-<span class="sourceLineNo">150</span><a name="line.150"></a>
-<span class="sourceLineNo">151</span>    protected final String path;<a name="line.151"></a>
-<span class="sourceLineNo">152</span><a name="line.152"></a>
-<span class="sourceLineNo">153</span>    private final CompletableFuture&lt;T&gt; future;<a name="line.153"></a>
-<span class="sourceLineNo">154</span><a name="line.154"></a>
-<span class="sourceLineNo">155</span>    private final String operationType;<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>    private int retries;<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>    protected ZKTask(String path, CompletableFuture&lt;T&gt; future, String operationType) {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>      this.path = path;<a name="line.160"></a>
-<span class="sourceLineNo">161</span>      this.future = future;<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      this.operationType = operationType;<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    }<a name="line.163"></a>
-<span class="sourceLineNo">164</span><a name="line.164"></a>
-<span class="sourceLineNo">165</span>    protected final void onComplete(ZooKeeper zk, int rc, T ret, boolean errorIfNoNode) {<a name="line.165"></a>
-<span class="sourceLineNo">166</span>      tasks.add(new Task() {<a name="line.166"></a>
-<span class="sourceLineNo">167</span><a name="line.167"></a>
-<span class="sourceLineNo">168</span>        @Override<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        public void exec(ZooKeeper alwaysNull) {<a name="line.169"></a>
-<span class="sourceLineNo">170</span>          pendingRequests--;<a name="line.170"></a>
-<span class="sourceLineNo">171</span>          Code code = Code.get(rc);<a name="line.171"></a>
-<span class="sourceLineNo">172</span>          if (code == Code.OK) {<a name="line.172"></a>
-<span class="sourceLineNo">173</span>            future.complete(ret);<a name="line.173"></a>
-<span class="sourceLineNo">174</span>          } else if (code == Code.NONODE) {<a name="line.174"></a>
-<span class="sourceLineNo">175</span>            if (errorIfNoNode) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>              future.completeExceptionally(KeeperException.create(code, path));<a name="line.176"></a>
-<span class="sourceLineNo">177</span>            } else {<a name="line.177"></a>
-<span class="sourceLineNo">178</span>              future.complete(ret);<a name="line.178"></a>
-<span class="sourceLineNo">179</span>            }<a name="line.179"></a>
-<span class="sourceLineNo">180</span>          } else if (FAIL_FAST_CODES.contains(code)) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>            future.completeExceptionally(KeeperException.create(code, path));<a name="line.181"></a>
-<span class="sourceLineNo">182</span>          } else {<a name="line.182"></a>
-<span class="sourceLineNo">183</span>            if (code == Code.SESSIONEXPIRED) {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>              LOG.warn("{} to {} session expired, close and reconnect", getId(), connectString);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>              try {<a name="line.185"></a>
-<span class="sourceLineNo">186</span>                zk.close();<a name="line.186"></a>
-<span class="sourceLineNo">187</span>              } catch (InterruptedException e) {<a name="line.187"></a>
-<span class="sourceLineNo">188</span>              }<a name="line.188"></a>
-<span class="sourceLineNo">189</span>            }<a name="line.189"></a>
-<span class="sourceLineNo">190</span>            if (ZKTask.this.delay(retryIntervalMs, maxRetries)) {<a name="line.190"></a>
-<span class="sourceLineNo">191</span>              LOG.warn("{} to {} failed for {} of {}, code = {}, retries = {}", getId(),<a name="line.191"></a>
-<span class="sourceLineNo">192</span>                connectString, operationType, path, code, ZKTask.this.retries);<a name="line.192"></a>
-<span class="sourceLineNo">193</span>              tasks.add(ZKTask.this);<a name="line.193"></a>
-<span class="sourceLineNo">194</span>            } else {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>              LOG.warn("{} to {} failed for {} of {}, code = {}, retries = {}, give up", getId(),<a name="line.195"></a>
-<span class="sourceLineNo">196</span>                connectString, operationType, path, code, ZKTask.this.retries);<a name="line.196"></a>
-<span class="sourceLineNo">197</span>              future.completeExceptionally(KeeperException.create(code, path));<a name="line.197"></a>
-<span class="sourceLineNo">198</span>            }<a name="line.198"></a>
-<span class="sourceLineNo">199</span>          }<a name="line.199"></a>
-<span class="sourceLineNo">200</span>        }<a name="line.200"></a>
-<span class="sourceLineNo">201</span><a name="line.201"></a>
-<span class="sourceLineNo">202</span>        @Override<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        public void closed(IOException e) {<a name="line.203"></a>
-<span class="sourceLineNo">204</span>          // It may happen that a request is succeeded and the onComplete has been called and pushed<a name="line.204"></a>
-<span class="sourceLineNo">205</span>          // us into the task queue, but before we get called a close is called and here we will<a name="line.205"></a>
-<span class="sourceLineNo">206</span>          // fail the request, although it is succeeded actually.<a name="line.206"></a>
-<span class="sourceLineNo">207</span>          // This is not a perfect solution but anyway, it is better than hang the requests for<a name="line.207"></a>
-<span class="sourceLineNo">208</span>          // ever, and also acceptable as if you close the zk client before actually getting the<a name="line.208"></a>
-<span class="sourceLineNo">209</span>          // response then a failure is always possible.<a name="line.209"></a>
-<span class="sourceLineNo">210</span>          future.completeExceptionally(e);<a name="line.210"></a>
-<span class="sourceLineNo">211</span>        }<a name="line.211"></a>
-<span class="sourceLineNo">212</span>      });<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    }<a name="line.213"></a>
-<span class="sourceLineNo">214</span><a name="line.214"></a>
-<span class="sourceLineNo">215</span>    @Override<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    public boolean needZk() {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      return true;<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    }<a name="line.218"></a>
-<span class="sourceLineNo">219</span><a name="line.219"></a>
-<span class="sourceLineNo">220</span>    protected abstract void doExec(ZooKeeper zk);<a name="line.220"></a>
-<span class="sourceLineNo">221</span><a name="line.221"></a>
-<span class="sourceLineNo">222</span>    @Override<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final void exec(ZooKeeper zk) {<a name="line.223"></a>
-<span class="sourceLineNo">224</span>      pendingRequests++;<a name="line.224"></a>
-<span class="sourceLineNo">225</span>      doExec(zk);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    }<a name="line.226"></a>
-<span class="sourceLineNo">227</span><a name="line.227"></a>
-<span class="sourceLineNo">228</span>    public boolean delay(long intervalMs, int maxRetries) {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      if (retries &gt;= maxRetries) {<a name="line.229"></a>
-<span class="sourceLineNo">230</span>        return false;<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      }<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      retries++;<a name="line.232"></a>
-<span class="sourceLineNo">233</span>      time = System.nanoTime() + TimeUnit.MILLISECONDS.toNanos(intervalMs);<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      return true;<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    }<a name="line.235"></a>
-<span class="sourceLineNo">236</span><a name="line.236"></a>
-<span class="sourceLineNo">237</span>    @Override<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    public void connectFailed(IOException e) {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      if (delay(retryIntervalMs, maxRetries)) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>        LOG.warn("{} to {} failed to connect to zk fo {} of {}, retries = {}", getId(),<a name="line.240"></a>
-<span class="sourceLineNo">241</span>          connectString, operationType, path, retries, e);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>        tasks.add(this);<a name="line.242"></a>
-<span class="sourceLineNo">243</span>      } else {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>        LOG.warn("{} to {} failed to connect to zk fo {} of {}, retries = {}, give up", getId(),<a name="line.244"></a>
-<span class="sourceLineNo">245</span>          connectString, operationType, path, retries, e);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>        future.completeExceptionally(e);<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><a name="line.249"></a>
-<span class="sourceLineNo">250</span>    @Override<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    public void closed(IOException e) {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      future.completeExceptionally(e);<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    }<a name="line.253"></a>
-<span class="sourceLineNo">254</span>  }<a name="line.254"></a>
-<span class="sourceLineNo">255</span><a name="line.255"></a>
-<span class="sourceLineNo">256</span>  public CompletableFuture&lt;byte[]&gt; get(String path) {<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    if (closed.get()) {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>      return FutureUtils.failedFuture(new DoNotRetryIOException("Client already closed"));<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    }<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    CompletableFuture&lt;byte[]&gt; future = new CompletableFuture&lt;&gt;();<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    tasks.add(new ZKTask&lt;byte[]&gt;(path, future, "get") {<a name="line.261"></a>
-<span class="sourceLineNo">262</span><a name="line.262"></a>
-<span class="sourceLineNo">263</span>      @Override<a name="line.263"></a>
-<span class="sourceLineNo">264</span>      protected void doExec(ZooKeeper zk) {<a name="line.264"></a>
-<span class="sourceLineNo">265</span>        zk.getData(path, false,<a name="line.265"></a>
-<span class="sourceLineNo">266</span>            (rc, path, ctx, data, stat) -&gt; onComplete(zk, rc, data, true), null);<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      }<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    });<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    return future;<a name="line.269"></a>
-<span class="sourceLineNo">270</span>  }<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>  public CompletableFuture&lt;Stat&gt; exists(String path) {<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    if (closed.get()) {<a name="line.273"></a>
-<span class="sourceLineNo">274</span>      return FutureUtils.failedFuture(new DoNotRetryIOException("Client already closed"));<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    }<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    CompletableFuture&lt;Stat&gt; future = new CompletableFuture&lt;&gt;();<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    tasks.add(new ZKTask&lt;Stat&gt;(path, future, "exists") {<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>      @Override<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      protected void doExec(ZooKeeper zk) {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>        zk.exists(path, false, (rc, path, ctx, stat) -&gt; onComplete(zk, rc, stat, false), null);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      }<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    });<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    return future;<a name="line.284"></a>
-<span class="sourceLineNo">285</span>  }<a name="line.285"></a>
-<span class="sourceLineNo">286</span><a name="line.286"></a>
-<span class="sourceLineNo">287</span>  private void closeZk() {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    if (zookeeper != null) {<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      try {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>        zookeeper.close();<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      } catch (InterruptedException e) {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      }<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      zookeeper = null;<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    }<a name="line.294"></a>
-<span class="sourceLineNo">295</span>  }<a name="line.295"></a>
-<span class="sourceLineNo">296</span><a name="line.296"></a>
-<span class="sourceLineNo">297</span>  private ZooKeeper getZk() throws IOException {<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    // may be closed when session expired<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    if (zookeeper == null || !zookeeper.getState().isAlive()) {<a name="line.299"></a>
-<span class="sourceLineNo">300</span>      zookeeper = new ZooKeeper(connectString, sessionTimeoutMs, e -&gt; {});<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    }<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    return zookeeper;<a name="line.302"></a>
-<span class="sourceLineNo">303</span>  }<a name="line.303"></a>
-<span class="sourceLineNo">304</span><a name="line.304"></a>
-<span class="sourceLineNo">305</span>  private void run() {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    for (;;) {<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      Task task;<a name="line.307"></a>
-<span class="sourceLineNo">308</span>      try {<a name="line.308"></a>
-<span class="sourceLineNo">309</span>        task = tasks.poll(keepAliveTimeMs, TimeUnit.MILLISECONDS);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      } catch (InterruptedException e) {<a name="line.310"></a>
-<span class="sourceLineNo">311</span>        continue;<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      }<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      if (task == CLOSE) {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        break;<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      }<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      if (task == null) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        if (pendingRequests == 0) {<a name="line.317"></a>
-<span class="sourceLineNo">318</span>          LOG.trace("{} to {} inactive for {}ms; closing (Will reconnect when new requests)",<a name="line.318"></a>
-<span class="sourceLineNo">319</span>            getId(), connectString, keepAliveTimeMs);<a name="line.319"></a>
-<span class="sourceLineNo">320</span>          closeZk();<a name="line.320"></a>
-<span class="sourceLineNo">321</span>        }<a name="line.321"></a>
-<span class="sourceLineNo">322</span>        continue;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      }<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      if (!task.needZk()) {<a name="line.324"></a>
-<span class="sourceLineNo">325</span>        task.exec(null);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      } else {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>        ZooKeeper zk;<a name="line.327"></a>
-<span class="sourceLineNo">328</span>        try {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>          zk = getZk();<a name="line.329"></a>
-<span class="sourceLineNo">330</span>        } catch (IOException e) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>          task.connectFailed(e);<a name="line.331"></a>
-<span class="sourceLineNo">332</span>          continue;<a name="line.332"></a>
-<span class="sourceLineNo">333</span>        }<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        task.exec(zk);<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>    closeZk();<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    DoNotRetryIOException error = new DoNotRetryIOException("Client already closed");<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    Arrays.stream(tasks.toArray(new Task[0])).forEach(t -&gt; t.closed(error));<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    tasks.clear();<a name="line.340"></a>
-<span class="sourceLineNo">341</span>  }<a name="line.341"></a>
-<span class="sourceLineNo">342</span><a name="line.342"></a>
-<span class="sourceLineNo">343</span>  @Override<a name="line.343"></a>
-<span class="sourceLineNo">344</span>  public void close() {<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    if (closed.compareAndSet(false, true)) {<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      LOG.debug("Close zookeeper connection {} to {}", getId(), connectString);<a name="line.346"></a>
-<span class="sourceLineNo">347</span>      tasks.add(CLOSE);<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    }<a name="line.348"></a>
-<span class="sourceLineNo">349</span>  }<a name="line.349"></a>
-<span class="sourceLineNo">350</span><a name="line.350"></a>
-<span class="sourceLineNo">351</span>  @VisibleForTesting<a name="line.351"></a>
-<span class="sourceLineNo">352</span>  public String getConnectString() {<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    return connectString;<a name="line.353"></a>
-<span class="sourceLineNo">354</span>  }<a name="line.354"></a>
-<span class="sourceLineNo">355</span>}<a name="line.355"></a>
+<span class="sourceLineNo">027</span>import java.util.List;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import java.util.concurrent.CompletableFuture;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import java.util.concurrent.DelayQueue;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import java.util.concurrent.Delayed;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import java.util.concurrent.TimeUnit;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import java.util.concurrent.atomic.AtomicBoolean;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import org.apache.hadoop.conf.Configuration;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.DoNotRetryIOException;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.util.FutureUtils;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.zookeeper.KeeperException;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.zookeeper.KeeperException.Code;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.zookeeper.ZooKeeper;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.zookeeper.data.Stat;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.slf4j.Logger;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.slf4j.LoggerFactory;<a name="line.43"></a>
+<span class="sourceLineNo">044</span><a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.45"></a>
+<span class="sourceLineNo">046</span><a name="line.46"></a>
+<span class="sourceLineNo">047</span>/**<a name="line.47"></a>
+<span class="sourceLineNo">048</span> * A very simple read only zookeeper implementation without watcher support.<a name="line.48"></a>
+<span class="sourceLineNo">049</span> */<a name="line.49"></a>
+<span class="sourceLineNo">050</span>@InterfaceAudience.Private<a name="line.50"></a>
+<span class="sourceLineNo">051</span>public final class ReadOnlyZKClient implements Closeable {<a name="line.51"></a>
+<span class="sourceLineNo">052</span><a name="line.52"></a>
+<span class="sourceLineNo">053</span>  private static final Logger LOG = LoggerFactory.getLogger(ReadOnlyZKClient.class);<a name="line.53"></a>
+<span class="sourceLineNo">054</span><a name="line.54"></a>
+<span class="sourceLineNo">055</span>  public static final String RECOVERY_RETRY = "zookeeper.recovery.retry";<a name="line.55"></a>
+<span class="sourceLineNo">056</span><a name="line.56"></a>
+<span class="sourceLineNo">057</span>  private static final int DEFAULT_RECOVERY_RETRY = 30;<a name="line.57"></a>
+<span class="sourceLineNo">058</span><a name="line.58"></a>
+<span class="sourceLineNo">059</span>  public static final String RECOVERY_RETRY_INTERVAL_MILLIS =<a name="line.59"></a>
+<span class="sourceLineNo">060</span>      "zookeeper.recovery.retry.intervalmill";<a name="line.60"></a>
+<span class="sourceLineNo">061</span><a name="line.61"></a>
+<span class="sourceLineNo">062</span>  private static final int DEFAULT_RECOVERY_RETRY_INTERVAL_MILLIS = 1000;<a name="line.62"></a>
+<span class="sourceLineNo">063</span><a name="line.63"></a>
+<span class="sourceLineNo">064</span>  public static final String KEEPALIVE_MILLIS = "zookeeper.keep-alive.time";<a name="line.64"></a>
+<span class="sourceLineNo">065</span><a name="line.65"></a>
+<span class="sourceLineNo">066</span>  private static final int DEFAULT_KEEPALIVE_MILLIS = 60000;<a name="line.66"></a>
+<span class="sourceLineNo">067</span><a name="line.67"></a>
+<span class="sourceLineNo">068</span>  private static final EnumSet&lt;Code&gt; FAIL_FAST_CODES = EnumSet.of(Code.NOAUTH, Code.AUTHFAILED);<a name="line.68"></a>
+<span class="sourceLineNo">069</span><a name="line.69"></a>
+<span class="sourceLineNo">070</span>  private final String connectString;<a name="line.70"></a>
+<span class="sourceLineNo">071</span><a name="line.71"></a>
+<span class="sourceLineNo">072</span>  private final int sessionTimeoutMs;<a name="line.72"></a>
+<span class="sourceLineNo">073</span><a name="line.73"></a>
+<span class="sourceLineNo">074</span>  private final int maxRetries;<a name="line.74"></a>
+<span class="sourceLineNo">075</span><a name="line.75"></a>
+<span class="sourceLineNo">076</span>  private final int retryIntervalMs;<a name="line.76"></a>
+<span class="sourceLineNo">077</span><a name="line.77"></a>
+<span class="sourceLineNo">078</span>  private final int keepAliveTimeMs;<a name="line.78"></a>
+<span class="sourceLineNo">079</span><a name="line.79"></a>
+<span class="sourceLineNo">080</span>  private static abstract class Task implements Delayed {<a name="line.80"></a>
+<span class="sourceLineNo">081</span><a name="line.81"></a>
+<span class="sourceLineNo">082</span>    protected long time = System.nanoTime();<a name="line.82"></a>
+<span class="sourceLineNo">083</span><a name="line.83"></a>
+<span class="sourceLineNo">084</span>    public boolean needZk() {<a name="line.84"></a>
+<span class="sourceLineNo">085</span>      return false;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>    }<a name="line.86"></a>
+<span class="sourceLineNo">087</span><a name="line.87"></a>
+<span class="sourceLineNo">088</span>    public void exec(ZooKeeper zk) {<a name="line.88"></a>
+<span class="sourceLineNo">089</span>    }<a name="line.89"></a>
+<span class="sourceLineNo">090</span><a name="line.90"></a>
+<span class="sourceLineNo">091</span>    public void connectFailed(IOException e) {<a name="line.91"></a>
+<span class="sourceLineNo">092</span>    }<a name="line.92"></a>
+<span class="sourceLineNo">093</span><a name="line.93"></a>
+<span class="sourceLineNo">094</span>    public void closed(IOException e) {<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    }<a name="line.95"></a>
+<span class="sourceLineNo">096</span><a name="line.96"></a>
+<span class="sourceLineNo">097</span>    @Override<a name="line.97"></a>
+<span class="sourceLineNo">098</span>    public int compareTo(Delayed o) {<a name="line.98"></a>
+<span class="sourceLineNo">099</span>      Task that = (Task) o;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>      int c = Long.compare(time, that.time);<a name="line.100"></a>
+<span class="sourceLineNo">101</span>      if (c != 0) {<a name="line.101"></a>
+<span class="sourceLineNo">102</span>        return c;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>      }<a name="line.103"></a>
+<span class="sourceLineNo">104</span>      return Integer.compare(System.identityHashCode(this), System.identityHashCode(that));<a name="line.104"></a>
+<span class="sourceLineNo">105</span>    }<a name="line.105"></a>
+<span class="sourceLineNo">106</span><a name="line.106"></a>
+<span class="sourceLineNo">107</span>    @Override<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    public long getDelay(TimeUnit unit) {<a name="line.108"></a>
+<span class="sourceLineNo">109</span>      return unit.convert(time - System.nanoTime(), TimeUnit.NANOSECONDS);<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    }<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  }<a name="line.111"></a>
+<span class="sourceLineNo">112</span><a name="line.112"></a>
+<span class="sourceLineNo">113</span>  private static final Task CLOSE = new Task() {<a name="line.113"></a>
+<span class="sourceLineNo">114</span>  };<a name="line.114"></a>
+<span class="sourceLineNo">115</span><a name="line.115"></a>
+<span class="sourceLineNo">116</span>  private final DelayQueue&lt;Task&gt; tasks = new DelayQueue&lt;&gt;();<a name="line.116"></a>
+<span class="sourceLineNo">117</span><a name="line.117"></a>
+<span class="sourceLineNo">118</span>  private final AtomicBoolean closed = new AtomicBoolean(false);<a name="line.118"></a>
+<span class="sourceLineNo">119</span><a name="line.119"></a>
+<span class="sourceLineNo">120</span>  @VisibleForTesting<a name="line.120"></a>
+<span class="sourceLineNo">121</span>  ZooKeeper zookeeper;<a name="line.121"></a>
+<span class="sourceLineNo">122</span><a name="line.122"></a>
+<span class="sourceLineNo">123</span>  private int pendingRequests = 0;<a name="line.123"></a>
+<span class="sourceLineNo">124</span><a name="line.124"></a>
+<span class="sourceLineNo">125</span>  private String getId() {<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    return String.format("0x%08x", System.identityHashCode(this));<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  }<a name="line.127"></a>
+<span class="sourceLineNo">128</span><a name="line.128"></a>
+<span class="sourceLineNo">129</span>  public ReadOnlyZKClient(Configuration conf) {<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    // We might use a different ZK for client access<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    String clientZkQuorumServers = ZKConfig.getClientZKQuorumServersString(conf);<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    if (clientZkQuorumServers != null) {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>      this.connectString = clientZkQuorumServers;<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    } else {<a name="line.134"></a>
+<span class="sourceLineNo">135</span>      this.connectString = ZKConfig.getZKQuorumServersString(conf);<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    }<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    this.sessionTimeoutMs = conf.getInt(ZK_SESSION_TIMEOUT, DEFAULT_ZK_SESSION_TIMEOUT);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    this.maxRetries = conf.getInt(RECOVERY_RETRY, DEFAULT_RECOVERY_RETRY);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    this.retryIntervalMs =<a name="line.139"></a>
+<span class="sourceLineNo">140</span>        conf.getInt(RECOVERY_RETRY_INTERVAL_MILLIS, DEFAULT_RECOVERY_RETRY_INTERVAL_MILLIS);<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    this.keepAliveTimeMs = conf.getInt(KEEPALIVE_MILLIS, DEFAULT_KEEPALIVE_MILLIS);<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    LOG.debug(<a name="line.142"></a>
+<span class="sourceLineNo">143</span>      "Connect {} to {} with session timeout={}ms, retries {}, " +<a name="line.143"></a>
+<span class="sourceLineNo">144</span>        "retry interval {}ms, keepAlive={}ms",<a name="line.144"></a>
+<span class="sourceLineNo">145</span>      getId(), connectString, sessionTimeoutMs, maxRetries, retryIntervalMs, keepAliveTimeMs);<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    Threads.setDaemonThreadRunning(new Thread(this::run),<a name="line.146"></a>
+<span class="sourceLineNo">147</span>      "ReadOnlyZKClient-" + connectString + "@" + getId());<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  }<a name="line.148"></a>
+<span class="sourceLineNo">149</span><a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private abstract class ZKTask&lt;T&gt; extends Task {<a name="line.150"></a>
+<span class="sourceLineNo">151</span><a name="line.151"></a>
+<span class="sourceLineNo">152</span>    protected final String path;<a name="line.152"></a>
+<span class="sourceLineNo">153</span><a name="line.153"></a>
+<span class="sourceLineNo">154</span>    private final CompletableFuture&lt;T&gt; future;<a name="line.154"></a>
+<span class="sourceLineNo">155</span><a name="line.155"></a>
+<span class="sourceLineNo">156</span>    private final String operationType;<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>    private int retries;<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>    protected ZKTask(String path, CompletableFuture&lt;T&gt; future, String operationType) {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>      this.path = path;<a name="line.161"></a>
+<span class="sourceLineNo">162</span>      this.future = future;<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      this.operationType = operationType;<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    }<a name="line.164"></a>
+<span class="sourceLineNo">165</span><a name="line.165"></a>
+<span class="sourceLineNo">166</span>    protected final void onComplete(ZooKeeper zk, int rc, T ret, boolean errorIfNoNode) {<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      tasks.add(new Task() {<a name="line.167"></a>
+<span class="sourceLineNo">168</span><a name="line.168"></a>
+<span class="sourceLineNo">169</span>        @Override<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        public void exec(ZooKeeper alwaysNull) {<a name="line.170"></a>
+<span class="sourceLineNo">171</span>          pendingRequests--;<a name="line.171"></a>
+<span class="sourceLineNo">172</span>          Code code = Code.get(rc);<a name="line.172"></a>
+<span class="sourceLineNo">173</span>          if (code == Code.OK) {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>            future.complete(ret);<a name="line.174"></a>
+<span class="sourceLineNo">175</span>          } else if (code == Code.NONODE) {<a name="line.175"></a>
+<span class="sourceLineNo">176</span>            if (errorIfNoNode) {<a name="line.176"></a>
+<span class="sourceLineNo">177</span>              future.completeExceptionally(KeeperException.create(code, path));<a name="line.177"></a>
+<span class="sourceLineNo">178</span>            } else {<a name="line.178"></a>
+<span class="sourceLineNo">179</span>              future.complete(ret);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>            }<a name="line.180"></a>
+<span class="sourceLineNo">181</span>          } else if (FAIL_FAST_CODES.contains(code)) {<a name="line.181"></a>
+<span class="sourceLineNo">182</span>            future.completeExceptionally(KeeperException.create(code, path));<a name="line.182"></a>
+<span class="sourceLineNo">183</span>          } else {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>            if (code == Code.SESSIONEXPIRED) {<a name="line.184"></a>
+<span class="sourceLineNo">185</span>              LOG.warn("{} to {} session expired, close and reconnect", getId(), connectString);<a name="line.185"></a>
+<span class="sourceLineNo">186</span>              try {<a name="line.186"></a>
+<span class="sourceLineNo">187</span>                zk.close();<a name="line.187"></a>
+<span class="sourceLineNo">188</span>              } catch (InterruptedException e) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>              }<a name="line.189"></a>
+<span class="sourceLineNo">190</span>            }<a name="line.190"></a>
+<span class="sourceLineNo">191</span>            if (ZKTask.this.delay(retryIntervalMs, maxRetries)) {<a name="line.191"></a>
+<span class="sourceLineNo">192</span>              LOG.warn("{} to {} failed for {} of {}, code = {}, retries = {}", getId(),<a name="line.192"></a>
+<span class="sourceLineNo">193</span>                connectString, operationType, path, code, ZKTask.this.retries);<a name="line.193"></a>
+<span class="sourceLineNo">194</span>              tasks.add(ZKTask.this);<a name="line.194"></a>
+<span class="sourceLineNo">195</span>            } else {<a name="line.195"></a>
+<span class="sourceLineNo">196</span>              LOG.warn("{} to {} failed for {} of {}, code = {}, retries = {}, give up", getId(),<a name="line.196"></a>
+<span class="sourceLineNo">197</span>                connectString, operationType, path, code, ZKTask.this.retries);<a name="line.197"></a>
+<span class="sourceLineNo">198</span>              future.completeExceptionally(KeeperException.create(code, path));<a name="line.198"></a>
+<span class="sourceLineNo">199</span>            }<a name="line.199"></a>
+<span class="sourceLineNo">200</span>          }<a name="line.200"></a>
+<span class="sourceLineNo">201</span>        }<a name="line.201"></a>
+<span class="sourceLineNo">202</span><a name="line.202"></a>
+<span class="sourceLineNo">203</span>        @Override<a name="line.203"></a>
+<span class="sourceLineNo">204</span>        public void closed(IOException e) {<a name="line.204"></a>
+<span class="sourceLineNo">205</span>          // It may happen that a request is succeeded and the onComplete has been called and pushed<a name="line.205"></a>
+<span class="sourceLineNo">206</span>          // us into the task queue, but before we get called a close is called and here we will<a name="line.206"></a>
+<span class="sourceLineNo">207</span>          // fail the request, although it is succeeded actually.<a name="line.207"></a>
+<span class="sourceLineNo">208</span>          // This is not a perfect solution but anyway, it is better than hang the requests for<a name="line.208"></a>
+<span class="sourceLineNo">209</span>          // ever, and also acceptable as if you close the zk client before actually getting the<a name="line.209"></a>
+<span class="sourceLineNo">210</span>          // response then a failure is always possible.<a name="line.210"></a>
+<span class="sourceLineNo">211</span>          future.completeExceptionally(e);<a name="line.211"></a>
+<span class="sourceLineNo">212</span>        }<a name="line.212"></a>
+<span class="sourceLineNo">213</span>      });<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    }<a name="line.214"></a>
+<span class="sourceLineNo">215</span><a name="line.215"></a>
+<span class="sourceLineNo">216</span>    @Override<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    public boolean needZk() {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      return true;<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    }<a name="line.219"></a>
+<span class="sourceLineNo">220</span><a name="line.220"></a>
+<span class="sourceLineNo">221</span>    protected abstract void doExec(ZooKeeper zk);<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>    @Override<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final void exec(ZooKeeper zk) {<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      pendingRequests++;<a name="line.225"></a>
+<span class="sourceLineNo">226</span>      doExec(zk);<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    }<a name="line.227"></a>
+<span class="sourceLineNo">228</span><a name="line.228"></a>
+<span class="sourceLineNo">229</span>    public boolean delay(long intervalMs, int maxRetries) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      if (retries &gt;= maxRetries) {<a name="line.230"></a>
+<span class="sourceLineNo">231</span>        return false;<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      }<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      retries++;<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      time = System.nanoTime() + TimeUnit.MILLISECONDS.toNanos(intervalMs);<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      return true;<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>    @Override<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    public void connectFailed(IOException e) {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      if (delay(retryIntervalMs, maxRetries)) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>        LOG.warn("{} to {} failed to connect to zk fo {} of {}, retries = {}", getId(),<a name="line.241"></a>
+<span class="sourceLineNo">242</span>          connectString, operationType, path, retries, e);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        tasks.add(this);<a name="line.243"></a>
+<span class="sourceLineNo">244</span>      } else {<a name="line.244"></a>
+<span class="sourceLineNo">245</span>        LOG.warn("{} to {} failed to connect to zk fo {} of {}, retries = {}, give up", getId(),<a name="line.245"></a>
+<span class="sourceLineNo">246</span>          connectString, operationType, path, retries, e);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>        future.completeExceptionally(e);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      }<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>    @Override<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    public void closed(IOException e) {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      future.completeExceptionally(e);<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    }<a name="line.254"></a>
+<span class="sourceLineNo">255</span>  }<a name="line.255"></a>
+<span class="sourceLineNo">256</span><a name="line.256"></a>
+<span class="sourceLineNo">257</span>  public CompletableFuture&lt;byte[]&gt; get(String path) {<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    if (closed.get()) {<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      return FutureUtils.failedFuture(new DoNotRetryIOException("Client already closed"));<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    }<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    CompletableFuture&lt;byte[]&gt; future = new CompletableFuture&lt;&gt;();<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    tasks.add(new ZKTask&lt;byte[]&gt;(path, future, "get") {<a name="line.262"></a>
+<span class="sourceLineNo">263</span><a name="line.263"></a>
+<span class="sourceLineNo">264</span>      @Override<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      protected void doExec(ZooKeeper zk) {<a name="line.265"></a>
+<span class="sourceLineNo">266</span>        zk.getData(path, false,<a name="line.266"></a>
+<span class="sourceLineNo">267</span>            (rc, path, ctx, data, stat) -&gt; onComplete(zk, rc, data, true), null);<a name="line.267"></a>
+<span class="sourceLineNo">268</span>      }<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    });<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    return future;<a name="line.270"></a>
+<span class="sourceLineNo">271</span>  }<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>  public CompletableFuture&lt;Stat&gt; exists(String path) {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    if (closed.get()) {<a name="line.274"></a>
+<span class="sourceLineNo">275</span>      return FutureUtils.failedFuture(new DoNotRetryIOException("Client already closed"));<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    }<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    CompletableFuture&lt;Stat&gt; future = new CompletableFuture&lt;&gt;();<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    tasks.add(new ZKTask&lt;Stat&gt;(path, future, "exists") {<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>      @Override<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      protected void doExec(ZooKeeper zk) {<a name="line.281"></a>
+<span class="sourceLineNo">282</span>        zk.exists(path, false, (rc, path, ctx, stat) -&gt; onComplete(zk, rc, stat, false), null);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      }<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    });<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    return future;<a name="line.285"></a>
+<span class="sourceLineNo">286</span>  }<a name="line.286"></a>
+<span class="sourceLineNo">287</span><a name="line.287"></a>
+<span class="sourceLineNo">288</span>  public CompletableFuture&lt;List&lt;String&gt;&gt; list(String path) {<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    if (closed.get()) {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>      return FutureUtils.failedFuture(new DoNotRetryIOException("Client already closed"));<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    }<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    CompletableFuture&lt;List&lt;String&gt;&gt; future = new CompletableFuture&lt;&gt;();<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    tasks.add(new ZKTask&lt;List&lt;String&gt;&gt;(path, future, "list") {<a name="line.293"></a>
+<span class="sourceLineNo">294</span><a name="line.294"></a>
+<span class="sourceLineNo">295</span>      @Override<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      protected void doExec(ZooKeeper zk) {<a name="line.296"></a>
+<span class="sourceLineNo">297</span>        zk.getChildren(path, false, (rc, path, ctx, children) -&gt; onComplete(zk, rc, children, true),<a name="line.297"></a>
+<span class="sourceLineNo">298</span>          null);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>      }<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    });<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    return future;<a name="line.301"></a>
+<span class="sourceLineNo">302</span>  }<a name="line.302"></a>
+<span class="sourceLineNo">303</span><a name="line.303"></a>
+<span class="sourceLineNo">304</span>  private void closeZk() {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    if (zookeeper != null) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>      try {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        zookeeper.close();<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      } catch (InterruptedException e) {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      }<a name="line.309"></a>
+<span class="sourceLineNo">310</span>      zookeeper = null;<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    }<a name="line.311"></a>
+<span class="sourceLineNo">312</span>  }<a name="line.312"></a>
+<span class="sourceLineNo">313</span><a name="line.313"></a>
+<span class="sourceLineNo">314</span>  private ZooKeeper getZk() throws IOException {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    // may be closed when session expired<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    if (zookeeper == null || !zookeeper.getState().isAlive()) {<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      zookeeper = new ZooKeeper(connectString, sessionTimeoutMs, e -&gt; {});<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    }<a name="line.318"></a>
+<span class="sourceLineNo">319</span>    return zookeeper;<a name="line.319"></a>
+<span class="sourceLineNo">320</span>  }<a name="line.320"></a>
+<span class="sourceLineNo">321</span><a name="line.321"></a>
+<span class="sourceLineNo">322</span>  private void run() {<a name="line.322"></a>
+<span class="sourceLineNo">323</span>    for (;;) {<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      Task task;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      try {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>        task = tasks.poll(keepAliveTimeMs, TimeUnit.MILLISECONDS);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      } catch (InterruptedException e) {<a name="line.327"></a>
+<span class="sourceLineNo">328</span>        continue;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      }<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      if (task == CLOSE) {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>        break;<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      }<a name="line.332"></a>
+<span class="sourceLineNo">333</span>      if (task == null) {<a name="line.333"></a>
+<span class="sourceLineNo">334</span>        if (pendingRequests == 0) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>          LOG.trace("{} to {} inactive for {}ms; closing (Will reconnect when new requests)",<a name="line.335"></a>
+<span class="sourceLineNo">336</span>            getId(), connectString, keepAliveTimeMs);<a name="line.336"></a>
+<span class="sourceLineNo">337</span>          closeZk();<a name="line.337"></a>
+<span class="sourceLineNo">338</span>        }<a name="line.338"></a>
+<span class="sourceLineNo">339</span>        continue;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>      }<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      if (!task.needZk()) {<a name="line.341"></a>
+<span class="sourceLineNo">342</span>        task.exec(null);<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      } else {<a name="line.343"></a>
+<span class="sourceLineNo">344</span>        ZooKeeper zk;<a name="line.344"></a>
+<span class="sourceLineNo">345</span>        try {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>          zk = getZk();<a name="line.346"></a>
+<span class="sourceLineNo">347</span>        } catch (IOException e) {<a name="line.347"></a>
+<span class="sourceLineNo">348</span>          task.connectFailed(e);<a name="line.348"></a>
+<span class="sourceLineNo">349</span>          continue;<a name="line.349"></a>
+<span class="sourceLineNo">350</span>        }<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        task.exec(zk);<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      }<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    }<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    closeZk();<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    DoNotRetryIOException error = new DoNotRetryIOException("Client already closed");<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    Arrays.stream(tasks.toArray(new Task[0])).forEach(t -&gt; t.closed(error));<a name="line.356"></a>
+<span class="sourceLineNo">357</span>    tasks.clear();<a name="line.357"></a>
+<span class="sourceLineNo">358</span>  }<a name="line.358"></a>
+<span class="sourceLineNo">359</span><a name="line.359"></a>
+<span class="sourceLineNo">360</span>  @Override<a name="line.360"></a>
+<span class="sourceLineNo">361</span>  public void close() {<a name="line.361"></a>
+<span class="sourceLineNo">362</span>    if (closed.compareAndSet(false, true)) {<a name="line.362"></a>
+<span class="sourceLineNo">363</span>      LOG.debug("Close zookeeper connection {} to {}", getId(), connectString);<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      tasks.add(CLOSE);<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    }<a name="line.365"></a>
+<span class="sourceLineNo">366</span>  }<a name="line.366"></a>
+<span class="sourceLineNo">367</span><a name="line.367"></a>
+<span class="sourceLineNo">368</span>  @VisibleForTesting<a name="line.368"></a>
+<span class="sourceLineNo">369</span>  public String getConnectString() {<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    return connectString;<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  }<a name="line.371"></a>
+<span class="sourceLineNo">372</span>}<a name="line.372"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html b/devapidocs/src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html
index 51a1259..d782768 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.html
@@ -32,335 +32,352 @@
 <span class="sourceLineNo">024</span>import java.io.IOException;<a name="line.24"></a>
 <span class="sourceLineNo">025</span>import java.util.Arrays;<a name="line.25"></a>
 <span class="sourceLineNo">026</span>import java.util.EnumSet;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import java.util.concurrent.CompletableFuture;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import java.util.concurrent.DelayQueue;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import java.util.concurrent.Delayed;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import java.util.concurrent.TimeUnit;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import java.util.concurrent.atomic.AtomicBoolean;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.apache.hadoop.conf.Configuration;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.DoNotRetryIOException;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.util.FutureUtils;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.zookeeper.KeeperException;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.zookeeper.KeeperException.Code;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.zookeeper.ZooKeeper;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.zookeeper.data.Stat;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.slf4j.Logger;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.slf4j.LoggerFactory;<a name="line.42"></a>
-<span class="sourceLineNo">043</span><a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.44"></a>
-<span class="sourceLineNo">045</span><a name="line.45"></a>
-<span class="sourceLineNo">046</span>/**<a name="line.46"></a>
-<span class="sourceLineNo">047</span> * A very simple read only zookeeper implementation without watcher support.<a name="line.47"></a>
-<span class="sourceLineNo">048</span> */<a name="line.48"></a>
-<span class="sourceLineNo">049</span>@InterfaceAudience.Private<a name="line.49"></a>
-<span class="sourceLineNo">050</span>public final class ReadOnlyZKClient implements Closeable {<a name="line.50"></a>
-<span class="sourceLineNo">051</span><a name="line.51"></a>
-<span class="sourceLineNo">052</span>  private static final Logger LOG = LoggerFactory.getLogger(ReadOnlyZKClient.class);<a name="line.52"></a>
-<span class="sourceLineNo">053</span><a name="line.53"></a>
-<span class="sourceLineNo">054</span>  public static final String RECOVERY_RETRY = "zookeeper.recovery.retry";<a name="line.54"></a>
-<span class="sourceLineNo">055</span><a name="line.55"></a>
-<span class="sourceLineNo">056</span>  private static final int DEFAULT_RECOVERY_RETRY = 30;<a name="line.56"></a>
-<span class="sourceLineNo">057</span><a name="line.57"></a>
-<span class="sourceLineNo">058</span>  public static final String RECOVERY_RETRY_INTERVAL_MILLIS =<a name="line.58"></a>
-<span class="sourceLineNo">059</span>      "zookeeper.recovery.retry.intervalmill";<a name="line.59"></a>
-<span class="sourceLineNo">060</span><a name="line.60"></a>
-<span class="sourceLineNo">061</span>  private static final int DEFAULT_RECOVERY_RETRY_INTERVAL_MILLIS = 1000;<a name="line.61"></a>
-<span class="sourceLineNo">062</span><a name="line.62"></a>
-<span class="sourceLineNo">063</span>  public static final String KEEPALIVE_MILLIS = "zookeeper.keep-alive.time";<a name="line.63"></a>
-<span class="sourceLineNo">064</span><a name="line.64"></a>
-<span class="sourceLineNo">065</span>  private static final int DEFAULT_KEEPALIVE_MILLIS = 60000;<a name="line.65"></a>
-<span class="sourceLineNo">066</span><a name="line.66"></a>
-<span class="sourceLineNo">067</span>  private static final EnumSet&lt;Code&gt; FAIL_FAST_CODES = EnumSet.of(Code.NOAUTH, Code.AUTHFAILED);<a name="line.67"></a>
-<span class="sourceLineNo">068</span><a name="line.68"></a>
-<span class="sourceLineNo">069</span>  private final String connectString;<a name="line.69"></a>
-<span class="sourceLineNo">070</span><a name="line.70"></a>
-<span class="sourceLineNo">071</span>  private final int sessionTimeoutMs;<a name="line.71"></a>
-<span class="sourceLineNo">072</span><a name="line.72"></a>
-<span class="sourceLineNo">073</span>  private final int maxRetries;<a name="line.73"></a>
-<span class="sourceLineNo">074</span><a name="line.74"></a>
-<span class="sourceLineNo">075</span>  private final int retryIntervalMs;<a name="line.75"></a>
-<span class="sourceLineNo">076</span><a name="line.76"></a>
-<span class="sourceLineNo">077</span>  private final int keepAliveTimeMs;<a name="line.77"></a>
-<span class="sourceLineNo">078</span><a name="line.78"></a>
-<span class="sourceLineNo">079</span>  private static abstract class Task implements Delayed {<a name="line.79"></a>
-<span class="sourceLineNo">080</span><a name="line.80"></a>
-<span class="sourceLineNo">081</span>    protected long time = System.nanoTime();<a name="line.81"></a>
-<span class="sourceLineNo">082</span><a name="line.82"></a>
-<span class="sourceLineNo">083</span>    public boolean needZk() {<a name="line.83"></a>
-<span class="sourceLineNo">084</span>      return false;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>    }<a name="line.85"></a>
-<span class="sourceLineNo">086</span><a name="line.86"></a>
-<span class="sourceLineNo">087</span>    public void exec(ZooKeeper zk) {<a name="line.87"></a>
-<span class="sourceLineNo">088</span>    }<a name="line.88"></a>
-<span class="sourceLineNo">089</span><a name="line.89"></a>
-<span class="sourceLineNo">090</span>    public void connectFailed(IOException e) {<a name="line.90"></a>
-<span class="sourceLineNo">091</span>    }<a name="line.91"></a>
-<span class="sourceLineNo">092</span><a name="line.92"></a>
-<span class="sourceLineNo">093</span>    public void closed(IOException e) {<a name="line.93"></a>
-<span class="sourceLineNo">094</span>    }<a name="line.94"></a>
-<span class="sourceLineNo">095</span><a name="line.95"></a>
-<span class="sourceLineNo">096</span>    @Override<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    public int compareTo(Delayed o) {<a name="line.97"></a>
-<span class="sourceLineNo">098</span>      Task that = (Task) o;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>      int c = Long.compare(time, that.time);<a name="line.99"></a>
-<span class="sourceLineNo">100</span>      if (c != 0) {<a name="line.100"></a>
-<span class="sourceLineNo">101</span>        return c;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>      }<a name="line.102"></a>
-<span class="sourceLineNo">103</span>      return Integer.compare(System.identityHashCode(this), System.identityHashCode(that));<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    }<a name="line.104"></a>
-<span class="sourceLineNo">105</span><a name="line.105"></a>
-<span class="sourceLineNo">106</span>    @Override<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    public long getDelay(TimeUnit unit) {<a name="line.107"></a>
-<span class="sourceLineNo">108</span>      return unit.convert(time - System.nanoTime(), TimeUnit.NANOSECONDS);<a name="line.108"></a>
-<span class="sourceLineNo">109</span>    }<a name="line.109"></a>
-<span class="sourceLineNo">110</span>  }<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>  private static final Task CLOSE = new Task() {<a name="line.112"></a>
-<span class="sourceLineNo">113</span>  };<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>  private final DelayQueue&lt;Task&gt; tasks = new DelayQueue&lt;&gt;();<a name="line.115"></a>
-<span class="sourceLineNo">116</span><a name="line.116"></a>
-<span class="sourceLineNo">117</span>  private final AtomicBoolean closed = new AtomicBoolean(false);<a name="line.117"></a>
-<span class="sourceLineNo">118</span><a name="line.118"></a>
-<span class="sourceLineNo">119</span>  @VisibleForTesting<a name="line.119"></a>
-<span class="sourceLineNo">120</span>  ZooKeeper zookeeper;<a name="line.120"></a>
-<span class="sourceLineNo">121</span><a name="line.121"></a>
-<span class="sourceLineNo">122</span>  private int pendingRequests = 0;<a name="line.122"></a>
-<span class="sourceLineNo">123</span><a name="line.123"></a>
-<span class="sourceLineNo">124</span>  private String getId() {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    return String.format("0x%08x", System.identityHashCode(this));<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  }<a name="line.126"></a>
-<span class="sourceLineNo">127</span><a name="line.127"></a>
-<span class="sourceLineNo">128</span>  public ReadOnlyZKClient(Configuration conf) {<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    // We might use a different ZK for client access<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    String clientZkQuorumServers = ZKConfig.getClientZKQuorumServersString(conf);<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    if (clientZkQuorumServers != null) {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>      this.connectString = clientZkQuorumServers;<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    } else {<a name="line.133"></a>
-<span class="sourceLineNo">134</span>      this.connectString = ZKConfig.getZKQuorumServersString(conf);<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    }<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    this.sessionTimeoutMs = conf.getInt(ZK_SESSION_TIMEOUT, DEFAULT_ZK_SESSION_TIMEOUT);<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    this.maxRetries = conf.getInt(RECOVERY_RETRY, DEFAULT_RECOVERY_RETRY);<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    this.retryIntervalMs =<a name="line.138"></a>
-<span class="sourceLineNo">139</span>        conf.getInt(RECOVERY_RETRY_INTERVAL_MILLIS, DEFAULT_RECOVERY_RETRY_INTERVAL_MILLIS);<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    this.keepAliveTimeMs = conf.getInt(KEEPALIVE_MILLIS, DEFAULT_KEEPALIVE_MILLIS);<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    LOG.debug(<a name="line.141"></a>
-<span class="sourceLineNo">142</span>      "Connect {} to {} with session timeout={}ms, retries {}, " +<a name="line.142"></a>
-<span class="sourceLineNo">143</span>        "retry interval {}ms, keepAlive={}ms",<a name="line.143"></a>
-<span class="sourceLineNo">144</span>      getId(), connectString, sessionTimeoutMs, maxRetries, retryIntervalMs, keepAliveTimeMs);<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    Threads.setDaemonThreadRunning(new Thread(this::run),<a name="line.145"></a>
-<span class="sourceLineNo">146</span>      "ReadOnlyZKClient-" + connectString + "@" + getId());<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  }<a name="line.147"></a>
-<span class="sourceLineNo">148</span><a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private abstract class ZKTask&lt;T&gt; extends Task {<a name="line.149"></a>
-<span class="sourceLineNo">150</span><a name="line.150"></a>
-<span class="sourceLineNo">151</span>    protected final String path;<a name="line.151"></a>
-<span class="sourceLineNo">152</span><a name="line.152"></a>
-<span class="sourceLineNo">153</span>    private final CompletableFuture&lt;T&gt; future;<a name="line.153"></a>
-<span class="sourceLineNo">154</span><a name="line.154"></a>
-<span class="sourceLineNo">155</span>    private final String operationType;<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>    private int retries;<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>    protected ZKTask(String path, CompletableFuture&lt;T&gt; future, String operationType) {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>      this.path = path;<a name="line.160"></a>
-<span class="sourceLineNo">161</span>      this.future = future;<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      this.operationType = operationType;<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    }<a name="line.163"></a>
-<span class="sourceLineNo">164</span><a name="line.164"></a>
-<span class="sourceLineNo">165</span>    protected final void onComplete(ZooKeeper zk, int rc, T ret, boolean errorIfNoNode) {<a name="line.165"></a>
-<span class="sourceLineNo">166</span>      tasks.add(new Task() {<a name="line.166"></a>
-<span class="sourceLineNo">167</span><a name="line.167"></a>
-<span class="sourceLineNo">168</span>        @Override<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        public void exec(ZooKeeper alwaysNull) {<a name="line.169"></a>
-<span class="sourceLineNo">170</span>          pendingRequests--;<a name="line.170"></a>
-<span class="sourceLineNo">171</span>          Code code = Code.get(rc);<a name="line.171"></a>
-<span class="sourceLineNo">172</span>          if (code == Code.OK) {<a name="line.172"></a>
-<span class="sourceLineNo">173</span>            future.complete(ret);<a name="line.173"></a>
-<span class="sourceLineNo">174</span>          } else if (code == Code.NONODE) {<a name="line.174"></a>
-<span class="sourceLineNo">175</span>            if (errorIfNoNode) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>              future.completeExceptionally(KeeperException.create(code, path));<a name="line.176"></a>
-<span class="sourceLineNo">177</span>            } else {<a name="line.177"></a>
-<span class="sourceLineNo">178</span>              future.complete(ret);<a name="line.178"></a>
-<span class="sourceLineNo">179</span>            }<a name="line.179"></a>
-<span class="sourceLineNo">180</span>          } else if (FAIL_FAST_CODES.contains(code)) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>            future.completeExceptionally(KeeperException.create(code, path));<a name="line.181"></a>
-<span class="sourceLineNo">182</span>          } else {<a name="line.182"></a>
-<span class="sourceLineNo">183</span>            if (code == Code.SESSIONEXPIRED) {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>              LOG.warn("{} to {} session expired, close and reconnect", getId(), connectString);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>              try {<a name="line.185"></a>
-<span class="sourceLineNo">186</span>                zk.close();<a name="line.186"></a>
-<span class="sourceLineNo">187</span>              } catch (InterruptedException e) {<a name="line.187"></a>
-<span class="sourceLineNo">188</span>              }<a name="line.188"></a>
-<span class="sourceLineNo">189</span>            }<a name="line.189"></a>
-<span class="sourceLineNo">190</span>            if (ZKTask.this.delay(retryIntervalMs, maxRetries)) {<a name="line.190"></a>
-<span class="sourceLineNo">191</span>              LOG.warn("{} to {} failed for {} of {}, code = {}, retries = {}", getId(),<a name="line.191"></a>
-<span class="sourceLineNo">192</span>                connectString, operationType, path, code, ZKTask.this.retries);<a name="line.192"></a>
-<span class="sourceLineNo">193</span>              tasks.add(ZKTask.this);<a name="line.193"></a>
-<span class="sourceLineNo">194</span>            } else {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>              LOG.warn("{} to {} failed for {} of {}, code = {}, retries = {}, give up", getId(),<a name="line.195"></a>
-<span class="sourceLineNo">196</span>                connectString, operationType, path, code, ZKTask.this.retries);<a name="line.196"></a>
-<span class="sourceLineNo">197</span>              future.completeExceptionally(KeeperException.create(code, path));<a name="line.197"></a>
-<span class="sourceLineNo">198</span>            }<a name="line.198"></a>
-<span class="sourceLineNo">199</span>          }<a name="line.199"></a>
-<span class="sourceLineNo">200</span>        }<a name="line.200"></a>
-<span class="sourceLineNo">201</span><a name="line.201"></a>
-<span class="sourceLineNo">202</span>        @Override<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        public void closed(IOException e) {<a name="line.203"></a>
-<span class="sourceLineNo">204</span>          // It may happen that a request is succeeded and the onComplete has been called and pushed<a name="line.204"></a>
-<span class="sourceLineNo">205</span>          // us into the task queue, but before we get called a close is called and here we will<a name="line.205"></a>
-<span class="sourceLineNo">206</span>          // fail the request, although it is succeeded actually.<a name="line.206"></a>
-<span class="sourceLineNo">207</span>          // This is not a perfect solution but anyway, it is better than hang the requests for<a name="line.207"></a>
-<span class="sourceLineNo">208</span>          // ever, and also acceptable as if you close the zk client before actually getting the<a name="line.208"></a>
-<span class="sourceLineNo">209</span>          // response then a failure is always possible.<a name="line.209"></a>
-<span class="sourceLineNo">210</span>          future.completeExceptionally(e);<a name="line.210"></a>
-<span class="sourceLineNo">211</span>        }<a name="line.211"></a>
-<span class="sourceLineNo">212</span>      });<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    }<a name="line.213"></a>
-<span class="sourceLineNo">214</span><a name="line.214"></a>
-<span class="sourceLineNo">215</span>    @Override<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    public boolean needZk() {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      return true;<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    }<a name="line.218"></a>
-<span class="sourceLineNo">219</span><a name="line.219"></a>
-<span class="sourceLineNo">220</span>    protected abstract void doExec(ZooKeeper zk);<a name="line.220"></a>
-<span class="sourceLineNo">221</span><a name="line.221"></a>
-<span class="sourceLineNo">222</span>    @Override<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final void exec(ZooKeeper zk) {<a name="line.223"></a>
-<span class="sourceLineNo">224</span>      pendingRequests++;<a name="line.224"></a>
-<span class="sourceLineNo">225</span>      doExec(zk);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    }<a name="line.226"></a>
-<span class="sourceLineNo">227</span><a name="line.227"></a>
-<span class="sourceLineNo">228</span>    public boolean delay(long intervalMs, int maxRetries) {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      if (retries &gt;= maxRetries) {<a name="line.229"></a>
-<span class="sourceLineNo">230</span>        return false;<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      }<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      retries++;<a name="line.232"></a>
-<span class="sourceLineNo">233</span>      time = System.nanoTime() + TimeUnit.MILLISECONDS.toNanos(intervalMs);<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      return true;<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    }<a name="line.235"></a>
-<span class="sourceLineNo">236</span><a name="line.236"></a>
-<span class="sourceLineNo">237</span>    @Override<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    public void connectFailed(IOException e) {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      if (delay(retryIntervalMs, maxRetries)) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>        LOG.warn("{} to {} failed to connect to zk fo {} of {}, retries = {}", getId(),<a name="line.240"></a>
-<span class="sourceLineNo">241</span>          connectString, operationType, path, retries, e);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>        tasks.add(this);<a name="line.242"></a>
-<span class="sourceLineNo">243</span>      } else {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>        LOG.warn("{} to {} failed to connect to zk fo {} of {}, retries = {}, give up", getId(),<a name="line.244"></a>
-<span class="sourceLineNo">245</span>          connectString, operationType, path, retries, e);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>        future.completeExceptionally(e);<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><a name="line.249"></a>
-<span class="sourceLineNo">250</span>    @Override<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    public void closed(IOException e) {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      future.completeExceptionally(e);<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    }<a name="line.253"></a>
-<span class="sourceLineNo">254</span>  }<a name="line.254"></a>
-<span class="sourceLineNo">255</span><a name="line.255"></a>
-<span class="sourceLineNo">256</span>  public CompletableFuture&lt;byte[]&gt; get(String path) {<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    if (closed.get()) {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>      return FutureUtils.failedFuture(new DoNotRetryIOException("Client already closed"));<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    }<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    CompletableFuture&lt;byte[]&gt; future = new CompletableFuture&lt;&gt;();<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    tasks.add(new ZKTask&lt;byte[]&gt;(path, future, "get") {<a name="line.261"></a>
-<span class="sourceLineNo">262</span><a name="line.262"></a>
-<span class="sourceLineNo">263</span>      @Override<a name="line.263"></a>
-<span class="sourceLineNo">264</span>      protected void doExec(ZooKeeper zk) {<a name="line.264"></a>
-<span class="sourceLineNo">265</span>        zk.getData(path, false,<a name="line.265"></a>
-<span class="sourceLineNo">266</span>            (rc, path, ctx, data, stat) -&gt; onComplete(zk, rc, data, true), null);<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      }<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    });<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    return future;<a name="line.269"></a>
-<span class="sourceLineNo">270</span>  }<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>  public CompletableFuture&lt;Stat&gt; exists(String path) {<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    if (closed.get()) {<a name="line.273"></a>
-<span class="sourceLineNo">274</span>      return FutureUtils.failedFuture(new DoNotRetryIOException("Client already closed"));<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    }<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    CompletableFuture&lt;Stat&gt; future = new CompletableFuture&lt;&gt;();<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    tasks.add(new ZKTask&lt;Stat&gt;(path, future, "exists") {<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>      @Override<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      protected void doExec(ZooKeeper zk) {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>        zk.exists(path, false, (rc, path, ctx, stat) -&gt; onComplete(zk, rc, stat, false), null);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      }<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    });<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    return future;<a name="line.284"></a>
-<span class="sourceLineNo">285</span>  }<a name="line.285"></a>
-<span class="sourceLineNo">286</span><a name="line.286"></a>
-<span class="sourceLineNo">287</span>  private void closeZk() {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    if (zookeeper != null) {<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      try {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>        zookeeper.close();<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      } catch (InterruptedException e) {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      }<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      zookeeper = null;<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    }<a name="line.294"></a>
-<span class="sourceLineNo">295</span>  }<a name="line.295"></a>
-<span class="sourceLineNo">296</span><a name="line.296"></a>
-<span class="sourceLineNo">297</span>  private ZooKeeper getZk() throws IOException {<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    // may be closed when session expired<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    if (zookeeper == null || !zookeeper.getState().isAlive()) {<a name="line.299"></a>
-<span class="sourceLineNo">300</span>      zookeeper = new ZooKeeper(connectString, sessionTimeoutMs, e -&gt; {});<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    }<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    return zookeeper;<a name="line.302"></a>
-<span class="sourceLineNo">303</span>  }<a name="line.303"></a>
-<span class="sourceLineNo">304</span><a name="line.304"></a>
-<span class="sourceLineNo">305</span>  private void run() {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    for (;;) {<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      Task task;<a name="line.307"></a>
-<span class="sourceLineNo">308</span>      try {<a name="line.308"></a>
-<span class="sourceLineNo">309</span>        task = tasks.poll(keepAliveTimeMs, TimeUnit.MILLISECONDS);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      } catch (InterruptedException e) {<a name="line.310"></a>
-<span class="sourceLineNo">311</span>        continue;<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      }<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      if (task == CLOSE) {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        break;<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      }<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      if (task == null) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        if (pendingRequests == 0) {<a name="line.317"></a>
-<span class="sourceLineNo">318</span>          LOG.trace("{} to {} inactive for {}ms; closing (Will reconnect when new requests)",<a name="line.318"></a>
-<span class="sourceLineNo">319</span>            getId(), connectString, keepAliveTimeMs);<a name="line.319"></a>
-<span class="sourceLineNo">320</span>          closeZk();<a name="line.320"></a>
-<span class="sourceLineNo">321</span>        }<a name="line.321"></a>
-<span class="sourceLineNo">322</span>        continue;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      }<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      if (!task.needZk()) {<a name="line.324"></a>
-<span class="sourceLineNo">325</span>        task.exec(null);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      } else {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>        ZooKeeper zk;<a name="line.327"></a>
-<span class="sourceLineNo">328</span>        try {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>          zk = getZk();<a name="line.329"></a>
-<span class="sourceLineNo">330</span>        } catch (IOException e) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>          task.connectFailed(e);<a name="line.331"></a>
-<span class="sourceLineNo">332</span>          continue;<a name="line.332"></a>
-<span class="sourceLineNo">333</span>        }<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        task.exec(zk);<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>    closeZk();<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    DoNotRetryIOException error = new DoNotRetryIOException("Client already closed");<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    Arrays.stream(tasks.toArray(new Task[0])).forEach(t -&gt; t.closed(error));<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    tasks.clear();<a name="line.340"></a>
-<span class="sourceLineNo">341</span>  }<a name="line.341"></a>
-<span class="sourceLineNo">342</span><a name="line.342"></a>
-<span class="sourceLineNo">343</span>  @Override<a name="line.343"></a>
-<span class="sourceLineNo">344</span>  public void close() {<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    if (closed.compareAndSet(false, true)) {<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      LOG.debug("Close zookeeper connection {} to {}", getId(), connectString);<a name="line.346"></a>
-<span class="sourceLineNo">347</span>      tasks.add(CLOSE);<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    }<a name="line.348"></a>
-<span class="sourceLineNo">349</span>  }<a name="line.349"></a>
-<span class="sourceLineNo">350</span><a name="line.350"></a>
-<span class="sourceLineNo">351</span>  @VisibleForTesting<a name="line.351"></a>
-<span class="sourceLineNo">352</span>  public String getConnectString() {<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    return connectString;<a name="line.353"></a>
-<span class="sourceLineNo">354</span>  }<a name="line.354"></a>
-<span class="sourceLineNo">355</span>}<a name="line.355"></a>
+<span class="sourceLineNo">027</span>import java.util.List;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import java.util.concurrent.CompletableFuture;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import java.util.concurrent.DelayQueue;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import java.util.concurrent.Delayed;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import java.util.concurrent.TimeUnit;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import java.util.concurrent.atomic.AtomicBoolean;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import org.apache.hadoop.conf.Configuration;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.DoNotRetryIOException;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.util.FutureUtils;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.zookeeper.KeeperException;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.zookeeper.KeeperException.Code;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.zookeeper.ZooKeeper;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.zookeeper.data.Stat;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.slf4j.Logger;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.slf4j.LoggerFactory;<a name="line.43"></a>
+<span class="sourceLineNo">044</span><a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.45"></a>
+<span class="sourceLineNo">046</span><a name="line.46"></a>
+<span class="sourceLineNo">047</span>/**<a name="line.47"></a>
+<span class="sourceLineNo">048</span> * A very simple read only zookeeper implementation without watcher support.<a name="line.48"></a>
+<span class="sourceLineNo">049</span> */<a name="line.49"></a>
+<span class="sourceLineNo">050</span>@InterfaceAudience.Private<a name="line.50"></a>
+<span class="sourceLineNo">051</span>public final class ReadOnlyZKClient implements Closeable {<a name="line.51"></a>
+<span class="sourceLineNo">052</span><a name="line.52"></a>
+<span class="sourceLineNo">053</span>  private static final Logger LOG = LoggerFactory.getLogger(ReadOnlyZKClient.class);<a name="line.53"></a>
+<span class="sourceLineNo">054</span><a name="line.54"></a>
+<span class="sourceLineNo">055</span>  public static final String RECOVERY_RETRY = "zookeeper.recovery.retry";<a name="line.55"></a>
+<span class="sourceLineNo">056</span><a name="line.56"></a>
+<span class="sourceLineNo">057</span>  private static final int DEFAULT_RECOVERY_RETRY = 30;<a name="line.57"></a>
+<span class="sourceLineNo">058</span><a name="line.58"></a>
+<span class="sourceLineNo">059</span>  public static final String RECOVERY_RETRY_INTERVAL_MILLIS =<a name="line.59"></a>
+<span class="sourceLineNo">060</span>      "zookeeper.recovery.retry.intervalmill";<a name="line.60"></a>
+<span class="sourceLineNo">061</span><a name="line.61"></a>
+<span class="sourceLineNo">062</span>  private static final int DEFAULT_RECOVERY_RETRY_INTERVAL_MILLIS = 1000;<a name="line.62"></a>
+<span class="sourceLineNo">063</span><a name="line.63"></a>
+<span class="sourceLineNo">064</span>  public static final String KEEPALIVE_MILLIS = "zookeeper.keep-alive.time";<a name="line.64"></a>
+<span class="sourceLineNo">065</span><a name="line.65"></a>
+<span class="sourceLineNo">066</span>  private static final int DEFAULT_KEEPALIVE_MILLIS = 60000;<a name="line.66"></a>
+<span class="sourceLineNo">067</span><a name="line.67"></a>
+<span class="sourceLineNo">068</span>  private static final EnumSet&lt;Code&gt; FAIL_FAST_CODES = EnumSet.of(Code.NOAUTH, Code.AUTHFAILED);<a name="line.68"></a>
+<span class="sourceLineNo">069</span><a name="line.69"></a>
+<span class="sourceLineNo">070</span>  private final String connectString;<a name="line.70"></a>
+<span class="sourceLineNo">071</span><a name="line.71"></a>
+<span class="sourceLineNo">072</span>  private final int sessionTimeoutMs;<a name="line.72"></a>
+<span class="sourceLineNo">073</span><a name="line.73"></a>
+<span class="sourceLineNo">074</span>  private final int maxRetries;<a name="line.74"></a>
+<span class="sourceLineNo">075</span><a name="line.75"></a>
+<span class="sourceLineNo">076</span>  private final int retryIntervalMs;<a name="line.76"></a>
+<span class="sourceLineNo">077</span><a name="line.77"></a>
+<span class="sourceLineNo">078</span>  private final int keepAliveTimeMs;<a name="line.78"></a>
+<span class="sourceLineNo">079</span><a name="line.79"></a>
+<span class="sourceLineNo">080</span>  private static abstract class Task implements Delayed {<a name="line.80"></a>
+<span class="sourceLineNo">081</span><a name="line.81"></a>
+<span class="sourceLineNo">082</span>    protected long time = System.nanoTime();<a name="line.82"></a>
+<span class="sourceLineNo">083</span><a name="line.83"></a>
+<span class="sourceLineNo">084</span>    public boolean needZk() {<a name="line.84"></a>
+<span class="sourceLineNo">085</span>      return false;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>    }<a name="line.86"></a>
+<span class="sourceLineNo">087</span><a name="line.87"></a>
+<span class="sourceLineNo">088</span>    public void exec(ZooKeeper zk) {<a name="line.88"></a>
+<span class="sourceLineNo">089</span>    }<a name="line.89"></a>
+<span class="sourceLineNo">090</span><a name="line.90"></a>
+<span class="sourceLineNo">091</span>    public void connectFailed(IOException e) {<a name="line.91"></a>
+<span class="sourceLineNo">092</span>    }<a name="line.92"></a>
+<span class="sourceLineNo">093</span><a name="line.93"></a>
+<span class="sourceLineNo">094</span>    public void closed(IOException e) {<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    }<a name="line.95"></a>
+<span class="sourceLineNo">096</span><a name="line.96"></a>
+<span class="sourceLineNo">097</span>    @Override<a name="line.97"></a>
+<span class="sourceLineNo">098</span>    public int compareTo(Delayed o) {<a name="line.98"></a>
+<span class="sourceLineNo">099</span>      Task that = (Task) o;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>      int c = Long.compare(time, that.time);<a name="line.100"></a>
+<span class="sourceLineNo">101</span>      if (c != 0) {<a name="line.101"></a>
+<span class="sourceLineNo">102</span>        return c;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>      }<a name="line.103"></a>
+<span class="sourceLineNo">104</span>      return Integer.compare(System.identityHashCode(this), System.identityHashCode(that));<a name="line.104"></a>
+<span class="sourceLineNo">105</span>    }<a name="line.105"></a>
+<span class="sourceLineNo">106</span><a name="line.106"></a>
+<span class="sourceLineNo">107</span>    @Override<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    public long getDelay(TimeUnit unit) {<a name="line.108"></a>
+<span class="sourceLineNo">109</span>      return unit.convert(time - System.nanoTime(), TimeUnit.NANOSECONDS);<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    }<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  }<a name="line.111"></a>
+<span class="sourceLineNo">112</span><a name="line.112"></a>
+<span class="sourceLineNo">113</span>  private static final Task CLOSE = new Task() {<a name="line.113"></a>
+<span class="sourceLineNo">114</span>  };<a name="line.114"></a>
+<span class="sourceLineNo">115</span><a name="line.115"></a>
+<span class="sourceLineNo">116</span>  private final DelayQueue&lt;Task&gt; tasks = new DelayQueue&lt;&gt;();<a name="line.116"></a>
+<span class="sourceLineNo">117</span><a name="line.117"></a>
+<span class="sourceLineNo">118</span>  private final AtomicBoolean closed = new AtomicBoolean(false);<a name="line.118"></a>
+<span class="sourceLineNo">119</span><a name="line.119"></a>
+<span class="sourceLineNo">120</span>  @VisibleForTesting<a name="line.120"></a>
+<span class="sourceLineNo">121</span>  ZooKeeper zookeeper;<a name="line.121"></a>
+<span class="sourceLineNo">122</span><a name="line.122"></a>
+<span class="sourceLineNo">123</span>  private int pendingRequests = 0;<a name="line.123"></a>
+<span class="sourceLineNo">124</span><a name="line.124"></a>
+<span class="sourceLineNo">125</span>  private String getId() {<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    return String.format("0x%08x", System.identityHashCode(this));<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  }<a name="line.127"></a>
+<span class="sourceLineNo">128</span><a name="line.128"></a>
+<span class="sourceLineNo">129</span>  public ReadOnlyZKClient(Configuration conf) {<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    // We might use a different ZK for client access<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    String clientZkQuorumServers = ZKConfig.getClientZKQuorumServersString(conf);<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    if (clientZkQuorumServers != null) {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>      this.connectString = clientZkQuorumServers;<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    } else {<a name="line.134"></a>
+<span class="sourceLineNo">135</span>      this.connectString = ZKConfig.getZKQuorumServersString(conf);<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    }<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    this.sessionTimeoutMs = conf.getInt(ZK_SESSION_TIMEOUT, DEFAULT_ZK_SESSION_TIMEOUT);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    this.maxRetries = conf.getInt(RECOVERY_RETRY, DEFAULT_RECOVERY_RETRY);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    this.retryIntervalMs =<a name="line.139"></a>
+<span class="sourceLineNo">140</span>        conf.getInt(RECOVERY_RETRY_INTERVAL_MILLIS, DEFAULT_RECOVERY_RETRY_INTERVAL_MILLIS);<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    this.keepAliveTimeMs = conf.getInt(KEEPALIVE_MILLIS, DEFAULT_KEEPALIVE_MILLIS);<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    LOG.debug(<a name="line.142"></a>
+<span class="sourceLineNo">143</span>      "Connect {} to {} with session timeout={}ms, retries {}, " +<a name="line.143"></a>
+<span class="sourceLineNo">144</span>        "retry interval {}ms, keepAlive={}ms",<a name="line.144"></a>
+<span class="sourceLineNo">145</span>      getId(), connectString, sessionTimeoutMs, maxRetries, retryIntervalMs, keepAliveTimeMs);<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    Threads.setDaemonThreadRunning(new Thread(this::run),<a name="line.146"></a>
+<span class="sourceLineNo">147</span>      "ReadOnlyZKClient-" + connectString + "@" + getId());<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  }<a name="line.148"></a>
+<span class="sourceLineNo">149</span><a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private abstract class ZKTask&lt;T&gt; extends Task {<a name="line.150"></a>
+<span class="sourceLineNo">151</span><a name="line.151"></a>
+<span class="sourceLineNo">152</span>    protected final String path;<a name="line.152"></a>
+<span class="sourceLineNo">153</span><a name="line.153"></a>
+<span class="sourceLineNo">154</span>    private final CompletableFuture&lt;T&gt; future;<a name="line.154"></a>
+<span class="sourceLineNo">155</span><a name="line.155"></a>
+<span class="sourceLineNo">156</span>    private final String operationType;<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>    private int retries;<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>    protected ZKTask(String path, CompletableFuture&lt;T&gt; future, String operationType) {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>      this.path = path;<a name="line.161"></a>
+<span class="sourceLineNo">162</span>      this.future = future;<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      this.operationType = operationType;<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    }<a name="line.164"></a>
+<span class="sourceLineNo">165</span><a name="line.165"></a>
+<span class="sourceLineNo">166</span>    protected final void onComplete(ZooKeeper zk, int rc, T ret, boolean errorIfNoNode) {<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      tasks.add(new Task() {<a name="line.167"></a>
+<span class="sourceLineNo">168</span><a name="line.168"></a>
+<span class="sourceLineNo">169</span>        @Override<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        public void exec(ZooKeeper alwaysNull) {<a name="line.170"></a>
+<span class="sourceLineNo">171</span>          pendingRequests--;<a name="line.171"></a>
+<span class="sourceLineNo">172</span>          Code code = Code.get(rc);<a name="line.172"></a>
+<span class="sourceLineNo">173</span>          if (code == Code.OK) {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>            future.complete(ret);<a name="line.174"></a>
+<span class="sourceLineNo">175</span>          } else if (code == Code.NONODE) {<a name="line.175"></a>
+<span class="sourceLineNo">176</span>            if (errorIfNoNode) {<a name="line.176"></a>
+<span class="sourceLineNo">177</span>              future.completeExceptionally(KeeperException.create(code, path));<a name="line.177"></a>
+<span class="sourceLineNo">178</span>            } else {<a name="line.178"></a>
+<span class="sourceLineNo">179</span>              future.complete(ret);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>            }<a name="line.180"></a>
+<span class="sourceLineNo">181</span>          } else if (FAIL_FAST_CODES.contains(code)) {<a name="line.181"></a>
+<span class="sourceLineNo">182</span>            future.completeExceptionally(KeeperException.create(code, path));<a name="line.182"></a>
+<span class="sourceLineNo">183</span>          } else {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>            if (code == Code.SESSIONEXPIRED) {<a name="line.184"></a>
+<span class="sourceLineNo">185</span>              LOG.warn("{} to {} session expired, close and reconnect", getId(), connectString);<a name="line.185"></a>
+<span class="sourceLineNo">186</span>              try {<a name="line.186"></a>
+<span class="sourceLineNo">187</span>                zk.close();<a name="line.187"></a>
+<span class="sourceLineNo">188</span>              } catch (InterruptedException e) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>              }<a name="line.189"></a>
+<span class="sourceLineNo">190</span>            }<a name="line.190"></a>
+<span class="sourceLineNo">191</span>            if (ZKTask.this.delay(retryIntervalMs, maxRetries)) {<a name="line.191"></a>
+<span class="sourceLineNo">192</span>              LOG.warn("{} to {} failed for {} of {}, code = {}, retries = {}", getId(),<a name="line.192"></a>
+<span class="sourceLineNo">193</span>                connectString, operationType, path, code, ZKTask.this.retries);<a name="line.193"></a>
+<span class="sourceLineNo">194</span>              tasks.add(ZKTask.this);<a name="line.194"></a>
+<span class="sourceLineNo">195</span>            } else {<a name="line.195"></a>
+<span class="sourceLineNo">196</span>              LOG.warn("{} to {} failed for {} of {}, code = {}, retries = {}, give up", getId(),<a name="line.196"></a>
+<span class="sourceLineNo">197</span>                connectString, operationType, path, code, ZKTask.this.retries);<a name="line.197"></a>
+<span class="sourceLineNo">198</span>              future.completeExceptionally(KeeperException.create(code, path));<a name="line.198"></a>
+<span class="sourceLineNo">199</span>            }<a name="line.199"></a>
+<span class="sourceLineNo">200</span>          }<a name="line.200"></a>
+<span class="sourceLineNo">201</span>        }<a name="line.201"></a>
+<span class="sourceLineNo">202</span><a name="line.202"></a>
+<span class="sourceLineNo">203</span>        @Override<a name="line.203"></a>
+<span class="sourceLineNo">204</span>        public void closed(IOException e) {<a name="line.204"></a>
+<span class="sourceLineNo">205</span>          // It may happen that a request is succeeded and the onComplete has been called and pushed<a name="line.205"></a>
+<span class="sourceLineNo">206</span>          // us into the task queue, but before we get called a close is called and here we will<a name="line.206"></a>
+<span class="sourceLineNo">207</span>          // fail the request, although it is succeeded actually.<a name="line.207"></a>
+<span class="sourceLineNo">208</span>          // This is not a perfect solution but anyway, it is better than hang the requests for<a name="line.208"></a>
+<span class="sourceLineNo">209</span>          // ever, and also acceptable as if you close the zk client before actually getting the<a name="line.209"></a>
+<span class="sourceLineNo">210</span>          // response then a failure is always possible.<a name="line.210"></a>
+<span class="sourceLineNo">211</span>          future.completeExceptionally(e);<a name="line.211"></a>
+<span class="sourceLineNo">212</span>        }<a name="line.212"></a>
+<span class="sourceLineNo">213</span>      });<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    }<a name="line.214"></a>
+<span class="sourceLineNo">215</span><a name="line.215"></a>
+<span class="sourceLineNo">216</span>    @Override<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    public boolean needZk() {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      return true;<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    }<a name="line.219"></a>
+<span class="sourceLineNo">220</span><a name="line.220"></a>
+<span class="sourceLineNo">221</span>    protected abstract void doExec(ZooKeeper zk);<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>    @Override<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final void exec(ZooKeeper zk) {<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      pendingRequests++;<a name="line.225"></a>
+<span class="sourceLineNo">226</span>      doExec(zk);<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    }<a name="line.227"></a>
+<span class="sourceLineNo">228</span><a name="line.228"></a>
+<span class="sourceLineNo">229</span>    public boolean delay(long intervalMs, int maxRetries) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      if (retries &gt;= maxRetries) {<a name="line.230"></a>
+<span class="sourceLineNo">231</span>        return false;<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      }<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      retries++;<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      time = System.nanoTime() + TimeUnit.MILLISECONDS.toNanos(intervalMs);<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      return true;<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>    @Override<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    public void connectFailed(IOException e) {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      if (delay(retryIntervalMs, maxRetries)) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>        LOG.warn("{} to {} failed to connect to zk fo {} of {}, retries = {}", getId(),<a name="line.241"></a>
+<span class="sourceLineNo">242</span>          connectString, operationType, path, retries, e);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        tasks.add(this);<a name="line.243"></a>
+<span class="sourceLineNo">244</span>      } else {<a name="line.244"></a>
+<span class="sourceLineNo">245</span>        LOG.warn("{} to {} failed to connect to zk fo {} of {}, retries = {}, give up", getId(),<a name="line.245"></a>
+<span class="sourceLineNo">246</span>          connectString, operationType, path, retries, e);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>        future.completeExceptionally(e);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      }<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>    @Override<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    public void closed(IOException e) {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      future.completeExceptionally(e);<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    }<a name="line.254"></a>
+<span class="sourceLineNo">255</span>  }<a name="line.255"></a>
+<span class="sourceLineNo">256</span><a name="line.256"></a>
+<span class="sourceLineNo">257</span>  public CompletableFuture&lt;byte[]&gt; get(String path) {<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    if (closed.get()) {<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      return FutureUtils.failedFuture(new DoNotRetryIOException("Client already closed"));<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    }<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    CompletableFuture&lt;byte[]&gt; future = new CompletableFuture&lt;&gt;();<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    tasks.add(new ZKTask&lt;byte[]&gt;(path, future, "get") {<a name="line.262"></a>
+<span class="sourceLineNo">263</span><a name="line.263"></a>
+<span class="sourceLineNo">264</span>      @Override<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      protected void doExec(ZooKeeper zk) {<a name="line.265"></a>
+<span class="sourceLineNo">266</span>        zk.getData(path, false,<a name="line.266"></a>
+<span class="sourceLineNo">267</span>            (rc, path, ctx, data, stat) -&gt; onComplete(zk, rc, data, true), null);<a name="line.267"></a>
+<span class="sourceLineNo">268</span>      }<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    });<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    return future;<a name="line.270"></a>
+<span class="sourceLineNo">271</span>  }<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>  public CompletableFuture&lt;Stat&gt; exists(String path) {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    if (closed.get()) {<a name="line.274"></a>
+<span class="sourceLineNo">275</span>      return FutureUtils.failedFuture(new DoNotRetryIOException("Client already closed"));<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    }<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    CompletableFuture&lt;Stat&gt; future = new CompletableFuture&lt;&gt;();<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    tasks.add(new ZKTask&lt;Stat&gt;(path, future, "exists") {<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>      @Override<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      protected void doExec(ZooKeeper zk) {<a name="line.281"></a>
+<span class="sourceLineNo">282</span>        zk.exists(path, false, (rc, path, ctx, stat) -&gt; onComplete(zk, rc, stat, false), null);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      }<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    });<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    return future;<a name="line.285"></a>
+<span class="sourceLineNo">286</span>  }<a name="line.286"></a>
+<span class="sourceLineNo">287</span><a name="line.287"></a>
+<span class="sourceLineNo">288</span>  public CompletableFuture&lt;List&lt;String&gt;&gt; list(String path) {<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    if (closed.get()) {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>      return FutureUtils.failedFuture(new DoNotRetryIOException("Client already closed"));<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    }<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    CompletableFuture&lt;List&lt;String&gt;&gt; future = new CompletableFuture&lt;&gt;();<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    tasks.add(new ZKTask&lt;List&lt;String&gt;&gt;(path, future, "list") {<a name="line.293"></a>
+<span class="sourceLineNo">294</span><a name="line.294"></a>
+<span class="sourceLineNo">295</span>      @Override<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      protected void doExec(ZooKeeper zk) {<a name="line.296"></a>
+<span class="sourceLineNo">297</span>        zk.getChildren(path, false, (rc, path, ctx, children) -&gt; onComplete(zk, rc, children, true),<a name="line.297"></a>
+<span class="sourceLineNo">298</span>          null);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>      }<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    });<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    return future;<a name="line.301"></a>
+<span class="sourceLineNo">302</span>  }<a name="line.302"></a>
+<span class="sourceLineNo">303</span><a name="line.303"></a>
+<span class="sourceLineNo">304</span>  private void closeZk() {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    if (zookeeper != null) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>      try {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        zookeeper.close();<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      } catch (InterruptedException e) {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      }<a name="line.309"></a>
+<span class="sourceLineNo">310</span>      zookeeper = null;<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    }<a name="line.311"></a>
+<span class="sourceLineNo">312</span>  }<a name="line.312"></a>
+<span class="sourceLineNo">313</span><a name="line.313"></a>
+<span class="sourceLineNo">314</span>  private ZooKeeper getZk() throws IOException {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    // may be closed when session expired<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    if (zookeeper == null || !zookeeper.getState().isAlive()) {<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      zookeeper = new ZooKeeper(connectString, sessionTimeoutMs, e -&gt; {});<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    }<a name="line.318"></a>
+<span class="sourceLineNo">319</span>    return zookeeper;<a name="line.319"></a>
+<span class="sourceLineNo">320</span>  }<a name="line.320"></a>
+<span class="sourceLineNo">321</span><a name="line.321"></a>
+<span class="sourceLineNo">322</span>  private void run() {<a name="line.322"></a>
+<span class="sourceLineNo">323</span>    for (;;) {<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      Task task;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      try {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>        task = tasks.poll(keepAliveTimeMs, TimeUnit.MILLISECONDS);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      } catch (InterruptedException e) {<a name="line.327"></a>
+<span class="sourceLineNo">328</span>        continue;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      }<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      if (task == CLOSE) {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>        break;<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      }<a name="line.332"></a>
+<span class="sourceLineNo">333</span>      if (task == null) {<a name="line.333"></a>
+<span class="sourceLineNo">334</span>        if (pendingRequests == 0) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>          LOG.trace("{} to {} inactive for {}ms; closing (Will reconnect when new requests)",<a name="line.335"></a>
+<span class="sourceLineNo">336</span>            getId(), connectString, keepAliveTimeMs);<a name="line.336"></a>
+<span class="sourceLineNo">337</span>          closeZk();<a name="line.337"></a>
+<span class="sourceLineNo">338</span>        }<a name="line.338"></a>
+<span class="sourceLineNo">339</span>        continue;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>      }<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      if (!task.needZk()) {<a name="line.341"></a>
+<span class="sourceLineNo">342</span>        task.exec(null);<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      } else {<a name="line.343"></a>
+<span class="sourceLineNo">344</span>        ZooKeeper zk;<a name="line.344"></a>
+<span class="sourceLineNo">345</span>        try {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>          zk = getZk();<a name="line.346"></a>
+<span class="sourceLineNo">347</span>        } catch (IOException e) {<a name="line.347"></a>
+<span class="sourceLineNo">348</span>          task.connectFailed(e);<a name="line.348"></a>
+<span class="sourceLineNo">349</span>          continue;<a name="line.349"></a>
+<span class="sourceLineNo">350</span>        }<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        task.exec(zk);<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      }<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    }<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    closeZk();<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    DoNotRetryIOException error = new DoNotRetryIOException("Client already closed");<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    Arrays.stream(tasks.toArray(new Task[0])).forEach(t -&gt; t.closed(error));<a name="line.356"></a>
+<span class="sourceLineNo">357</span>    tasks.clear();<a name="line.357"></a>
+<span class="sourceLineNo">358</span>  }<a name="line.358"></a>
+<span class="sourceLineNo">359</span><a name="line.359"></a>
+<span class="sourceLineNo">360</span>  @Override<a name="line.360"></a>
+<span class="sourceLineNo">361</span>  public void close() {<a name="line.361"></a>
+<span class="sourceLineNo">362</span>    if (closed.compareAndSet(false, true)) {<a name="line.362"></a>
+<span class="sourceLineNo">363</span>      LOG.debug("Close zookeeper connection {} to {}", getId(), connectString);<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      tasks.add(CLOSE);<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    }<a name="line.365"></a>
+<span class="sourceLineNo">366</span>  }<a name="line.366"></a>
+<span class="sourceLineNo">367</span><a name="line.367"></a>
+<span class="sourceLineNo">368</span>  @VisibleForTesting<a name="line.368"></a>
+<span class="sourceLineNo">369</span>  public String getConnectString() {<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    return connectString;<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  }<a name="line.371"></a>
+<span class="sourceLineNo">372</span>}<a name="line.372"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/zookeeper/ZNodePaths.html b/devapidocs/src-html/org/apache/hadoop/hbase/zookeeper/ZNodePaths.html
index e43cc43..371e4c4 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/zookeeper/ZNodePaths.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/zookeeper/ZNodePaths.html
@@ -174,7 +174,7 @@
 <span class="sourceLineNo">166</span><a name="line.166"></a>
 <span class="sourceLineNo">167</span>  /**<a name="line.167"></a>
 <span class="sourceLineNo">168</span>   * Parse the meta replicaId from the passed znode<a name="line.168"></a>
-<span class="sourceLineNo">169</span>   * @param znode<a name="line.169"></a>
+<span class="sourceLineNo">169</span>   * @param znode the name of the znode, does not include baseZNode<a name="line.169"></a>
 <span class="sourceLineNo">170</span>   * @return replicaId<a name="line.170"></a>
 <span class="sourceLineNo">171</span>   */<a name="line.171"></a>
 <span class="sourceLineNo">172</span>  public int getMetaReplicaIdFromZnode(String znode) {<a name="line.172"></a>
@@ -186,7 +186,7 @@
 <span class="sourceLineNo">178</span><a name="line.178"></a>
 <span class="sourceLineNo">179</span>  /**<a name="line.179"></a>
 <span class="sourceLineNo">180</span>   * Is it the default meta replica's znode<a name="line.180"></a>
-<span class="sourceLineNo">181</span>   * @param znode<a name="line.181"></a>
+<span class="sourceLineNo">181</span>   * @param znode the name of the znode, does not include baseZNode<a name="line.181"></a>
 <span class="sourceLineNo">182</span>   * @return true or false<a name="line.182"></a>
 <span class="sourceLineNo">183</span>   */<a name="line.183"></a>
 <span class="sourceLineNo">184</span>  public boolean isDefaultMetaReplicaZnode(String znode) {<a name="line.184"></a>
diff --git a/downloads.html b/downloads.html
index c7f8068..0674d6a 100644
--- a/downloads.html
+++ b/downloads.html
@@ -401,7 +401,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-10</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-11</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 3ea18a7..59b6172 100644
--- a/export_control.html
+++ b/export_control.html
@@ -187,7 +187,7 @@ for more details.</p>
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-10</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-11</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 1e411f8..5efdf47 100644
--- a/index.html
+++ b/index.html
@@ -269,7 +269,7 @@ Apache HBase is an open-source, distributed, versioned, non-relational database
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-10</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-11</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/issue-management.html b/issue-management.html
index da77799..2042917 100644
--- a/issue-management.html
+++ b/issue-management.html
@@ -159,7 +159,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-10</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-11</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/licenses.html b/licenses.html
index b5ab9c4..fa4368c 100644
--- a/licenses.html
+++ b/licenses.html
@@ -362,7 +362,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-10</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-11</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/mailing-lists.html b/mailing-lists.html
index 93bae03..f717596 100644
--- a/mailing-lists.html
+++ b/mailing-lists.html
@@ -212,7 +212,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-10</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-11</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 5bf4ff5..e4f7d5e 100644
--- a/metrics.html
+++ b/metrics.html
@@ -315,7 +315,7 @@ export HBASE_REGIONSERVER_OPTS=&quot;$HBASE_JMX_OPTS -Dcom.sun.management.jmxrem
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-10</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-11</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 109e389..c00f67f 100644
--- a/old_news.html
+++ b/old_news.html
@@ -296,7 +296,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-10</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-11</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 c74d7d5..d386737 100644
--- a/plugin-management.html
+++ b/plugin-management.html
@@ -311,7 +311,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-10</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-11</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 8fae567..44ebf2b 100644
--- a/plugins.html
+++ b/plugins.html
@@ -238,7 +238,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-10</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-11</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 f7593ea..650d1ac 100644
--- a/poweredbyhbase.html
+++ b/poweredbyhbase.html
@@ -625,7 +625,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-10</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-11</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 846f33c..725b8ab 100644
--- a/project-info.html
+++ b/project-info.html
@@ -203,7 +203,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-10</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-11</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 4fb1e56..e44b989 100644
--- a/project-reports.html
+++ b/project-reports.html
@@ -176,7 +176,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-10</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-11</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 4eaee65..5bbc802 100644
--- a/pseudo-distributed.html
+++ b/pseudo-distributed.html
@@ -164,7 +164,7 @@ Running Apache HBase (TM) in pseudo-distributed mode
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-10</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-11</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 53ee0f9..0d72301 100644
--- a/replication.html
+++ b/replication.html
@@ -159,7 +159,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-10</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-11</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 8a637e8..52c37b2 100644
--- a/resources.html
+++ b/resources.html
@@ -187,7 +187,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-10</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-11</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/scm.html b/scm.html
index d275646..c809e4a 100644
--- a/scm.html
+++ b/scm.html
@@ -170,7 +170,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-10</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-11</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 3e794b1..a2a0cf0 100644
--- a/sponsors.html
+++ b/sponsors.html
@@ -189,7 +189,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-10</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-11</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/summary.html b/summary.html
index 5d94003..44647ca 100644
--- a/summary.html
+++ b/summary.html
@@ -202,7 +202,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-10</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-11</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 89b1435..105f4f2 100644
--- a/supportingprojects.html
+++ b/supportingprojects.html
@@ -376,7 +376,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-10</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-11</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/team.html b/team.html
index 84c4965..ab8cf05 100644
--- a/team.html
+++ b/team.html
@@ -643,7 +643,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-10</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-11</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/testdevapidocs/index-all.html b/testdevapidocs/index-all.html
index fbb172f..1771f88 100644
--- a/testdevapidocs/index-all.html
+++ b/testdevapidocs/index-all.html
@@ -54629,8 +54629,6 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/TestZKReplicationQueueStorage.html#testGetAllWALsCversionChange--">testGetAllWALsCversionChange()</a></span> - Method in class org.apache.hadoop.hbase.replication.<a href="org/apache/hadoop/hbase/replication/TestZKReplicationQueueStorage.html" title="class in org.apache.hadoop.hbase.replication">TestZKReplicationQueueStorage</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/zookeeper/TestReadOnlyZKClient.html#testGetAndExists--">testGetAndExists()</a></span> - Method in class org.apache.hadoop.hbase.zookeeper.<a href="org/apache/hadoop/hbase/zookeeper/TestReadOnlyZKClient.html" title="class in org.apache.hadoop.hbase.zookeeper">TestReadOnlyZKClient</a></dt>
-<dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/rest/TestGetAndPutResource.html" title="class in org.apache.hadoop.hbase.rest"><span class="typeNameLink">TestGetAndPutResource</span></a> - Class in <a href="org/apache/hadoop/hbase/rest/package-summary.html">org.apache.hadoop.hbase.rest</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/rest/TestGetAndPutResource.html#TestGetAndPutResource--">TestGetAndPutResource()</a></span> - Constructor for class org.apache.hadoop.hbase.rest.<a href="org/apache/hadoop/hbase/rest/TestGetAndPutResource.html" title="class in org.apache.hadoop.hbase.rest">TestGetAndPutResource</a></dt>
@@ -61730,6 +61728,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/security/access/TestAccessController.html#testRead--">testRead()</a></span> - Method in class org.apache.hadoop.hbase.security.access.<a href="org/apache/hadoop/hbase/security/access/TestAccessController.html" title="class in org.apache.hadoop.hbase.security.access">TestAccessController</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/zookeeper/TestReadOnlyZKClient.html#testRead--">testRead()</a></span> - Method in class org.apache.hadoop.hbase.zookeeper.<a href="org/apache/hadoop/hbase/zookeeper/TestReadOnlyZKClient.html" title="class in org.apache.hadoop.hbase.zookeeper">TestReadOnlyZKClient</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestHRegionInfo.html#testReadAndWriteHRegionInfoFile--">testReadAndWriteHRegionInfoFile()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestHRegionInfo.html" title="class in org.apache.hadoop.hbase.regionserver">TestHRegionInfo</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestRegionInfoBuilder.html#testReadAndWriteRegionInfoFile--">testReadAndWriteRegionInfoFile()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestRegionInfoBuilder.html" title="class in org.apache.hadoop.hbase.regionserver">TestRegionInfoBuilder</a></dt>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/client/TestZKAsyncRegistry.html b/testdevapidocs/org/apache/hadoop/hbase/client/TestZKAsyncRegistry.html
index aa2242a..27d9282 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/client/TestZKAsyncRegistry.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/client/TestZKAsyncRegistry.html
@@ -296,7 +296,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>tearDown</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestZKAsyncRegistry.html#line.68">tearDown</a>()
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestZKAsyncRegistry.html#line.72">tearDown</a>()
                      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -310,7 +310,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>test</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestZKAsyncRegistry.html#line.74">test</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestZKAsyncRegistry.html#line.78">test</a>()
           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a>,
                  <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutionException.html?is-external=true" title="class or interface in java.util.concurrent">ExecutionException</a>,
                  <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -328,7 +328,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testIndependentZKConnections</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestZKAsyncRegistry.html#line.98">testIndependentZKConnections</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestZKAsyncRegistry.html#line.102">testIndependentZKConnections</a>()
                                   throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/zookeeper/TestReadOnlyZKClient.html b/testdevapidocs/org/apache/hadoop/hbase/zookeeper/TestReadOnlyZKClient.html
index 3d8d358..5263bbc 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/zookeeper/TestReadOnlyZKClient.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/zookeeper/TestReadOnlyZKClient.html
@@ -109,7 +109,7 @@ var activeTableTab = "activeTableTab";
 <li class="blockList">
 <hr>
 <br>
-<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestReadOnlyZKClient.html#line.65">TestReadOnlyZKClient</a>
+<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestReadOnlyZKClient.html#line.67">TestReadOnlyZKClient</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
 </li>
 </ul>
@@ -199,15 +199,15 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </tr>
 <tr id="i2" class="altColor">
 <td class="colFirst"><code>void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/zookeeper/TestReadOnlyZKClient.html#testGetAndExists--">testGetAndExists</a></span>()</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/zookeeper/TestReadOnlyZKClient.html#testNoNode--">testNoNode</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i3" class="rowColor">
 <td class="colFirst"><code>void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/zookeeper/TestReadOnlyZKClient.html#testNoNode--">testNoNode</a></span>()</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/zookeeper/TestReadOnlyZKClient.html#testNotCloseZkWhenPending--">testNotCloseZkWhenPending</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i4" class="altColor">
 <td class="colFirst"><code>void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/zookeeper/TestReadOnlyZKClient.html#testNotCloseZkWhenPending--">testNotCloseZkWhenPending</a></span>()</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/zookeeper/TestReadOnlyZKClient.html#testRead--">testRead</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i5" class="rowColor">
 <td class="colFirst"><code>void</code></td>
@@ -245,7 +245,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>CLASS_RULE</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestReadOnlyZKClient.html#line.68">CLASS_RULE</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestReadOnlyZKClient.html#line.70">CLASS_RULE</a></pre>
 </li>
 </ul>
 <a name="UTIL">
@@ -254,7 +254,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>UTIL</h4>
-<pre>private static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseZKTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseZKTestingUtility</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestReadOnlyZKClient.html#line.71">UTIL</a></pre>
+<pre>private static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseZKTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseZKTestingUtility</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestReadOnlyZKClient.html#line.73">UTIL</a></pre>
 </li>
 </ul>
 <a name="PORT">
@@ -263,7 +263,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>PORT</h4>
-<pre>private static&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestReadOnlyZKClient.html#line.73">PORT</a></pre>
+<pre>private static&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestReadOnlyZKClient.html#line.75">PORT</a></pre>
 </li>
 </ul>
 <a name="PATH">
@@ -272,7 +272,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>PATH</h4>
-<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestReadOnlyZKClient.html#line.75">PATH</a></pre>
+<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestReadOnlyZKClient.html#line.77">PATH</a></pre>
 </li>
 </ul>
 <a name="DATA">
@@ -281,7 +281,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>DATA</h4>
-<pre>private static&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestReadOnlyZKClient.html#line.77">DATA</a></pre>
+<pre>private static&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestReadOnlyZKClient.html#line.79">DATA</a></pre>
 </li>
 </ul>
 <a name="CHILDREN">
@@ -290,7 +290,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>CHILDREN</h4>
-<pre>private static&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestReadOnlyZKClient.html#line.79">CHILDREN</a></pre>
+<pre>private static&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestReadOnlyZKClient.html#line.81">CHILDREN</a></pre>
 </li>
 </ul>
 <a name="RO_ZK">
@@ -299,7 +299,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RO_ZK</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.zookeeper.ReadOnlyZKClient <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestReadOnlyZKClient.html#line.81">RO_ZK</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.zookeeper.ReadOnlyZKClient <a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestReadOnlyZKClient.html#line.83">RO_ZK</a></pre>
 </li>
 </ul>
 </li>
@@ -316,7 +316,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TestReadOnlyZKClient</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestReadOnlyZKClient.html#line.65">TestReadOnlyZKClient</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestReadOnlyZKClient.html#line.67">TestReadOnlyZKClient</a>()</pre>
 </li>
 </ul>
 </li>
@@ -333,7 +333,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setUp</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestReadOnlyZKClient.html#line.84">setUp</a>()
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestReadOnlyZKClient.html#line.86">setUp</a>()
                   throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -347,7 +347,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>tearDown</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestReadOnlyZKClient.html#line.106">tearDown</a>()
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestReadOnlyZKClient.html#line.108">tearDown</a>()
                      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -361,7 +361,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>waitForIdleConnectionClosed</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestReadOnlyZKClient.html#line.112">waitForIdleConnectionClosed</a>()
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestReadOnlyZKClient.html#line.114">waitForIdleConnectionClosed</a>()
                                   throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -369,14 +369,14 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </dl>
 </li>
 </ul>
-<a name="testGetAndExists--">
+<a name="testRead--">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>testGetAndExists</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestReadOnlyZKClient.html#line.129">testGetAndExists</a>()
-                      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
+<h4>testRead</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestReadOnlyZKClient.html#line.131">testRead</a>()
+              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></code></dd>
@@ -389,7 +389,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testNoNode</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestReadOnlyZKClient.html#line.137">testNoNode</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestReadOnlyZKClient.html#line.145">testNoNode</a>()
                 throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a>,
                        <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutionException.html?is-external=true" title="class or interface in java.util.concurrent">ExecutionException</a></pre>
 <dl>
@@ -405,7 +405,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testSessionExpire</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestReadOnlyZKClient.html#line.153">testSessionExpire</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestReadOnlyZKClient.html#line.170">testSessionExpire</a>()
                        throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -419,7 +419,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testNotCloseZkWhenPending</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestReadOnlyZKClient.html#line.168">testNotCloseZkWhenPending</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/zookeeper/TestReadOnlyZKClient.html#line.185">testNotCloseZkWhenPending</a>()
                                throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/client/TestZKAsyncRegistry.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/client/TestZKAsyncRegistry.html
index 0b91238..c548e32 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/client/TestZKAsyncRegistry.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/client/TestZKAsyncRegistry.html
@@ -69,57 +69,61 @@
 <span class="sourceLineNo">061</span>  public static void setUp() throws Exception {<a name="line.61"></a>
 <span class="sourceLineNo">062</span>    TEST_UTIL.getConfiguration().setInt(META_REPLICAS_NUM, 3);<a name="line.62"></a>
 <span class="sourceLineNo">063</span>    TEST_UTIL.startMiniCluster(3);<a name="line.63"></a>
-<span class="sourceLineNo">064</span>    REGISTRY = new ZKAsyncRegistry(TEST_UTIL.getConfiguration());<a name="line.64"></a>
-<span class="sourceLineNo">065</span>  }<a name="line.65"></a>
-<span class="sourceLineNo">066</span><a name="line.66"></a>
-<span class="sourceLineNo">067</span>  @AfterClass<a name="line.67"></a>
-<span class="sourceLineNo">068</span>  public static void tearDown() throws Exception {<a name="line.68"></a>
-<span class="sourceLineNo">069</span>    IOUtils.closeQuietly(REGISTRY);<a name="line.69"></a>
-<span class="sourceLineNo">070</span>    TEST_UTIL.shutdownMiniCluster();<a name="line.70"></a>
-<span class="sourceLineNo">071</span>  }<a name="line.71"></a>
-<span class="sourceLineNo">072</span><a name="line.72"></a>
-<span class="sourceLineNo">073</span>  @Test<a name="line.73"></a>
-<span class="sourceLineNo">074</span>  public void test() throws InterruptedException, ExecutionException, IOException {<a name="line.74"></a>
-<span class="sourceLineNo">075</span>    LOG.info("STARTED TEST");<a name="line.75"></a>
-<span class="sourceLineNo">076</span>    String clusterId = REGISTRY.getClusterId().get();<a name="line.76"></a>
-<span class="sourceLineNo">077</span>    String expectedClusterId = TEST_UTIL.getHBaseCluster().getMaster().getClusterId();<a name="line.77"></a>
-<span class="sourceLineNo">078</span>    assertEquals("Expected " + expectedClusterId + ", found=" + clusterId, expectedClusterId,<a name="line.78"></a>
-<span class="sourceLineNo">079</span>      clusterId);<a name="line.79"></a>
-<span class="sourceLineNo">080</span>    assertEquals(TEST_UTIL.getHBaseCluster().getClusterMetrics().getLiveServerMetrics().size(),<a name="line.80"></a>
-<span class="sourceLineNo">081</span>      REGISTRY.getCurrentNrHRS().get().intValue());<a name="line.81"></a>
-<span class="sourceLineNo">082</span>    assertEquals(TEST_UTIL.getHBaseCluster().getMaster().getServerName(),<a name="line.82"></a>
-<span class="sourceLineNo">083</span>      REGISTRY.getMasterAddress().get());<a name="line.83"></a>
-<span class="sourceLineNo">084</span>    assertEquals(-1, REGISTRY.getMasterInfoPort().get().intValue());<a name="line.84"></a>
-<span class="sourceLineNo">085</span>    RegionReplicaTestHelper<a name="line.85"></a>
-<span class="sourceLineNo">086</span>      .waitUntilAllMetaReplicasHavingRegionLocation(TEST_UTIL.getConfiguration(), REGISTRY, 3);<a name="line.86"></a>
-<span class="sourceLineNo">087</span>    RegionLocations locs = REGISTRY.getMetaRegionLocation().get();<a name="line.87"></a>
-<span class="sourceLineNo">088</span>    assertEquals(3, locs.getRegionLocations().length);<a name="line.88"></a>
-<span class="sourceLineNo">089</span>    IntStream.range(0, 3).forEach(i -&gt; {<a name="line.89"></a>
-<span class="sourceLineNo">090</span>      HRegionLocation loc = locs.getRegionLocation(i);<a name="line.90"></a>
-<span class="sourceLineNo">091</span>      assertNotNull("Replica " + i + " doesn't have location", loc);<a name="line.91"></a>
-<span class="sourceLineNo">092</span>      assertEquals(TableName.META_TABLE_NAME, loc.getRegion().getTable());<a name="line.92"></a>
-<span class="sourceLineNo">093</span>      assertEquals(i, loc.getRegion().getReplicaId());<a name="line.93"></a>
-<span class="sourceLineNo">094</span>    });<a name="line.94"></a>
-<span class="sourceLineNo">095</span>  }<a name="line.95"></a>
-<span class="sourceLineNo">096</span><a name="line.96"></a>
-<span class="sourceLineNo">097</span>  @Test<a name="line.97"></a>
-<span class="sourceLineNo">098</span>  public void testIndependentZKConnections() throws IOException {<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    try (ReadOnlyZKClient zk1 = REGISTRY.getZKClient()) {<a name="line.99"></a>
-<span class="sourceLineNo">100</span>      Configuration otherConf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.100"></a>
-<span class="sourceLineNo">101</span>      otherConf.set(HConstants.ZOOKEEPER_QUORUM, "127.0.0.1");<a name="line.101"></a>
-<span class="sourceLineNo">102</span>      try (ZKAsyncRegistry otherRegistry = new ZKAsyncRegistry(otherConf)) {<a name="line.102"></a>
-<span class="sourceLineNo">103</span>        ReadOnlyZKClient zk2 = otherRegistry.getZKClient();<a name="line.103"></a>
-<span class="sourceLineNo">104</span>        assertNotSame("Using a different configuration / quorum should result in different " +<a name="line.104"></a>
-<span class="sourceLineNo">105</span>          "backing zk connection.", zk1, zk2);<a name="line.105"></a>
-<span class="sourceLineNo">106</span>        assertNotEquals(<a name="line.106"></a>
-<span class="sourceLineNo">107</span>          "Using a different configrution / quorum should be reflected in the zk connection.",<a name="line.107"></a>
-<span class="sourceLineNo">108</span>          zk1.getConnectString(), zk2.getConnectString());<a name="line.108"></a>
-<span class="sourceLineNo">109</span>      }<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    } finally {<a name="line.110"></a>
-<span class="sourceLineNo">111</span>      LOG.info("DONE!");<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    }<a name="line.112"></a>
-<span class="sourceLineNo">113</span>  }<a name="line.113"></a>
-<span class="sourceLineNo">114</span>}<a name="line.114"></a>
+<span class="sourceLineNo">064</span>    Configuration conf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.64"></a>
+<span class="sourceLineNo">065</span>    // make sure that we do not depend on this config when getting locations for meta replicas, see<a name="line.65"></a>
+<span class="sourceLineNo">066</span>    // HBASE-21658.<a name="line.66"></a>
+<span class="sourceLineNo">067</span>    conf.setInt(META_REPLICAS_NUM, 1);<a name="line.67"></a>
+<span class="sourceLineNo">068</span>    REGISTRY = new ZKAsyncRegistry(conf);<a name="line.68"></a>
+<span class="sourceLineNo">069</span>  }<a name="line.69"></a>
+<span class="sourceLineNo">070</span><a name="line.70"></a>
+<span class="sourceLineNo">071</span>  @AfterClass<a name="line.71"></a>
+<span class="sourceLineNo">072</span>  public static void tearDown() throws Exception {<a name="line.72"></a>
+<span class="sourceLineNo">073</span>    IOUtils.closeQuietly(REGISTRY);<a name="line.73"></a>
+<span class="sourceLineNo">074</span>    TEST_UTIL.shutdownMiniCluster();<a name="line.74"></a>
+<span class="sourceLineNo">075</span>  }<a name="line.75"></a>
+<span class="sourceLineNo">076</span><a name="line.76"></a>
+<span class="sourceLineNo">077</span>  @Test<a name="line.77"></a>
+<span class="sourceLineNo">078</span>  public void test() throws InterruptedException, ExecutionException, IOException {<a name="line.78"></a>
+<span class="sourceLineNo">079</span>    LOG.info("STARTED TEST");<a name="line.79"></a>
+<span class="sourceLineNo">080</span>    String clusterId = REGISTRY.getClusterId().get();<a name="line.80"></a>
+<span class="sourceLineNo">081</span>    String expectedClusterId = TEST_UTIL.getHBaseCluster().getMaster().getClusterId();<a name="line.81"></a>
+<span class="sourceLineNo">082</span>    assertEquals("Expected " + expectedClusterId + ", found=" + clusterId, expectedClusterId,<a name="line.82"></a>
+<span class="sourceLineNo">083</span>      clusterId);<a name="line.83"></a>
+<span class="sourceLineNo">084</span>    assertEquals(TEST_UTIL.getHBaseCluster().getClusterMetrics().getLiveServerMetrics().size(),<a name="line.84"></a>
+<span class="sourceLineNo">085</span>      REGISTRY.getCurrentNrHRS().get().intValue());<a name="line.85"></a>
+<span class="sourceLineNo">086</span>    assertEquals(TEST_UTIL.getHBaseCluster().getMaster().getServerName(),<a name="line.86"></a>
+<span class="sourceLineNo">087</span>      REGISTRY.getMasterAddress().get());<a name="line.87"></a>
+<span class="sourceLineNo">088</span>    assertEquals(-1, REGISTRY.getMasterInfoPort().get().intValue());<a name="line.88"></a>
+<span class="sourceLineNo">089</span>    RegionReplicaTestHelper<a name="line.89"></a>
+<span class="sourceLineNo">090</span>      .waitUntilAllMetaReplicasHavingRegionLocation(TEST_UTIL.getConfiguration(), REGISTRY, 3);<a name="line.90"></a>
+<span class="sourceLineNo">091</span>    RegionLocations locs = REGISTRY.getMetaRegionLocation().get();<a name="line.91"></a>
+<span class="sourceLineNo">092</span>    assertEquals(3, locs.getRegionLocations().length);<a name="line.92"></a>
+<span class="sourceLineNo">093</span>    IntStream.range(0, 3).forEach(i -&gt; {<a name="line.93"></a>
+<span class="sourceLineNo">094</span>      HRegionLocation loc = locs.getRegionLocation(i);<a name="line.94"></a>
+<span class="sourceLineNo">095</span>      assertNotNull("Replica " + i + " doesn't have location", loc);<a name="line.95"></a>
+<span class="sourceLineNo">096</span>      assertEquals(TableName.META_TABLE_NAME, loc.getRegion().getTable());<a name="line.96"></a>
+<span class="sourceLineNo">097</span>      assertEquals(i, loc.getRegion().getReplicaId());<a name="line.97"></a>
+<span class="sourceLineNo">098</span>    });<a name="line.98"></a>
+<span class="sourceLineNo">099</span>  }<a name="line.99"></a>
+<span class="sourceLineNo">100</span><a name="line.100"></a>
+<span class="sourceLineNo">101</span>  @Test<a name="line.101"></a>
+<span class="sourceLineNo">102</span>  public void testIndependentZKConnections() throws IOException {<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    try (ReadOnlyZKClient zk1 = REGISTRY.getZKClient()) {<a name="line.103"></a>
+<span class="sourceLineNo">104</span>      Configuration otherConf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.104"></a>
+<span class="sourceLineNo">105</span>      otherConf.set(HConstants.ZOOKEEPER_QUORUM, "127.0.0.1");<a name="line.105"></a>
+<span class="sourceLineNo">106</span>      try (ZKAsyncRegistry otherRegistry = new ZKAsyncRegistry(otherConf)) {<a name="line.106"></a>
+<span class="sourceLineNo">107</span>        ReadOnlyZKClient zk2 = otherRegistry.getZKClient();<a name="line.107"></a>
+<span class="sourceLineNo">108</span>        assertNotSame("Using a different configuration / quorum should result in different " +<a name="line.108"></a>
+<span class="sourceLineNo">109</span>          "backing zk connection.", zk1, zk2);<a name="line.109"></a>
+<span class="sourceLineNo">110</span>        assertNotEquals(<a name="line.110"></a>
+<span class="sourceLineNo">111</span>          "Using a different configrution / quorum should be reflected in the zk connection.",<a name="line.111"></a>
+<span class="sourceLineNo">112</span>          zk1.getConnectString(), zk2.getConnectString());<a name="line.112"></a>
+<span class="sourceLineNo">113</span>      }<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    } finally {<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      LOG.info("DONE!");<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    }<a name="line.116"></a>
+<span class="sourceLineNo">117</span>  }<a name="line.117"></a>
+<span class="sourceLineNo">118</span>}<a name="line.118"></a>
 
 
 
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/zookeeper/TestReadOnlyZKClient.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/zookeeper/TestReadOnlyZKClient.html
index c23ff97..cb22e7b 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/zookeeper/TestReadOnlyZKClient.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/zookeeper/TestReadOnlyZKClient.html
@@ -46,157 +46,174 @@
 <span class="sourceLineNo">038</span>import static org.mockito.Mockito.when;<a name="line.38"></a>
 <span class="sourceLineNo">039</span><a name="line.39"></a>
 <span class="sourceLineNo">040</span>import java.io.IOException;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import java.util.concurrent.CompletableFuture;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import java.util.concurrent.Exchanger;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import java.util.concurrent.ExecutionException;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import java.util.concurrent.ThreadLocalRandom;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.conf.Configuration;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.HBaseZKTestingUtility;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.HConstants;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.Waiter.ExplainingPredicate;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.testclassification.ZKTests;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.zookeeper.AsyncCallback;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.zookeeper.CreateMode;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.zookeeper.KeeperException;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.zookeeper.KeeperException.Code;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.apache.zookeeper.ZooDefs;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.zookeeper.ZooKeeper;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.junit.AfterClass;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.junit.BeforeClass;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.junit.ClassRule;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.junit.Test;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.junit.experimental.categories.Category;<a name="line.62"></a>
-<span class="sourceLineNo">063</span><a name="line.63"></a>
-<span class="sourceLineNo">064</span>@Category({ ZKTests.class, MediumTests.class })<a name="line.64"></a>
-<span class="sourceLineNo">065</span>public class TestReadOnlyZKClient {<a name="line.65"></a>
-<span class="sourceLineNo">066</span><a name="line.66"></a>
-<span class="sourceLineNo">067</span>  @ClassRule<a name="line.67"></a>
-<span class="sourceLineNo">068</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.68"></a>
-<span class="sourceLineNo">069</span>      HBaseClassTestRule.forClass(TestReadOnlyZKClient.class);<a name="line.69"></a>
-<span class="sourceLineNo">070</span><a name="line.70"></a>
-<span class="sourceLineNo">071</span>  private static HBaseZKTestingUtility UTIL = new HBaseZKTestingUtility();<a name="line.71"></a>
+<span class="sourceLineNo">041</span>import java.util.Collections;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import java.util.List;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import java.util.concurrent.CompletableFuture;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import java.util.concurrent.Exchanger;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import java.util.concurrent.ExecutionException;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import java.util.concurrent.ThreadLocalRandom;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.conf.Configuration;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.HBaseZKTestingUtility;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.HConstants;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.Waiter.ExplainingPredicate;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.testclassification.ZKTests;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.zookeeper.AsyncCallback;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.zookeeper.CreateMode;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.zookeeper.KeeperException;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.zookeeper.KeeperException.Code;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.apache.zookeeper.ZooDefs;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.apache.zookeeper.ZooKeeper;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.junit.AfterClass;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.junit.BeforeClass;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.junit.ClassRule;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.junit.Test;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.junit.experimental.categories.Category;<a name="line.64"></a>
+<span class="sourceLineNo">065</span><a name="line.65"></a>
+<span class="sourceLineNo">066</span>@Category({ ZKTests.class, MediumTests.class })<a name="line.66"></a>
+<span class="sourceLineNo">067</span>public class TestReadOnlyZKClient {<a name="line.67"></a>
+<span class="sourceLineNo">068</span><a name="line.68"></a>
+<span class="sourceLineNo">069</span>  @ClassRule<a name="line.69"></a>
+<span class="sourceLineNo">070</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.70"></a>
+<span class="sourceLineNo">071</span>      HBaseClassTestRule.forClass(TestReadOnlyZKClient.class);<a name="line.71"></a>
 <span class="sourceLineNo">072</span><a name="line.72"></a>
-<span class="sourceLineNo">073</span>  private static int PORT;<a name="line.73"></a>
+<span class="sourceLineNo">073</span>  private static HBaseZKTestingUtility UTIL = new HBaseZKTestingUtility();<a name="line.73"></a>
 <span class="sourceLineNo">074</span><a name="line.74"></a>
-<span class="sourceLineNo">075</span>  private static String PATH = "/test";<a name="line.75"></a>
+<span class="sourceLineNo">075</span>  private static int PORT;<a name="line.75"></a>
 <span class="sourceLineNo">076</span><a name="line.76"></a>
-<span class="sourceLineNo">077</span>  private static byte[] DATA;<a name="line.77"></a>
+<span class="sourceLineNo">077</span>  private static String PATH = "/test";<a name="line.77"></a>
 <span class="sourceLineNo">078</span><a name="line.78"></a>
-<span class="sourceLineNo">079</span>  private static int CHILDREN = 5;<a name="line.79"></a>
+<span class="sourceLineNo">079</span>  private static byte[] DATA;<a name="line.79"></a>
 <span class="sourceLineNo">080</span><a name="line.80"></a>
-<span class="sourceLineNo">081</span>  private static ReadOnlyZKClient RO_ZK;<a name="line.81"></a>
+<span class="sourceLineNo">081</span>  private static int CHILDREN = 5;<a name="line.81"></a>
 <span class="sourceLineNo">082</span><a name="line.82"></a>
-<span class="sourceLineNo">083</span>  @BeforeClass<a name="line.83"></a>
-<span class="sourceLineNo">084</span>  public static void setUp() throws Exception {<a name="line.84"></a>
-<span class="sourceLineNo">085</span>    PORT = UTIL.startMiniZKCluster().getClientPort();<a name="line.85"></a>
-<span class="sourceLineNo">086</span><a name="line.86"></a>
-<span class="sourceLineNo">087</span>    ZooKeeper zk = ZooKeeperHelper.getConnectedZooKeeper("localhost:" + PORT, 10000);<a name="line.87"></a>
-<span class="sourceLineNo">088</span>    DATA = new byte[10];<a name="line.88"></a>
-<span class="sourceLineNo">089</span>    ThreadLocalRandom.current().nextBytes(DATA);<a name="line.89"></a>
-<span class="sourceLineNo">090</span>    zk.create(PATH, DATA, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);<a name="line.90"></a>
-<span class="sourceLineNo">091</span>    for (int i = 0; i &lt; CHILDREN; i++) {<a name="line.91"></a>
-<span class="sourceLineNo">092</span>      zk.create(PATH + "/c" + i, new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);<a name="line.92"></a>
-<span class="sourceLineNo">093</span>    }<a name="line.93"></a>
-<span class="sourceLineNo">094</span>    zk.close();<a name="line.94"></a>
-<span class="sourceLineNo">095</span>    Configuration conf = UTIL.getConfiguration();<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    conf.set(HConstants.ZOOKEEPER_QUORUM, "localhost:" + PORT);<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    conf.setInt(ReadOnlyZKClient.RECOVERY_RETRY, 3);<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    conf.setInt(ReadOnlyZKClient.RECOVERY_RETRY_INTERVAL_MILLIS, 100);<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    conf.setInt(ReadOnlyZKClient.KEEPALIVE_MILLIS, 3000);<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    RO_ZK = new ReadOnlyZKClient(conf);<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    // only connect when necessary<a name="line.101"></a>
-<span class="sourceLineNo">102</span>    assertNull(RO_ZK.zookeeper);<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  }<a name="line.103"></a>
-<span class="sourceLineNo">104</span><a name="line.104"></a>
-<span class="sourceLineNo">105</span>  @AfterClass<a name="line.105"></a>
-<span class="sourceLineNo">106</span>  public static void tearDown() throws IOException {<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    RO_ZK.close();<a name="line.107"></a>
-<span class="sourceLineNo">108</span>    UTIL.shutdownMiniZKCluster();<a name="line.108"></a>
-<span class="sourceLineNo">109</span>    UTIL.cleanupTestDir();<a name="line.109"></a>
-<span class="sourceLineNo">110</span>  }<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>  private void waitForIdleConnectionClosed() throws Exception {<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    // The zookeeper client should be closed finally after the keep alive time elapsed<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    UTIL.waitFor(10000, new ExplainingPredicate&lt;Exception&gt;() {<a name="line.114"></a>
-<span class="sourceLineNo">115</span><a name="line.115"></a>
-<span class="sourceLineNo">116</span>      @Override<a name="line.116"></a>
-<span class="sourceLineNo">117</span>      public boolean evaluate() throws Exception {<a name="line.117"></a>
-<span class="sourceLineNo">118</span>        return RO_ZK.zookeeper == null;<a name="line.118"></a>
-<span class="sourceLineNo">119</span>      }<a name="line.119"></a>
-<span class="sourceLineNo">120</span><a name="line.120"></a>
-<span class="sourceLineNo">121</span>      @Override<a name="line.121"></a>
-<span class="sourceLineNo">122</span>      public String explainFailure() throws Exception {<a name="line.122"></a>
-<span class="sourceLineNo">123</span>        return "Connection to zookeeper is still alive";<a name="line.123"></a>
-<span class="sourceLineNo">124</span>      }<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    });<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  }<a name="line.126"></a>
-<span class="sourceLineNo">127</span><a name="line.127"></a>
-<span class="sourceLineNo">128</span>  @Test<a name="line.128"></a>
-<span class="sourceLineNo">129</span>  public void testGetAndExists() throws Exception {<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    assertArrayEquals(DATA, RO_ZK.get(PATH).get());<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    assertEquals(CHILDREN, RO_ZK.exists(PATH).get().getNumChildren());<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    assertNotNull(RO_ZK.zookeeper);<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    waitForIdleConnectionClosed();<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  }<a name="line.134"></a>
-<span class="sourceLineNo">135</span><a name="line.135"></a>
-<span class="sourceLineNo">136</span>  @Test<a name="line.136"></a>
-<span class="sourceLineNo">137</span>  public void testNoNode() throws InterruptedException, ExecutionException {<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    String pathNotExists = PATH + "_whatever";<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    try {<a name="line.139"></a>
-<span class="sourceLineNo">140</span>      RO_ZK.get(pathNotExists).get();<a name="line.140"></a>
-<span class="sourceLineNo">141</span>      fail("should fail because of " + pathNotExists + " does not exist");<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    } catch (ExecutionException e) {<a name="line.142"></a>
-<span class="sourceLineNo">143</span>      assertThat(e.getCause(), instanceOf(KeeperException.class));<a name="line.143"></a>
-<span class="sourceLineNo">144</span>      KeeperException ke = (KeeperException) e.getCause();<a name="line.144"></a>
-<span class="sourceLineNo">145</span>      assertEquals(Code.NONODE, ke.code());<a name="line.145"></a>
-<span class="sourceLineNo">146</span>      assertEquals(pathNotExists, ke.getPath());<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    }<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    // exists will not throw exception.<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    assertNull(RO_ZK.exists(pathNotExists).get());<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  }<a name="line.150"></a>
-<span class="sourceLineNo">151</span><a name="line.151"></a>
-<span class="sourceLineNo">152</span>  @Test<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  public void testSessionExpire() throws Exception {<a name="line.153"></a>
-<span class="sourceLineNo">154</span>    assertArrayEquals(DATA, RO_ZK.get(PATH).get());<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    ZooKeeper zk = RO_ZK.zookeeper;<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    long sessionId = zk.getSessionId();<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    UTIL.getZkCluster().getZooKeeperServers().get(0).closeSession(sessionId);<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    // should not reach keep alive so still the same instance<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    assertSame(zk, RO_ZK.zookeeper);<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    byte[] got = RO_ZK.get(PATH).get();<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    assertArrayEquals(DATA, got);<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    assertNotNull(RO_ZK.zookeeper);<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    assertNotSame(zk, RO_ZK.zookeeper);<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    assertNotEquals(sessionId, RO_ZK.zookeeper.getSessionId());<a name="line.164"></a>
-<span class="sourceLineNo">165</span>  }<a name="line.165"></a>
-<span class="sourceLineNo">166</span><a name="line.166"></a>
-<span class="sourceLineNo">167</span>  @Test<a name="line.167"></a>
-<span class="sourceLineNo">168</span>  public void testNotCloseZkWhenPending() throws Exception {<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    ZooKeeper mockedZK = mock(ZooKeeper.class);<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    Exchanger&lt;AsyncCallback.DataCallback&gt; exchanger = new Exchanger&lt;&gt;();<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    doAnswer(i -&gt; {<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      exchanger.exchange(i.getArgument(2));<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      return null;<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    }).when(mockedZK).getData(anyString(), anyBoolean(),<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      any(AsyncCallback.DataCallback.class), any());<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    doAnswer(i -&gt; null).when(mockedZK).close();<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    when(mockedZK.getState()).thenReturn(ZooKeeper.States.CONNECTED);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    RO_ZK.zookeeper = mockedZK;<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    CompletableFuture&lt;byte[]&gt; future = RO_ZK.get(PATH);<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    AsyncCallback.DataCallback callback = exchanger.exchange(null);<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    // 2 * keep alive time to ensure that we will not close the zk when there are pending requests<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    Thread.sleep(6000);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    assertNotNull(RO_ZK.zookeeper);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    verify(mockedZK, never()).close();<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    callback.processResult(Code.OK.intValue(), PATH, null, DATA, null);<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    assertArrayEquals(DATA, future.get());<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    // now we will close the idle connection.<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    waitForIdleConnectionClosed();<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    verify(mockedZK, times(1)).close();<a name="line.189"></a>
-<span class="sourceLineNo">190</span>  }<a name="line.190"></a>
-<span class="sourceLineNo">191</span>}<a name="line.191"></a>
+<span class="sourceLineNo">083</span>  private static ReadOnlyZKClient RO_ZK;<a name="line.83"></a>
+<span class="sourceLineNo">084</span><a name="line.84"></a>
+<span class="sourceLineNo">085</span>  @BeforeClass<a name="line.85"></a>
+<span class="sourceLineNo">086</span>  public static void setUp() throws Exception {<a name="line.86"></a>
+<span class="sourceLineNo">087</span>    PORT = UTIL.startMiniZKCluster().getClientPort();<a name="line.87"></a>
+<span class="sourceLineNo">088</span><a name="line.88"></a>
+<span class="sourceLineNo">089</span>    ZooKeeper zk = ZooKeeperHelper.getConnectedZooKeeper("localhost:" + PORT, 10000);<a name="line.89"></a>
+<span class="sourceLineNo">090</span>    DATA = new byte[10];<a name="line.90"></a>
+<span class="sourceLineNo">091</span>    ThreadLocalRandom.current().nextBytes(DATA);<a name="line.91"></a>
+<span class="sourceLineNo">092</span>    zk.create(PATH, DATA, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);<a name="line.92"></a>
+<span class="sourceLineNo">093</span>    for (int i = 0; i &lt; CHILDREN; i++) {<a name="line.93"></a>
+<span class="sourceLineNo">094</span>      zk.create(PATH + "/c" + i, new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    }<a name="line.95"></a>
+<span class="sourceLineNo">096</span>    zk.close();<a name="line.96"></a>
+<span class="sourceLineNo">097</span>    Configuration conf = UTIL.getConfiguration();<a name="line.97"></a>
+<span class="sourceLineNo">098</span>    conf.set(HConstants.ZOOKEEPER_QUORUM, "localhost:" + PORT);<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    conf.setInt(ReadOnlyZKClient.RECOVERY_RETRY, 3);<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    conf.setInt(ReadOnlyZKClient.RECOVERY_RETRY_INTERVAL_MILLIS, 100);<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    conf.setInt(ReadOnlyZKClient.KEEPALIVE_MILLIS, 3000);<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    RO_ZK = new ReadOnlyZKClient(conf);<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    // only connect when necessary<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    assertNull(RO_ZK.zookeeper);<a name="line.104"></a>
+<span class="sourceLineNo">105</span>  }<a name="line.105"></a>
+<span class="sourceLineNo">106</span><a name="line.106"></a>
+<span class="sourceLineNo">107</span>  @AfterClass<a name="line.107"></a>
+<span class="sourceLineNo">108</span>  public static void tearDown() throws IOException {<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    RO_ZK.close();<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    UTIL.shutdownMiniZKCluster();<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    UTIL.cleanupTestDir();<a name="line.111"></a>
+<span class="sourceLineNo">112</span>  }<a name="line.112"></a>
+<span class="sourceLineNo">113</span><a name="line.113"></a>
+<span class="sourceLineNo">114</span>  private void waitForIdleConnectionClosed() throws Exception {<a name="line.114"></a>
+<span class="sourceLineNo">115</span>    // The zookeeper client should be closed finally after the keep alive time elapsed<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    UTIL.waitFor(10000, new ExplainingPredicate&lt;Exception&gt;() {<a name="line.116"></a>
+<span class="sourceLineNo">117</span><a name="line.117"></a>
+<span class="sourceLineNo">118</span>      @Override<a name="line.118"></a>
+<span class="sourceLineNo">119</span>      public boolean evaluate() throws Exception {<a name="line.119"></a>
+<span class="sourceLineNo">120</span>        return RO_ZK.zookeeper == null;<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      }<a name="line.121"></a>
+<span class="sourceLineNo">122</span><a name="line.122"></a>
+<span class="sourceLineNo">123</span>      @Override<a name="line.123"></a>
+<span class="sourceLineNo">124</span>      public String explainFailure() throws Exception {<a name="line.124"></a>
+<span class="sourceLineNo">125</span>        return "Connection to zookeeper is still alive";<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      }<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    });<a name="line.127"></a>
+<span class="sourceLineNo">128</span>  }<a name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span>  @Test<a name="line.130"></a>
+<span class="sourceLineNo">131</span>  public void testRead() throws Exception {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    assertArrayEquals(DATA, RO_ZK.get(PATH).get());<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    assertEquals(CHILDREN, RO_ZK.exists(PATH).get().getNumChildren());<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    List&lt;String&gt; children = RO_ZK.list(PATH).get();<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    assertEquals(CHILDREN, children.size());<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    Collections.sort(children);<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    for (int i = 0; i &lt; CHILDREN; i++) {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>      assertEquals("c" + i, children.get(i));<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    }<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    assertNotNull(RO_ZK.zookeeper);<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    waitForIdleConnectionClosed();<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  }<a name="line.142"></a>
+<span class="sourceLineNo">143</span><a name="line.143"></a>
+<span class="sourceLineNo">144</span>  @Test<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public void testNoNode() throws InterruptedException, ExecutionException {<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    String pathNotExists = PATH + "_whatever";<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    try {<a name="line.147"></a>
+<span class="sourceLineNo">148</span>      RO_ZK.get(pathNotExists).get();<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      fail("should fail because of " + pathNotExists + " does not exist");<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    } catch (ExecutionException e) {<a name="line.150"></a>
+<span class="sourceLineNo">151</span>      assertThat(e.getCause(), instanceOf(KeeperException.class));<a name="line.151"></a>
+<span class="sourceLineNo">152</span>      KeeperException ke = (KeeperException) e.getCause();<a name="line.152"></a>
+<span class="sourceLineNo">153</span>      assertEquals(Code.NONODE, ke.code());<a name="line.153"></a>
+<span class="sourceLineNo">154</span>      assertEquals(pathNotExists, ke.getPath());<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    }<a name="line.155"></a>
+<span class="sourceLineNo">156</span>    try {<a name="line.156"></a>
+<span class="sourceLineNo">157</span>      RO_ZK.list(pathNotExists).get();<a name="line.157"></a>
+<span class="sourceLineNo">158</span>      fail("should fail because of " + pathNotExists + " does not exist");<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    } catch (ExecutionException e) {<a name="line.159"></a>
+<span class="sourceLineNo">160</span>      assertThat(e.getCause(), instanceOf(KeeperException.class));<a name="line.160"></a>
+<span class="sourceLineNo">161</span>      KeeperException ke = (KeeperException) e.getCause();<a name="line.161"></a>
+<span class="sourceLineNo">162</span>      assertEquals(Code.NONODE, ke.code());<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      assertEquals(pathNotExists, ke.getPath());<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    }<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    // exists will not throw exception.<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    assertNull(RO_ZK.exists(pathNotExists).get());<a name="line.166"></a>
+<span class="sourceLineNo">167</span>  }<a name="line.167"></a>
+<span class="sourceLineNo">168</span><a name="line.168"></a>
+<span class="sourceLineNo">169</span>  @Test<a name="line.169"></a>
+<span class="sourceLineNo">170</span>  public void testSessionExpire() throws Exception {<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    assertArrayEquals(DATA, RO_ZK.get(PATH).get());<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    ZooKeeper zk = RO_ZK.zookeeper;<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    long sessionId = zk.getSessionId();<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    UTIL.getZkCluster().getZooKeeperServers().get(0).closeSession(sessionId);<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    // should not reach keep alive so still the same instance<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    assertSame(zk, RO_ZK.zookeeper);<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    byte[] got = RO_ZK.get(PATH).get();<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    assertArrayEquals(DATA, got);<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    assertNotNull(RO_ZK.zookeeper);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    assertNotSame(zk, RO_ZK.zookeeper);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    assertNotEquals(sessionId, RO_ZK.zookeeper.getSessionId());<a name="line.181"></a>
+<span class="sourceLineNo">182</span>  }<a name="line.182"></a>
+<span class="sourceLineNo">183</span><a name="line.183"></a>
+<span class="sourceLineNo">184</span>  @Test<a name="line.184"></a>
+<span class="sourceLineNo">185</span>  public void testNotCloseZkWhenPending() throws Exception {<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    ZooKeeper mockedZK = mock(ZooKeeper.class);<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    Exchanger&lt;AsyncCallback.DataCallback&gt; exchanger = new Exchanger&lt;&gt;();<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    doAnswer(i -&gt; {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      exchanger.exchange(i.getArgument(2));<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      return null;<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    }).when(mockedZK).getData(anyString(), anyBoolean(),<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      any(AsyncCallback.DataCallback.class), any());<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    doAnswer(i -&gt; null).when(mockedZK).close();<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    when(mockedZK.getState()).thenReturn(ZooKeeper.States.CONNECTED);<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    RO_ZK.zookeeper = mockedZK;<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    CompletableFuture&lt;byte[]&gt; future = RO_ZK.get(PATH);<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    AsyncCallback.DataCallback callback = exchanger.exchange(null);<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    // 2 * keep alive time to ensure that we will not close the zk when there are pending requests<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    Thread.sleep(6000);<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    assertNotNull(RO_ZK.zookeeper);<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    verify(mockedZK, never()).close();<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    callback.processResult(Code.OK.intValue(), PATH, null, DATA, null);<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    assertArrayEquals(DATA, future.get());<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    // now we will close the idle connection.<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    waitForIdleConnectionClosed();<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    verify(mockedZK, times(1)).close();<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>