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/02/13 14:47:00 UTC

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

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 57ad347  Published site at ed849d2d195698795c9c3ad8bf3054dd883ccf38.
57ad347 is described below

commit 57ad347faa55bb45f7c12a5b91928b72fcc3f472
Author: jenkins <bu...@apache.org>
AuthorDate: Wed Feb 13 14:46:48 2019 +0000

    Published site at ed849d2d195698795c9c3ad8bf3054dd883ccf38.
---
 acid-semantics.html                                |    4 +-
 apache_hbase_reference_guide.pdf                   |    4 +-
 apidocs/index-all.html                             |    4 +
 .../hadoop/hbase/client/AsyncConnection.html       |   73 +-
 .../hadoop/hbase/client/AsyncConnection.html       |  318 ++---
 book.html                                          |    2 +-
 bulk-loads.html                                    |    4 +-
 checkstyle-aggregate.html                          |   22 +-
 coc.html                                           |    4 +-
 dependencies.html                                  |    4 +-
 dependency-convergence.html                        |    4 +-
 dependency-info.html                               |    4 +-
 dependency-management.html                         |    4 +-
 devapidocs/constant-values.html                    |    4 +-
 devapidocs/index-all.html                          |   10 +
 .../apache/hadoop/hbase/backup/package-tree.html   |    4 +-
 .../hadoop/hbase/client/AsyncConnection.html       |   81 +-
 .../hadoop/hbase/client/AsyncConnectionImpl.html   |   72 +-
 .../hbase/client/AsyncNonMetaRegionLocator.html    |   45 +-
 .../hadoop/hbase/client/AsyncRegionLocator.html    |   33 +-
 .../apache/hadoop/hbase/client/package-tree.html   |   24 +-
 .../apache/hadoop/hbase/filter/package-tree.html   |    8 +-
 .../apache/hadoop/hbase/io/hfile/package-tree.html |    4 +-
 .../org/apache/hadoop/hbase/ipc/package-tree.html  |    2 +-
 .../hadoop/hbase/mapreduce/package-tree.html       |    2 +-
 .../master/MetricsAssignmentManagerSourceImpl.html |    6 +-
 .../hbase/master/assignment/AssignmentManager.html |   88 +-
 .../hbase/master/assignment/RegionStateNode.html   |   50 +-
 .../apache/hadoop/hbase/master/package-tree.html   |    4 +-
 .../hadoop/hbase/monitoring/package-tree.html      |    2 +-
 .../org/apache/hadoop/hbase/package-tree.html      |   14 +-
 .../hadoop/hbase/procedure2/package-tree.html      |    4 +-
 .../apache/hadoop/hbase/quotas/package-tree.html   |    8 +-
 .../hadoop/hbase/regionserver/package-tree.html    |   12 +-
 .../hbase/regionserver/wal/package-tree.html       |    4 +-
 .../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 |   10 +-
 .../org/apache/hadoop/hbase/wal/package-tree.html  |    2 +-
 .../src-html/org/apache/hadoop/hbase/Version.html  |    4 +-
 .../hadoop/hbase/client/AsyncConnection.html       |  318 ++---
 .../hadoop/hbase/client/AsyncConnectionImpl.html   |    7 +-
 .../AsyncNonMetaRegionLocator.LocateRequest.html   |   24 +-
 .../AsyncNonMetaRegionLocator.TableCache.html      |   24 +-
 .../hbase/client/AsyncNonMetaRegionLocator.html    |   24 +-
 .../hadoop/hbase/client/AsyncRegionLocator.html    |    7 +-
 .../master/MetricsAssignmentManagerSourceImpl.html |    4 +-
 .../AssignmentManager.RegionInTransitionChore.html | 1400 ++++++++++----------
 .../AssignmentManager.RegionInTransitionStat.html  | 1400 ++++++++++----------
 .../hbase/master/assignment/AssignmentManager.html | 1400 ++++++++++----------
 .../RegionStateNode.AssignmentProcedureEvent.html  |  234 ++--
 .../hbase/master/assignment/RegionStateNode.html   |  234 ++--
 downloads.html                                     |    4 +-
 export_control.html                                |    4 +-
 index.html                                         |    4 +-
 integration.html                                   |    4 +-
 issue-tracking.html                                |    4 +-
 license.html                                       |    4 +-
 mail-lists.html                                    |    4 +-
 metrics.html                                       |    4 +-
 old_news.html                                      |    4 +-
 plugin-management.html                             |    4 +-
 plugins.html                                       |    4 +-
 poweredbyhbase.html                                |    4 +-
 project-info.html                                  |    4 +-
 project-reports.html                               |    4 +-
 project-summary.html                               |    4 +-
 pseudo-distributed.html                            |    4 +-
 replication.html                                   |    4 +-
 resources.html                                     |    4 +-
 source-repository.html                             |    4 +-
 sponsors.html                                      |    4 +-
 supportingprojects.html                            |    4 +-
 team-list.html                                     |    4 +-
 testdevapidocs/index-all.html                      |    2 +
 ...TestAsyncRegionLocator.SleepRegionObserver.html |    8 +-
 .../hbase/client/TestAsyncRegionLocator.html       |   43 +-
 .../apache/hadoop/hbase/io/hfile/package-tree.html |    2 +-
 .../org/apache/hadoop/hbase/package-tree.html      |   10 +-
 .../hadoop/hbase/procedure2/package-tree.html      |    4 +-
 .../hadoop/hbase/regionserver/package-tree.html    |    4 +-
 .../org/apache/hadoop/hbase/test/package-tree.html |    4 +-
 .../org/apache/hadoop/hbase/wal/package-tree.html  |    2 +-
 ...TestAsyncRegionLocator.SleepRegionObserver.html |  208 +--
 .../hbase/client/TestAsyncRegionLocator.html       |  208 +--
 87 files changed, 3410 insertions(+), 3207 deletions(-)

diff --git a/acid-semantics.html b/acid-semantics.html
index 311410e..b159f24 100644
--- a/acid-semantics.html
+++ b/acid-semantics.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20190212" />
+    <meta name="Date-Revision-yyyymmdd" content="20190213" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Apache HBase (TM) ACID Properties
@@ -611,7 +611,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2019-02-12</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2019-02-13</li>
             </p>
                 </div>
 
diff --git a/apache_hbase_reference_guide.pdf b/apache_hbase_reference_guide.pdf
index e061c35..7fb4f7e 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:20190212145009+00'00')
-/CreationDate (D:20190212150323+00'00')
+/ModDate (D:20190213142939+00'00')
+/CreationDate (D:20190213144312+00'00')
 >>
 endobj
 2 0 obj
diff --git a/apidocs/index-all.html b/apidocs/index-all.html
index 668e881..42cbee2 100644
--- a/apidocs/index-all.html
+++ b/apidocs/index-all.html
@@ -1436,6 +1436,10 @@
 <dd>
 <div class="block">Clear dead region servers from master.</div>
 </dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/AsyncConnection.html#clearRegionLocationCache--">clearRegionLocationCache()</a></span> - Method in interface org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/AsyncConnection.html" title="interface in org.apache.hadoop.hbase.client">AsyncConnection</a></dt>
+<dd>
+<div class="block">Clear all the entries in the region location cache, for all the tables.</div>
+</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/AsyncTableRegionLocator.html#clearRegionLocationCache--">clearRegionLocationCache()</a></span> - Method in interface org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/AsyncTableRegionLocator.html" title="interface in org.apache.hadoop.hbase.client">AsyncTableRegionLocator</a></dt>
 <dd>
 <div class="block">Clear all the entries in the region location cache.</div>
diff --git a/apidocs/org/apache/hadoop/hbase/client/AsyncConnection.html b/apidocs/org/apache/hadoop/hbase/client/AsyncConnection.html
index 90eb381..ebd4c94 100644
--- a/apidocs/org/apache/hadoop/hbase/client/AsyncConnection.html
+++ b/apidocs/org/apache/hadoop/hbase/client/AsyncConnection.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":18,"i1":18,"i2":6,"i3":6,"i4":18,"i5":18,"i6":6,"i7":6,"i8":6,"i9":6,"i10":18,"i11":18,"i12":6,"i13":6};
+var methods = {"i0":6,"i1":18,"i2":18,"i3":6,"i4":6,"i5":18,"i6":18,"i7":6,"i8":6,"i9":6,"i10":6,"i11":18,"i12":18,"i13":6,"i14":6};
 var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],4:["t3","Abstract Methods"],16:["t5","Default Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -132,87 +132,93 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.htm
 <th class="colLast" scope="col">Method and Description</th>
 </tr>
 <tr id="i0" class="altColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnection.html#clearRegionLocationCache--">clearRegionLocationCache</a></span>()</code>
+<div class="block">Clear all the entries in the region location cache, for all the tables.</div>
+</td>
+</tr>
+<tr id="i1" class="rowColor">
 <td class="colFirst"><code>default <a href="../../../../../org/apache/hadoop/hbase/client/AsyncAdmin.html" title="interface in org.apache.hadoop.hbase.client">AsyncAdmin</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnection.html#getAdmin--">getAdmin</a></span>()</code>
 <div class="block">Retrieve an <a href="../../../../../org/apache/hadoop/hbase/client/AsyncAdmin.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncAdmin</code></a> implementation to administer an HBase cluster.</div>
 </td>
 </tr>
-<tr id="i1" class="rowColor">
+<tr id="i2" class="altColor">
 <td class="colFirst"><code>default <a href="../../../../../org/apache/hadoop/hbase/client/AsyncAdmin.html" title="interface in org.apache.hadoop.hbase.client">AsyncAdmin</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnection.html#getAdmin-java.util.concurrent.ExecutorService-">getAdmin</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;pool)</code>
 <div class="block">Retrieve an <a href="../../../../../org/apache/hadoop/hbase/client/AsyncAdmin.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncAdmin</code></a> implementation to administer an HBase cluster.</div>
 </td>
 </tr>
-<tr id="i2" class="altColor">
+<tr id="i3" class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/client/AsyncAdminBuilder.html" title="interface in org.apache.hadoop.hbase.client">AsyncAdminBuilder</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnection.html#getAdminBuilder--">getAdminBuilder</a></span>()</code>
 <div class="block">Returns an <a href="../../../../../org/apache/hadoop/hbase/client/AsyncAdminBuilder.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncAdminBuilder</code></a> for creating <a href="../../../../../org/apache/hadoop/hbase/client/AsyncAdmin.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncAdmin</code></a>.</div>
 </td>
 </tr>
-<tr id="i3" class="rowColor">
+<tr id="i4" class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/client/AsyncAdminBuilder.html" title="interface in org.apache.hadoop.hbase.client">AsyncAdminBuilder</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnection.html#getAdminBuilder-java.util.concurrent.ExecutorService-">getAdminBuilder</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;pool)</code>
 <div class="block">Returns an <a href="../../../../../org/apache/hadoop/hbase/client/AsyncAdminBuilder.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncAdminBuilder</code></a> for creating <a href="../../../../../org/apache/hadoop/hbase/client/AsyncAdmin.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncAdmin</code></a>.</div>
 </td>
 </tr>
-<tr id="i4" class="altColor">
+<tr id="i5" class="rowColor">
 <td class="colFirst"><code>default <a href="../../../../../org/apache/hadoop/hbase/client/AsyncBufferedMutator.html" title="interface in org.apache.hadoop.hbase.client">AsyncBufferedMutator</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnection.html#getBufferedMutator-org.apache.hadoop.hbase.TableName-">getBufferedMutator</a></span>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</code>
 <div class="block">Retrieve an <a href="../../../../../org/apache/hadoop/hbase/client/AsyncBufferedMutator.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncBufferedMutator</code></a> for performing client-side buffering of writes.</div>
 </td>
 </tr>
-<tr id="i5" class="rowColor">
+<tr id="i6" class="altColor">
 <td class="colFirst"><code>default <a href="../../../../../org/apache/hadoop/hbase/client/AsyncBufferedMutator.html" title="interface in org.apache.hadoop.hbase.client">AsyncBufferedMutator</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnection.html#getBufferedMutator-org.apache.hadoop.hbase.TableName-java.util.concurrent.ExecutorService-">getBufferedMutator</a></span>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                   <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;pool)</code>
 <div class="block">Retrieve an <a href="../../../../../org/apache/hadoop/hbase/client/AsyncBufferedMutator.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncBufferedMutator</code></a> for performing client-side buffering of writes.</div>
 </td>
 </tr>
-<tr id="i6" class="altColor">
+<tr id="i7" class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/client/AsyncBufferedMutatorBuilder.html" title="interface in org.apache.hadoop.hbase.client">AsyncBufferedMutatorBuilder</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnection.html#getBufferedMutatorBuilder-org.apache.hadoop.hbase.TableName-">getBufferedMutatorBuilder</a></span>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</code>
 <div class="block">Returns an <a href="../../../../../org/apache/hadoop/hbase/client/AsyncBufferedMutatorBuilder.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncBufferedMutatorBuilder</code></a> for creating <a href="../../../../../org/apache/hadoop/hbase/client/AsyncBufferedMutator.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncBufferedMutator</code></a>.</div>
 </td>
 </tr>
-<tr id="i7" class="rowColor">
+<tr id="i8" class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/client/AsyncBufferedMutatorBuilder.html" title="interface in org.apache.hadoop.hbase.client">AsyncBufferedMutatorBuilder</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnection.html#getBufferedMutatorBuilder-org.apache.hadoop.hbase.TableName-java.util.concurrent.ExecutorService-">getBufferedMutatorBuilder</a></span>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                          <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;pool)</code>
 <div class="block">Returns an <a href="../../../../../org/apache/hadoop/hbase/client/AsyncBufferedMutatorBuilder.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncBufferedMutatorBuilder</code></a> for creating <a href="../../../../../org/apache/hadoop/hbase/client/AsyncBufferedMutator.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncBufferedMutator</code></a>.</div>
 </td>
 </tr>
-<tr id="i8" class="altColor">
+<tr id="i9" class="rowColor">
 <td class="colFirst"><code>org.apache.hadoop.conf.Configuration</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnection.html#getConfiguration--">getConfiguration</a></span>()</code>
 <div class="block">Returns the <code>Configuration</code> object used by this instance.</div>
 </td>
 </tr>
-<tr id="i9" class="rowColor">
+<tr id="i10" class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/client/AsyncTableRegionLocator.html" title="interface in org.apache.hadoop.hbase.client">AsyncTableRegionLocator</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnection.html#getRegionLocator-org.apache.hadoop.hbase.TableName-">getRegionLocator</a></span>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</code>
 <div class="block">Retrieve a AsyncRegionLocator implementation to inspect region information on a table.</div>
 </td>
 </tr>
-<tr id="i10" class="altColor">
+<tr id="i11" class="rowColor">
 <td class="colFirst"><code>default <a href="../../../../../org/apache/hadoop/hbase/client/AsyncTable.html" title="interface in org.apache.hadoop.hbase.client">AsyncTable</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/AdvancedScanResultConsumer.html" title="interface in org.apache.hadoop.hbase.client">AdvancedScanResultConsumer</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnection.html#getTable-org.apache.hadoop.hbase.TableName-">getTable</a></span>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</code>
 <div class="block">Retrieve an <a href="../../../../../org/apache/hadoop/hbase/client/AsyncTable.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncTable</code></a> implementation for accessing a table.</div>
 </td>
 </tr>
-<tr id="i11" class="rowColor">
+<tr id="i12" class="altColor">
 <td class="colFirst"><code>default <a href="../../../../../org/apache/hadoop/hbase/client/AsyncTable.html" title="interface in org.apache.hadoop.hbase.client">AsyncTable</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/ScanResultConsumer.html" title="interface in org.apache.hadoop.hbase.client">ScanResultConsumer</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnection.html#getTable-org.apache.hadoop.hbase.TableName-java.util.concurrent.ExecutorService-">getTable</a></span>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
         <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;pool)</code>
 <div class="block">Retrieve an <a href="../../../../../org/apache/hadoop/hbase/client/AsyncTable.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncTable</code></a> implementation for accessing a table.</div>
 </td>
 </tr>
-<tr id="i12" class="altColor">
+<tr id="i13" class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/client/AsyncTableBuilder.html" title="interface in org.apache.hadoop.hbase.client">AsyncTableBuilder</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/AdvancedScanResultConsumer.html" title="interface in org.apache.hadoop.hbase.client">AdvancedScanResultConsumer</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnection.html#getTableBuilder-org.apache.hadoop.hbase.TableName-">getTableBuilder</a></span>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</code>
 <div class="block">Returns an <a href="../../../../../org/apache/hadoop/hbase/client/AsyncTableBuilder.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncTableBuilder</code></a> for creating <a href="../../../../../org/apache/hadoop/hbase/client/AsyncTable.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncTable</code></a>.</div>
 </td>
 </tr>
-<tr id="i13" class="rowColor">
+<tr id="i14" class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/client/AsyncTableBuilder.html" title="interface in org.apache.hadoop.hbase.client">AsyncTableBuilder</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/ScanResultConsumer.html" title="interface in org.apache.hadoop.hbase.client">ScanResultConsumer</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnection.html#getTableBuilder-org.apache.hadoop.hbase.TableName-java.util.concurrent.ExecutorService-">getTableBuilder</a></span>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;pool)</code>
@@ -272,13 +278,28 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.htm
 </dl>
 </li>
 </ul>
+<a name="clearRegionLocationCache--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>clearRegionLocationCache</h4>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnection.html#line.63">clearRegionLocationCache</a>()</pre>
+<div class="block">Clear all the entries in the region location cache, for all the tables.
+ <p/>
+ If you only want to clear the cache for a specific table, use
+ <a href="../../../../../org/apache/hadoop/hbase/client/AsyncTableRegionLocator.html#clearRegionLocationCache--"><code>AsyncTableRegionLocator.clearRegionLocationCache()</code></a>.
+ <p/>
+ This may cause performance issue so use it with caution.</div>
+</li>
+</ul>
 <a name="getTable-org.apache.hadoop.hbase.TableName-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>getTable</h4>
-<pre>default&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/AsyncTable.html" title="interface in org.apache.hadoop.hbase.client">AsyncTable</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/AdvancedScanResultConsumer.html" title="interface in org.apache.hadoop.hbase.client">AdvancedScanResultConsumer</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnection.html#line.72">getTable</a>(<a href="../../../../../org/apache/hadoop/hba [...]
+<pre>default&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/AsyncTable.html" title="interface in org.apache.hadoop.hbase.client">AsyncTable</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/AdvancedScanResultConsumer.html" title="interface in org.apache.hadoop.hbase.client">AdvancedScanResultConsumer</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnection.html#line.82">getTable</a>(<a href="../../../../../org/apache/hadoop/hba [...]
 <div class="block">Retrieve an <a href="../../../../../org/apache/hadoop/hbase/client/AsyncTable.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncTable</code></a> implementation for accessing a table.
  <p>
  The returned instance will use default configs. Use <a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnection.html#getTableBuilder-org.apache.hadoop.hbase.TableName-"><code>getTableBuilder(TableName)</code></a> if
@@ -307,7 +328,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableBuilder</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/client/AsyncTableBuilder.html" title="interface in org.apache.hadoop.hbase.client">AsyncTableBuilder</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/AdvancedScanResultConsumer.html" title="interface in org.apache.hadoop.hbase.client">AdvancedScanResultConsumer</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnection.html#line.83">getTableBuilder</a>(<a href="../../../../../org/apache/ha [...]
+<pre><a href="../../../../../org/apache/hadoop/hbase/client/AsyncTableBuilder.html" title="interface in org.apache.hadoop.hbase.client">AsyncTableBuilder</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/AdvancedScanResultConsumer.html" title="interface in org.apache.hadoop.hbase.client">AdvancedScanResultConsumer</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnection.html#line.93">getTableBuilder</a>(<a href="../../../../../org/apache/ha [...]
 <div class="block">Returns an <a href="../../../../../org/apache/hadoop/hbase/client/AsyncTableBuilder.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncTableBuilder</code></a> for creating <a href="../../../../../org/apache/hadoop/hbase/client/AsyncTable.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncTable</code></a>.
  <p>
  This method no longer checks table existence. An exception will be thrown if the table does not
@@ -324,7 +345,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>getTable</h4>
-<pre>default&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/AsyncTable.html" title="interface in org.apache.hadoop.hbase.client">AsyncTable</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/ScanResultConsumer.html" title="interface in org.apache.hadoop.hbase.client">ScanResultConsumer</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnection.html#line.94">getTable</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.htm [...]
+<pre>default&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/AsyncTable.html" title="interface in org.apache.hadoop.hbase.client">AsyncTable</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/ScanResultConsumer.html" title="interface in org.apache.hadoop.hbase.client">ScanResultConsumer</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnection.html#line.104">getTable</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.ht [...]
                                                 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;pool)</pre>
 <div class="block">Retrieve an <a href="../../../../../org/apache/hadoop/hbase/client/AsyncTable.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncTable</code></a> implementation for accessing a table.
  <p>
@@ -345,7 +366,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableBuilder</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/client/AsyncTableBuilder.html" title="interface in org.apache.hadoop.hbase.client">AsyncTableBuilder</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/ScanResultConsumer.html" title="interface in org.apache.hadoop.hbase.client">ScanResultConsumer</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnection.html#line.106">getTableBuilder</a>(<a href="../../../../../org/apache/hadoop/hbase/Tabl [...]
+<pre><a href="../../../../../org/apache/hadoop/hbase/client/AsyncTableBuilder.html" title="interface in org.apache.hadoop.hbase.client">AsyncTableBuilder</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/ScanResultConsumer.html" title="interface in org.apache.hadoop.hbase.client">ScanResultConsumer</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnection.html#line.116">getTableBuilder</a>(<a href="../../../../../org/apache/hadoop/hbase/Tabl [...]
                                                       <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;pool)</pre>
 <div class="block">Returns an <a href="../../../../../org/apache/hadoop/hbase/client/AsyncTableBuilder.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncTableBuilder</code></a> for creating <a href="../../../../../org/apache/hadoop/hbase/client/AsyncTable.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncTable</code></a>.
  <p>
@@ -364,7 +385,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>getAdmin</h4>
-<pre>default&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/AsyncAdmin.html" title="interface in org.apache.hadoop.hbase.client">AsyncAdmin</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnection.html#line.119">getAdmin</a>()</pre>
+<pre>default&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/AsyncAdmin.html" title="interface in org.apache.hadoop.hbase.client">AsyncAdmin</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnection.html#line.129">getAdmin</a>()</pre>
 <div class="block">Retrieve an <a href="../../../../../org/apache/hadoop/hbase/client/AsyncAdmin.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncAdmin</code></a> implementation to administer an HBase cluster.
  <p>
  The returned instance will use default configs. Use <a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnection.html#getAdminBuilder--"><code>getAdminBuilder()</code></a> if you want to
@@ -385,7 +406,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>getAdminBuilder</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/client/AsyncAdminBuilder.html" title="interface in org.apache.hadoop.hbase.client">AsyncAdminBuilder</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnection.html#line.130">getAdminBuilder</a>()</pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/client/AsyncAdminBuilder.html" title="interface in org.apache.hadoop.hbase.client">AsyncAdminBuilder</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnection.html#line.140">getAdminBuilder</a>()</pre>
 <div class="block">Returns an <a href="../../../../../org/apache/hadoop/hbase/client/AsyncAdminBuilder.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncAdminBuilder</code></a> for creating <a href="../../../../../org/apache/hadoop/hbase/client/AsyncAdmin.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncAdmin</code></a>.
  <p>
  The admin operation's returned <code>CompletableFuture</code> will be finished directly in the rpc
@@ -399,7 +420,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>getAdmin</h4>
-<pre>default&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/AsyncAdmin.html" title="interface in org.apache.hadoop.hbase.client">AsyncAdmin</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnection.html#line.140">getAdmin</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;pool)</pre>
+<pre>default&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/AsyncAdmin.html" title="interface in org.apache.hadoop.hbase.client">AsyncAdmin</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnection.html#line.150">getAdmin</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;pool)</pre>
 <div class="block">Retrieve an <a href="../../../../../org/apache/hadoop/hbase/client/AsyncAdmin.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncAdmin</code></a> implementation to administer an HBase cluster.
  <p>
  The returned instance will use default configs. Use <a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnection.html#getAdminBuilder-java.util.concurrent.ExecutorService-"><code>getAdminBuilder(ExecutorService)</code></a>
@@ -418,7 +439,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>getAdminBuilder</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/client/AsyncAdminBuilder.html" title="interface in org.apache.hadoop.hbase.client">AsyncAdminBuilder</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnection.html#line.148">getAdminBuilder</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;pool)</pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/client/AsyncAdminBuilder.html" title="interface in org.apache.hadoop.hbase.client">AsyncAdminBuilder</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnection.html#line.158">getAdminBuilder</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;pool)</pre>
 <div class="block">Returns an <a href="../../../../../org/apache/hadoop/hbase/client/AsyncAdminBuilder.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncAdminBuilder</code></a> for creating <a href="../../../../../org/apache/hadoop/hbase/client/AsyncAdmin.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncAdmin</code></a>.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -432,7 +453,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>getBufferedMutator</h4>
-<pre>default&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/AsyncBufferedMutator.html" title="interface in org.apache.hadoop.hbase.client">AsyncBufferedMutator</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnection.html#line.158">getBufferedMutator</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
+<pre>default&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/AsyncBufferedMutator.html" title="interface in org.apache.hadoop.hbase.client">AsyncBufferedMutator</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnection.html#line.168">getBufferedMutator</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
 <div class="block">Retrieve an <a href="../../../../../org/apache/hadoop/hbase/client/AsyncBufferedMutator.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncBufferedMutator</code></a> for performing client-side buffering of writes.
  <p>
  The returned instance will use default configs. Use
@@ -451,7 +472,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>getBufferedMutatorBuilder</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/client/AsyncBufferedMutatorBuilder.html" title="interface in org.apache.hadoop.hbase.client">AsyncBufferedMutatorBuilder</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnection.html#line.166">getBufferedMutatorBuilder</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/client/AsyncBufferedMutatorBuilder.html" title="interface in org.apache.hadoop.hbase.client">AsyncBufferedMutatorBuilder</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnection.html#line.176">getBufferedMutatorBuilder</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
 <div class="block">Returns an <a href="../../../../../org/apache/hadoop/hbase/client/AsyncBufferedMutatorBuilder.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncBufferedMutatorBuilder</code></a> for creating <a href="../../../../../org/apache/hadoop/hbase/client/AsyncBufferedMutator.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncBufferedMutator</code></a>.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -465,7 +486,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>getBufferedMutator</h4>
-<pre>default&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/AsyncBufferedMutator.html" title="interface in org.apache.hadoop.hbase.client">AsyncBufferedMutator</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnection.html#line.178">getBufferedMutator</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
+<pre>default&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/AsyncBufferedMutator.html" title="interface in org.apache.hadoop.hbase.client">AsyncBufferedMutator</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnection.html#line.188">getBufferedMutator</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                                                 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;pool)</pre>
 <div class="block">Retrieve an <a href="../../../../../org/apache/hadoop/hbase/client/AsyncBufferedMutator.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncBufferedMutator</code></a> for performing client-side buffering of writes.
  <p>
@@ -487,7 +508,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.htm
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getBufferedMutatorBuilder</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/client/AsyncBufferedMutatorBuilder.html" title="interface in org.apache.hadoop.hbase.client">AsyncBufferedMutatorBuilder</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnection.html#line.187">getBufferedMutatorBuilder</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
+<pre><a href="../../../../../org/apache/hadoop/hbase/client/AsyncBufferedMutatorBuilder.html" title="interface in org.apache.hadoop.hbase.client">AsyncBufferedMutatorBuilder</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnection.html#line.197">getBufferedMutatorBuilder</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                                                       <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;pool)</pre>
 <div class="block">Returns an <a href="../../../../../org/apache/hadoop/hbase/client/AsyncBufferedMutatorBuilder.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncBufferedMutatorBuilder</code></a> for creating <a href="../../../../../org/apache/hadoop/hbase/client/AsyncBufferedMutator.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncBufferedMutator</code></a>.</div>
 <dl>
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/client/AsyncConnection.html b/apidocs/src-html/org/apache/hadoop/hbase/client/AsyncConnection.html
index 3804f4d..4d02aa0 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/client/AsyncConnection.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/client/AsyncConnection.html
@@ -61,168 +61,178 @@
 <span class="sourceLineNo">053</span>  AsyncTableRegionLocator getRegionLocator(TableName tableName);<a name="line.53"></a>
 <span class="sourceLineNo">054</span><a name="line.54"></a>
 <span class="sourceLineNo">055</span>  /**<a name="line.55"></a>
-<span class="sourceLineNo">056</span>   * Retrieve an {@link AsyncTable} implementation for accessing a table.<a name="line.56"></a>
-<span class="sourceLineNo">057</span>   * &lt;p&gt;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>   * The returned instance will use default configs. Use {@link #getTableBuilder(TableName)} if<a name="line.58"></a>
-<span class="sourceLineNo">059</span>   * you want to customize some configs.<a name="line.59"></a>
-<span class="sourceLineNo">060</span>   * &lt;p&gt;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>   * This method no longer checks table existence. An exception will be thrown if the table does not<a name="line.61"></a>
-<span class="sourceLineNo">062</span>   * exist only when the first operation is attempted.<a name="line.62"></a>
-<span class="sourceLineNo">063</span>   * &lt;p&gt;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>   * The returned {@code CompletableFuture} will be finished directly in the rpc framework's<a name="line.64"></a>
-<span class="sourceLineNo">065</span>   * callback thread, so typically you should not do any time consuming work inside these methods.<a name="line.65"></a>
-<span class="sourceLineNo">066</span>   * And also the observer style scan API will use {@link AdvancedScanResultConsumer} which is<a name="line.66"></a>
-<span class="sourceLineNo">067</span>   * designed for experts only. Only use it when you know what you are doing.<a name="line.67"></a>
-<span class="sourceLineNo">068</span>   * @param tableName the name of the table<a name="line.68"></a>
-<span class="sourceLineNo">069</span>   * @return an AsyncTable to use for interactions with this table<a name="line.69"></a>
-<span class="sourceLineNo">070</span>   * @see #getTableBuilder(TableName)<a name="line.70"></a>
-<span class="sourceLineNo">071</span>   */<a name="line.71"></a>
-<span class="sourceLineNo">072</span>  default AsyncTable&lt;AdvancedScanResultConsumer&gt; getTable(TableName tableName) {<a name="line.72"></a>
-<span class="sourceLineNo">073</span>    return getTableBuilder(tableName).build();<a name="line.73"></a>
-<span class="sourceLineNo">074</span>  }<a name="line.74"></a>
-<span class="sourceLineNo">075</span><a name="line.75"></a>
-<span class="sourceLineNo">076</span>  /**<a name="line.76"></a>
-<span class="sourceLineNo">077</span>   * Returns an {@link AsyncTableBuilder} for creating {@link AsyncTable}.<a name="line.77"></a>
-<span class="sourceLineNo">078</span>   * &lt;p&gt;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>   * This method no longer checks table existence. An exception will be thrown if the table does not<a name="line.79"></a>
-<span class="sourceLineNo">080</span>   * exist only when the first operation is attempted.<a name="line.80"></a>
-<span class="sourceLineNo">081</span>   * @param tableName the name of the table<a name="line.81"></a>
-<span class="sourceLineNo">082</span>   */<a name="line.82"></a>
-<span class="sourceLineNo">083</span>  AsyncTableBuilder&lt;AdvancedScanResultConsumer&gt; getTableBuilder(TableName tableName);<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>   * Retrieve an {@link AsyncTable} implementation for accessing a table.<a name="line.86"></a>
-<span class="sourceLineNo">087</span>   * &lt;p&gt;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>   * This method no longer checks table existence. An exception will be thrown if the table does not<a name="line.88"></a>
-<span class="sourceLineNo">089</span>   * exist only when the first operation is attempted.<a name="line.89"></a>
-<span class="sourceLineNo">090</span>   * @param tableName the name of the table<a name="line.90"></a>
-<span class="sourceLineNo">091</span>   * @param pool the thread pool to use for executing callback<a name="line.91"></a>
-<span class="sourceLineNo">092</span>   * @return an AsyncTable to use for interactions with this table<a name="line.92"></a>
-<span class="sourceLineNo">093</span>   */<a name="line.93"></a>
-<span class="sourceLineNo">094</span>  default AsyncTable&lt;ScanResultConsumer&gt; getTable(TableName tableName, ExecutorService pool) {<a name="line.94"></a>
-<span class="sourceLineNo">095</span>    return getTableBuilder(tableName, pool).build();<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  }<a name="line.96"></a>
-<span class="sourceLineNo">097</span><a name="line.97"></a>
-<span class="sourceLineNo">098</span>  /**<a name="line.98"></a>
-<span class="sourceLineNo">099</span>   * Returns an {@link AsyncTableBuilder} for creating {@link AsyncTable}.<a name="line.99"></a>
-<span class="sourceLineNo">100</span>   * &lt;p&gt;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>   * This method no longer checks table existence. An exception will be thrown if the table does not<a name="line.101"></a>
-<span class="sourceLineNo">102</span>   * exist only when the first operation is attempted.<a name="line.102"></a>
-<span class="sourceLineNo">103</span>   * @param tableName the name of the table<a name="line.103"></a>
-<span class="sourceLineNo">104</span>   * @param pool the thread pool to use for executing callback<a name="line.104"></a>
-<span class="sourceLineNo">105</span>   */<a name="line.105"></a>
-<span class="sourceLineNo">106</span>  AsyncTableBuilder&lt;ScanResultConsumer&gt; getTableBuilder(TableName tableName, ExecutorService pool);<a name="line.106"></a>
+<span class="sourceLineNo">056</span>   * Clear all the entries in the region location cache, for all the tables.<a name="line.56"></a>
+<span class="sourceLineNo">057</span>   * &lt;p/&gt;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>   * If you only want to clear the cache for a specific table, use<a name="line.58"></a>
+<span class="sourceLineNo">059</span>   * {@link AsyncTableRegionLocator#clearRegionLocationCache()}.<a name="line.59"></a>
+<span class="sourceLineNo">060</span>   * &lt;p/&gt;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>   * This may cause performance issue so use it with caution.<a name="line.61"></a>
+<span class="sourceLineNo">062</span>   */<a name="line.62"></a>
+<span class="sourceLineNo">063</span>  void clearRegionLocationCache();<a name="line.63"></a>
+<span class="sourceLineNo">064</span><a name="line.64"></a>
+<span class="sourceLineNo">065</span>  /**<a name="line.65"></a>
+<span class="sourceLineNo">066</span>   * Retrieve an {@link AsyncTable} implementation for accessing a table.<a name="line.66"></a>
+<span class="sourceLineNo">067</span>   * &lt;p&gt;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>   * The returned instance will use default configs. Use {@link #getTableBuilder(TableName)} if<a name="line.68"></a>
+<span class="sourceLineNo">069</span>   * you want to customize some configs.<a name="line.69"></a>
+<span class="sourceLineNo">070</span>   * &lt;p&gt;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>   * This method no longer checks table existence. An exception will be thrown if the table does not<a name="line.71"></a>
+<span class="sourceLineNo">072</span>   * exist only when the first operation is attempted.<a name="line.72"></a>
+<span class="sourceLineNo">073</span>   * &lt;p&gt;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>   * The returned {@code CompletableFuture} will be finished directly in the rpc framework's<a name="line.74"></a>
+<span class="sourceLineNo">075</span>   * callback thread, so typically you should not do any time consuming work inside these methods.<a name="line.75"></a>
+<span class="sourceLineNo">076</span>   * And also the observer style scan API will use {@link AdvancedScanResultConsumer} which is<a name="line.76"></a>
+<span class="sourceLineNo">077</span>   * designed for experts only. Only use it when you know what you are doing.<a name="line.77"></a>
+<span class="sourceLineNo">078</span>   * @param tableName the name of the table<a name="line.78"></a>
+<span class="sourceLineNo">079</span>   * @return an AsyncTable to use for interactions with this table<a name="line.79"></a>
+<span class="sourceLineNo">080</span>   * @see #getTableBuilder(TableName)<a name="line.80"></a>
+<span class="sourceLineNo">081</span>   */<a name="line.81"></a>
+<span class="sourceLineNo">082</span>  default AsyncTable&lt;AdvancedScanResultConsumer&gt; getTable(TableName tableName) {<a name="line.82"></a>
+<span class="sourceLineNo">083</span>    return getTableBuilder(tableName).build();<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>  /**<a name="line.86"></a>
+<span class="sourceLineNo">087</span>   * Returns an {@link AsyncTableBuilder} for creating {@link AsyncTable}.<a name="line.87"></a>
+<span class="sourceLineNo">088</span>   * &lt;p&gt;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>   * This method no longer checks table existence. An exception will be thrown if the table does not<a name="line.89"></a>
+<span class="sourceLineNo">090</span>   * exist only when the first operation is attempted.<a name="line.90"></a>
+<span class="sourceLineNo">091</span>   * @param tableName the name of the table<a name="line.91"></a>
+<span class="sourceLineNo">092</span>   */<a name="line.92"></a>
+<span class="sourceLineNo">093</span>  AsyncTableBuilder&lt;AdvancedScanResultConsumer&gt; getTableBuilder(TableName tableName);<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>   * Retrieve an {@link AsyncTable} implementation for accessing a table.<a name="line.96"></a>
+<span class="sourceLineNo">097</span>   * &lt;p&gt;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>   * This method no longer checks table existence. An exception will be thrown if the table does not<a name="line.98"></a>
+<span class="sourceLineNo">099</span>   * exist only when the first operation is attempted.<a name="line.99"></a>
+<span class="sourceLineNo">100</span>   * @param tableName the name of the table<a name="line.100"></a>
+<span class="sourceLineNo">101</span>   * @param pool the thread pool to use for executing callback<a name="line.101"></a>
+<span class="sourceLineNo">102</span>   * @return an AsyncTable to use for interactions with this table<a name="line.102"></a>
+<span class="sourceLineNo">103</span>   */<a name="line.103"></a>
+<span class="sourceLineNo">104</span>  default AsyncTable&lt;ScanResultConsumer&gt; getTable(TableName tableName, ExecutorService pool) {<a name="line.104"></a>
+<span class="sourceLineNo">105</span>    return getTableBuilder(tableName, pool).build();<a name="line.105"></a>
+<span class="sourceLineNo">106</span>  }<a name="line.106"></a>
 <span class="sourceLineNo">107</span><a name="line.107"></a>
 <span class="sourceLineNo">108</span>  /**<a name="line.108"></a>
-<span class="sourceLineNo">109</span>   * Retrieve an {@link AsyncAdmin} implementation to administer an HBase cluster.<a name="line.109"></a>
+<span class="sourceLineNo">109</span>   * Returns an {@link AsyncTableBuilder} for creating {@link AsyncTable}.<a name="line.109"></a>
 <span class="sourceLineNo">110</span>   * &lt;p&gt;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>   * The returned instance will use default configs. Use {@link #getAdminBuilder()} if you want to<a name="line.111"></a>
-<span class="sourceLineNo">112</span>   * customize some configs.<a name="line.112"></a>
-<span class="sourceLineNo">113</span>   * &lt;p&gt;<a name="line.113"></a>
-<span class="sourceLineNo">114</span>   * The admin operation's returned {@code CompletableFuture} will be finished directly in the rpc<a name="line.114"></a>
-<span class="sourceLineNo">115</span>   * framework's callback thread, so typically you should not do any time consuming work inside<a name="line.115"></a>
-<span class="sourceLineNo">116</span>   * these methods.<a name="line.116"></a>
-<span class="sourceLineNo">117</span>   * @return an {@link AsyncAdmin} instance for cluster administration<a name="line.117"></a>
-<span class="sourceLineNo">118</span>   */<a name="line.118"></a>
-<span class="sourceLineNo">119</span>  default AsyncAdmin getAdmin() {<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    return getAdminBuilder().build();<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>  /**<a name="line.123"></a>
-<span class="sourceLineNo">124</span>   * Returns an {@link AsyncAdminBuilder} for creating {@link AsyncAdmin}.<a name="line.124"></a>
-<span class="sourceLineNo">125</span>   * &lt;p&gt;<a name="line.125"></a>
-<span class="sourceLineNo">126</span>   * The admin operation's returned {@code CompletableFuture} will be finished directly in the rpc<a name="line.126"></a>
-<span class="sourceLineNo">127</span>   * framework's callback thread, so typically you should not do any time consuming work inside<a name="line.127"></a>
-<span class="sourceLineNo">128</span>   * these methods.<a name="line.128"></a>
-<span class="sourceLineNo">129</span>   */<a name="line.129"></a>
-<span class="sourceLineNo">130</span>  AsyncAdminBuilder getAdminBuilder();<a name="line.130"></a>
-<span class="sourceLineNo">131</span><a name="line.131"></a>
-<span class="sourceLineNo">132</span>  /**<a name="line.132"></a>
-<span class="sourceLineNo">133</span>   * Retrieve an {@link AsyncAdmin} implementation to administer an HBase cluster.<a name="line.133"></a>
-<span class="sourceLineNo">134</span>   * &lt;p&gt;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>   * The returned instance will use default configs. Use {@link #getAdminBuilder(ExecutorService)}<a name="line.135"></a>
-<span class="sourceLineNo">136</span>   * if you want to customize some configs.<a name="line.136"></a>
-<span class="sourceLineNo">137</span>   * @param pool the thread pool to use for executing callback<a name="line.137"></a>
-<span class="sourceLineNo">138</span>   * @return an {@link AsyncAdmin} instance for cluster administration<a name="line.138"></a>
+<span class="sourceLineNo">111</span>   * This method no longer checks table existence. An exception will be thrown if the table does not<a name="line.111"></a>
+<span class="sourceLineNo">112</span>   * exist only when the first operation is attempted.<a name="line.112"></a>
+<span class="sourceLineNo">113</span>   * @param tableName the name of the table<a name="line.113"></a>
+<span class="sourceLineNo">114</span>   * @param pool the thread pool to use for executing callback<a name="line.114"></a>
+<span class="sourceLineNo">115</span>   */<a name="line.115"></a>
+<span class="sourceLineNo">116</span>  AsyncTableBuilder&lt;ScanResultConsumer&gt; getTableBuilder(TableName tableName, ExecutorService pool);<a name="line.116"></a>
+<span class="sourceLineNo">117</span><a name="line.117"></a>
+<span class="sourceLineNo">118</span>  /**<a name="line.118"></a>
+<span class="sourceLineNo">119</span>   * Retrieve an {@link AsyncAdmin} implementation to administer an HBase cluster.<a name="line.119"></a>
+<span class="sourceLineNo">120</span>   * &lt;p&gt;<a name="line.120"></a>
+<span class="sourceLineNo">121</span>   * The returned instance will use default configs. Use {@link #getAdminBuilder()} if you want to<a name="line.121"></a>
+<span class="sourceLineNo">122</span>   * customize some configs.<a name="line.122"></a>
+<span class="sourceLineNo">123</span>   * &lt;p&gt;<a name="line.123"></a>
+<span class="sourceLineNo">124</span>   * The admin operation's returned {@code CompletableFuture} will be finished directly in the rpc<a name="line.124"></a>
+<span class="sourceLineNo">125</span>   * framework's callback thread, so typically you should not do any time consuming work inside<a name="line.125"></a>
+<span class="sourceLineNo">126</span>   * these methods.<a name="line.126"></a>
+<span class="sourceLineNo">127</span>   * @return an {@link AsyncAdmin} instance for cluster administration<a name="line.127"></a>
+<span class="sourceLineNo">128</span>   */<a name="line.128"></a>
+<span class="sourceLineNo">129</span>  default AsyncAdmin getAdmin() {<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    return getAdminBuilder().build();<a name="line.130"></a>
+<span class="sourceLineNo">131</span>  }<a name="line.131"></a>
+<span class="sourceLineNo">132</span><a name="line.132"></a>
+<span class="sourceLineNo">133</span>  /**<a name="line.133"></a>
+<span class="sourceLineNo">134</span>   * Returns an {@link AsyncAdminBuilder} for creating {@link AsyncAdmin}.<a name="line.134"></a>
+<span class="sourceLineNo">135</span>   * &lt;p&gt;<a name="line.135"></a>
+<span class="sourceLineNo">136</span>   * The admin operation's returned {@code CompletableFuture} will be finished directly in the rpc<a name="line.136"></a>
+<span class="sourceLineNo">137</span>   * framework's callback thread, so typically you should not do any time consuming work inside<a name="line.137"></a>
+<span class="sourceLineNo">138</span>   * these methods.<a name="line.138"></a>
 <span class="sourceLineNo">139</span>   */<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  default AsyncAdmin getAdmin(ExecutorService pool) {<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    return getAdminBuilder(pool).build();<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>  /**<a name="line.144"></a>
-<span class="sourceLineNo">145</span>   * Returns an {@link AsyncAdminBuilder} for creating {@link AsyncAdmin}.<a name="line.145"></a>
-<span class="sourceLineNo">146</span>   * @param pool the thread pool to use for executing callback<a name="line.146"></a>
-<span class="sourceLineNo">147</span>   */<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  AsyncAdminBuilder getAdminBuilder(ExecutorService pool);<a name="line.148"></a>
-<span class="sourceLineNo">149</span><a name="line.149"></a>
-<span class="sourceLineNo">150</span>  /**<a name="line.150"></a>
-<span class="sourceLineNo">151</span>   * Retrieve an {@link AsyncBufferedMutator} for performing client-side buffering of writes.<a name="line.151"></a>
-<span class="sourceLineNo">152</span>   * &lt;p&gt;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>   * The returned instance will use default configs. Use<a name="line.153"></a>
-<span class="sourceLineNo">154</span>   * {@link #getBufferedMutatorBuilder(TableName)} if you want to customize some configs.<a name="line.154"></a>
-<span class="sourceLineNo">155</span>   * @param tableName the name of the table<a name="line.155"></a>
-<span class="sourceLineNo">156</span>   * @return an {@link AsyncBufferedMutator} for the supplied tableName.<a name="line.156"></a>
+<span class="sourceLineNo">140</span>  AsyncAdminBuilder getAdminBuilder();<a name="line.140"></a>
+<span class="sourceLineNo">141</span><a name="line.141"></a>
+<span class="sourceLineNo">142</span>  /**<a name="line.142"></a>
+<span class="sourceLineNo">143</span>   * Retrieve an {@link AsyncAdmin} implementation to administer an HBase cluster.<a name="line.143"></a>
+<span class="sourceLineNo">144</span>   * &lt;p&gt;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>   * The returned instance will use default configs. Use {@link #getAdminBuilder(ExecutorService)}<a name="line.145"></a>
+<span class="sourceLineNo">146</span>   * if you want to customize some configs.<a name="line.146"></a>
+<span class="sourceLineNo">147</span>   * @param pool the thread pool to use for executing callback<a name="line.147"></a>
+<span class="sourceLineNo">148</span>   * @return an {@link AsyncAdmin} instance for cluster administration<a name="line.148"></a>
+<span class="sourceLineNo">149</span>   */<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  default AsyncAdmin getAdmin(ExecutorService pool) {<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    return getAdminBuilder(pool).build();<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  }<a name="line.152"></a>
+<span class="sourceLineNo">153</span><a name="line.153"></a>
+<span class="sourceLineNo">154</span>  /**<a name="line.154"></a>
+<span class="sourceLineNo">155</span>   * Returns an {@link AsyncAdminBuilder} for creating {@link AsyncAdmin}.<a name="line.155"></a>
+<span class="sourceLineNo">156</span>   * @param pool the thread pool to use for executing callback<a name="line.156"></a>
 <span class="sourceLineNo">157</span>   */<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  default AsyncBufferedMutator getBufferedMutator(TableName tableName) {<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    return getBufferedMutatorBuilder(tableName).build();<a name="line.159"></a>
-<span class="sourceLineNo">160</span>  }<a name="line.160"></a>
-<span class="sourceLineNo">161</span><a name="line.161"></a>
-<span class="sourceLineNo">162</span>  /**<a name="line.162"></a>
-<span class="sourceLineNo">163</span>   * Returns an {@link AsyncBufferedMutatorBuilder} for creating {@link AsyncBufferedMutator}.<a name="line.163"></a>
-<span class="sourceLineNo">164</span>   * @param tableName the name of the table<a name="line.164"></a>
-<span class="sourceLineNo">165</span>   */<a name="line.165"></a>
-<span class="sourceLineNo">166</span>  AsyncBufferedMutatorBuilder getBufferedMutatorBuilder(TableName tableName);<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>   * Retrieve an {@link AsyncBufferedMutator} for performing client-side buffering of writes.<a name="line.169"></a>
-<span class="sourceLineNo">170</span>   * &lt;p&gt;<a name="line.170"></a>
-<span class="sourceLineNo">171</span>   * The returned instance will use default configs. Use<a name="line.171"></a>
-<span class="sourceLineNo">172</span>   * {@link #getBufferedMutatorBuilder(TableName, ExecutorService)} if you want to customize some<a name="line.172"></a>
-<span class="sourceLineNo">173</span>   * configs.<a name="line.173"></a>
+<span class="sourceLineNo">158</span>  AsyncAdminBuilder getAdminBuilder(ExecutorService pool);<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  /**<a name="line.160"></a>
+<span class="sourceLineNo">161</span>   * Retrieve an {@link AsyncBufferedMutator} for performing client-side buffering of writes.<a name="line.161"></a>
+<span class="sourceLineNo">162</span>   * &lt;p&gt;<a name="line.162"></a>
+<span class="sourceLineNo">163</span>   * The returned instance will use default configs. Use<a name="line.163"></a>
+<span class="sourceLineNo">164</span>   * {@link #getBufferedMutatorBuilder(TableName)} if you want to customize some configs.<a name="line.164"></a>
+<span class="sourceLineNo">165</span>   * @param tableName the name of the table<a name="line.165"></a>
+<span class="sourceLineNo">166</span>   * @return an {@link AsyncBufferedMutator} for the supplied tableName.<a name="line.166"></a>
+<span class="sourceLineNo">167</span>   */<a name="line.167"></a>
+<span class="sourceLineNo">168</span>  default AsyncBufferedMutator getBufferedMutator(TableName tableName) {<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    return getBufferedMutatorBuilder(tableName).build();<a name="line.169"></a>
+<span class="sourceLineNo">170</span>  }<a name="line.170"></a>
+<span class="sourceLineNo">171</span><a name="line.171"></a>
+<span class="sourceLineNo">172</span>  /**<a name="line.172"></a>
+<span class="sourceLineNo">173</span>   * Returns an {@link AsyncBufferedMutatorBuilder} for creating {@link AsyncBufferedMutator}.<a name="line.173"></a>
 <span class="sourceLineNo">174</span>   * @param tableName the name of the table<a name="line.174"></a>
-<span class="sourceLineNo">175</span>   * @param pool the thread pool to use for executing callback<a name="line.175"></a>
-<span class="sourceLineNo">176</span>   * @return an {@link AsyncBufferedMutator} for the supplied tableName.<a name="line.176"></a>
-<span class="sourceLineNo">177</span>   */<a name="line.177"></a>
-<span class="sourceLineNo">178</span>  default AsyncBufferedMutator getBufferedMutator(TableName tableName, ExecutorService pool) {<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    return getBufferedMutatorBuilder(tableName, pool).build();<a name="line.179"></a>
-<span class="sourceLineNo">180</span>  }<a name="line.180"></a>
-<span class="sourceLineNo">181</span><a name="line.181"></a>
-<span class="sourceLineNo">182</span>  /**<a name="line.182"></a>
-<span class="sourceLineNo">183</span>   * Returns an {@link AsyncBufferedMutatorBuilder} for creating {@link AsyncBufferedMutator}.<a name="line.183"></a>
+<span class="sourceLineNo">175</span>   */<a name="line.175"></a>
+<span class="sourceLineNo">176</span>  AsyncBufferedMutatorBuilder getBufferedMutatorBuilder(TableName tableName);<a name="line.176"></a>
+<span class="sourceLineNo">177</span><a name="line.177"></a>
+<span class="sourceLineNo">178</span>  /**<a name="line.178"></a>
+<span class="sourceLineNo">179</span>   * Retrieve an {@link AsyncBufferedMutator} for performing client-side buffering of writes.<a name="line.179"></a>
+<span class="sourceLineNo">180</span>   * &lt;p&gt;<a name="line.180"></a>
+<span class="sourceLineNo">181</span>   * The returned instance will use default configs. Use<a name="line.181"></a>
+<span class="sourceLineNo">182</span>   * {@link #getBufferedMutatorBuilder(TableName, ExecutorService)} if you want to customize some<a name="line.182"></a>
+<span class="sourceLineNo">183</span>   * configs.<a name="line.183"></a>
 <span class="sourceLineNo">184</span>   * @param tableName the name of the table<a name="line.184"></a>
 <span class="sourceLineNo">185</span>   * @param pool the thread pool to use for executing callback<a name="line.185"></a>
-<span class="sourceLineNo">186</span>   */<a name="line.186"></a>
-<span class="sourceLineNo">187</span>  AsyncBufferedMutatorBuilder getBufferedMutatorBuilder(TableName tableName, ExecutorService pool);<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>   * Retrieve an Hbck implementation to fix an HBase cluster. The returned Hbck is not guaranteed to<a name="line.190"></a>
-<span class="sourceLineNo">191</span>   * be thread-safe. A new instance should be created by each thread. This is a lightweight<a name="line.191"></a>
-<span class="sourceLineNo">192</span>   * operation. Pooling or caching of the returned Hbck instance is not recommended.<a name="line.192"></a>
-<span class="sourceLineNo">193</span>   * &lt;p/&gt;<a name="line.193"></a>
-<span class="sourceLineNo">194</span>   * The caller is responsible for calling {@link Hbck#close()} on the returned Hbck instance.<a name="line.194"></a>
-<span class="sourceLineNo">195</span>   * &lt;p/&gt;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>   * This will be used mostly by hbck tool.<a name="line.196"></a>
-<span class="sourceLineNo">197</span>   * @return an Hbck instance for active master. Active master is fetched from the zookeeper.<a name="line.197"></a>
-<span class="sourceLineNo">198</span>   */<a name="line.198"></a>
-<span class="sourceLineNo">199</span>  @InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.HBCK)<a name="line.199"></a>
-<span class="sourceLineNo">200</span>  CompletableFuture&lt;Hbck&gt; getHbck();<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>   * Retrieve an Hbck implementation to fix an HBase cluster. The returned Hbck is not guaranteed to<a name="line.203"></a>
-<span class="sourceLineNo">204</span>   * be thread-safe. A new instance should be created by each thread. This is a lightweight<a name="line.204"></a>
-<span class="sourceLineNo">205</span>   * operation. Pooling or caching of the returned Hbck instance is not recommended.<a name="line.205"></a>
-<span class="sourceLineNo">206</span>   * &lt;p/&gt;<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * The caller is responsible for calling {@link Hbck#close()} on the returned Hbck instance.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   * &lt;p/&gt;<a name="line.208"></a>
-<span class="sourceLineNo">209</span>   * This will be used mostly by hbck tool. This may only be used to by pass getting registered<a name="line.209"></a>
-<span class="sourceLineNo">210</span>   * master from ZK. In situations where ZK is not available or active master is not registered with<a name="line.210"></a>
-<span class="sourceLineNo">211</span>   * ZK and user can get master address by other means, master can be explicitly specified.<a name="line.211"></a>
-<span class="sourceLineNo">212</span>   * @param masterServer explicit {@link ServerName} for master server<a name="line.212"></a>
-<span class="sourceLineNo">213</span>   * @return an Hbck instance for a specified master server<a name="line.213"></a>
-<span class="sourceLineNo">214</span>   */<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  @InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.HBCK)<a name="line.215"></a>
-<span class="sourceLineNo">216</span>  Hbck getHbck(ServerName masterServer) throws IOException;<a name="line.216"></a>
-<span class="sourceLineNo">217</span>}<a name="line.217"></a>
+<span class="sourceLineNo">186</span>   * @return an {@link AsyncBufferedMutator} for the supplied tableName.<a name="line.186"></a>
+<span class="sourceLineNo">187</span>   */<a name="line.187"></a>
+<span class="sourceLineNo">188</span>  default AsyncBufferedMutator getBufferedMutator(TableName tableName, ExecutorService pool) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    return getBufferedMutatorBuilder(tableName, pool).build();<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>   * Returns an {@link AsyncBufferedMutatorBuilder} for creating {@link AsyncBufferedMutator}.<a name="line.193"></a>
+<span class="sourceLineNo">194</span>   * @param tableName the name of the table<a name="line.194"></a>
+<span class="sourceLineNo">195</span>   * @param pool the thread pool to use for executing callback<a name="line.195"></a>
+<span class="sourceLineNo">196</span>   */<a name="line.196"></a>
+<span class="sourceLineNo">197</span>  AsyncBufferedMutatorBuilder getBufferedMutatorBuilder(TableName tableName, ExecutorService pool);<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>   * Retrieve an Hbck implementation to fix an HBase cluster. The returned Hbck is not guaranteed to<a name="line.200"></a>
+<span class="sourceLineNo">201</span>   * be thread-safe. A new instance should be created by each thread. This is a lightweight<a name="line.201"></a>
+<span class="sourceLineNo">202</span>   * operation. Pooling or caching of the returned Hbck instance is not recommended.<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   * &lt;p/&gt;<a name="line.203"></a>
+<span class="sourceLineNo">204</span>   * The caller is responsible for calling {@link Hbck#close()} on the returned Hbck instance.<a name="line.204"></a>
+<span class="sourceLineNo">205</span>   * &lt;p/&gt;<a name="line.205"></a>
+<span class="sourceLineNo">206</span>   * This will be used mostly by hbck tool.<a name="line.206"></a>
+<span class="sourceLineNo">207</span>   * @return an Hbck instance for active master. Active master is fetched from the zookeeper.<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   */<a name="line.208"></a>
+<span class="sourceLineNo">209</span>  @InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.HBCK)<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  CompletableFuture&lt;Hbck&gt; getHbck();<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>   * Retrieve an Hbck implementation to fix an HBase cluster. The returned Hbck is not guaranteed to<a name="line.213"></a>
+<span class="sourceLineNo">214</span>   * be thread-safe. A new instance should be created by each thread. This is a lightweight<a name="line.214"></a>
+<span class="sourceLineNo">215</span>   * operation. Pooling or caching of the returned Hbck instance is not recommended.<a name="line.215"></a>
+<span class="sourceLineNo">216</span>   * &lt;p/&gt;<a name="line.216"></a>
+<span class="sourceLineNo">217</span>   * The caller is responsible for calling {@link Hbck#close()} on the returned Hbck instance.<a name="line.217"></a>
+<span class="sourceLineNo">218</span>   * &lt;p/&gt;<a name="line.218"></a>
+<span class="sourceLineNo">219</span>   * This will be used mostly by hbck tool. This may only be used to by pass getting registered<a name="line.219"></a>
+<span class="sourceLineNo">220</span>   * master from ZK. In situations where ZK is not available or active master is not registered with<a name="line.220"></a>
+<span class="sourceLineNo">221</span>   * ZK and user can get master address by other means, master can be explicitly specified.<a name="line.221"></a>
+<span class="sourceLineNo">222</span>   * @param masterServer explicit {@link ServerName} for master server<a name="line.222"></a>
+<span class="sourceLineNo">223</span>   * @return an Hbck instance for a specified master server<a name="line.223"></a>
+<span class="sourceLineNo">224</span>   */<a name="line.224"></a>
+<span class="sourceLineNo">225</span>  @InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.HBCK)<a name="line.225"></a>
+<span class="sourceLineNo">226</span>  Hbck getHbck(ServerName masterServer) throws IOException;<a name="line.226"></a>
+<span class="sourceLineNo">227</span>}<a name="line.227"></a>
 
 
 
diff --git a/book.html b/book.html
index 1017539..69b0767 100644
--- a/book.html
+++ b/book.html
@@ -41579,7 +41579,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-02-12 14:50:09 UTC
+Last updated 2019-02-13 14:29:39 UTC
 </div>
 </div>
 </body>
diff --git a/bulk-loads.html b/bulk-loads.html
index b83c6a9..2a7af11 100644
--- a/bulk-loads.html
+++ b/bulk-loads.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20190212" />
+    <meta name="Date-Revision-yyyymmdd" content="20190213" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Bulk Loads in Apache HBase (TM)
@@ -316,7 +316,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2019-02-12</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2019-02-13</li>
             </p>
                 </div>
 
diff --git a/checkstyle-aggregate.html b/checkstyle-aggregate.html
index f3e7c60..180b877 100644
--- a/checkstyle-aggregate.html
+++ b/checkstyle-aggregate.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20190212" />
+    <meta name="Date-Revision-yyyymmdd" content="20190213" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Checkstyle Results</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -9568,12 +9568,12 @@
 <td><a class="externalLink" href="http://checkstyle.sourceforge.net/config_javadoc.html#JavadocTagContinuationIndentation">JavadocTagContinuationIndentation</a>
 <ul>
 <li>offset: <tt>&quot;2&quot;</tt></li></ul></td>
-<td>726</td>
+<td>725</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="a">
 <td></td>
 <td><a class="externalLink" href="http://checkstyle.sourceforge.net/config_javadoc.html#NonEmptyAtclauseDescription">NonEmptyAtclauseDescription</a></td>
-<td>3392</td>
+<td>3393</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="b">
 <td>misc</td>
@@ -18546,7 +18546,7 @@
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
+<td>NonEmptyAtclauseDescription</td>
 <td>Javadoc comment at column 0 has parse error. Details: no viable alternative at input '   *' while parsing JAVADOC_TAG</td>
 <td>117</td></tr>
 <tr class="b">
@@ -60683,37 +60683,37 @@
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>1405</td></tr>
+<td>1411</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>1407</td></tr>
+<td>1413</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>1410</td></tr>
+<td>1416</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>1720</td></tr>
+<td>1726</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>1845</td></tr>
+<td>1851</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'lambda arguments' has incorrect indentation level 8, expected level should be 6.</td>
-<td>1893</td></tr></table></div>
+<td>1899</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.assignment.GCMergedRegionsProcedure.java">org/apache/hadoop/hbase/master/assignment/GCMergedRegionsProcedure.java</h3>
 <table border="0" class="table table-striped">
@@ -112257,7 +112257,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2019-02-12</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2019-02-13</li>
             </p>
                 </div>
 
diff --git a/coc.html b/coc.html
index 4f43e0a..debd05a 100644
--- a/coc.html
+++ b/coc.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20190212" />
+    <meta name="Date-Revision-yyyymmdd" content="20190213" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Code of Conduct Policy
@@ -385,7 +385,7 @@ email to <a class="externalLink" href="mailto:private@hbase.apache.org">the priv
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2019-02-12</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2019-02-13</li>
             </p>
                 </div>
 
diff --git a/dependencies.html b/dependencies.html
index 63702c3..377a6a3 100644
--- a/dependencies.html
+++ b/dependencies.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20190212" />
+    <meta name="Date-Revision-yyyymmdd" content="20190213" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Dependencies</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -450,7 +450,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2019-02-12</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2019-02-13</li>
             </p>
                 </div>
 
diff --git a/dependency-convergence.html b/dependency-convergence.html
index b6b26cc..e4249e4 100644
--- a/dependency-convergence.html
+++ b/dependency-convergence.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20190212" />
+    <meta name="Date-Revision-yyyymmdd" content="20190213" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Reactor Dependency Convergence</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -680,7 +680,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2019-02-12</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2019-02-13</li>
             </p>
                 </div>
 
diff --git a/dependency-info.html b/dependency-info.html
index 90a03ce..ce1c3d5 100644
--- a/dependency-info.html
+++ b/dependency-info.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20190212" />
+    <meta name="Date-Revision-yyyymmdd" content="20190213" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Dependency Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -323,7 +323,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2019-02-12</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2019-02-13</li>
             </p>
                 </div>
 
diff --git a/dependency-management.html b/dependency-management.html
index 99bf9ca..528e8c5 100644
--- a/dependency-management.html
+++ b/dependency-management.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20190212" />
+    <meta name="Date-Revision-yyyymmdd" content="20190213" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Dependency Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -1009,7 +1009,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2019-02-12</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2019-02-13</li>
             </p>
                 </div>
 
diff --git a/devapidocs/constant-values.html b/devapidocs/constant-values.html
index 146df6c..4da9145 100644
--- a/devapidocs/constant-values.html
+++ b/devapidocs/constant-values.html
@@ -3880,7 +3880,7 @@
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/Version.html#date">date</a></code></td>
-<td class="colLast"><code>"Tue Feb 12 14:58:34 UTC 2019"</code></td>
+<td class="colLast"><code>"Wed Feb 13 14:38:19 UTC 2019"</code></td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.revision">
@@ -3894,7 +3894,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>"02906457f8c621f88e1fd05db77893bd"</code></td>
+<td class="colLast"><code>"74c6ce927119c354026c5908ec3f35e4"</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 a280637..9ed66ab 100644
--- a/devapidocs/index-all.html
+++ b/devapidocs/index-all.html
@@ -12339,8 +12339,12 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html#clearCache-org.apache.hadoop.hbase.TableName-">clearCache(TableName)</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html" title="class in org.apache.hadoop.hbase.client">AsyncNonMetaRegionLocator</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html#clearCache--">clearCache()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html" title="class in org.apache.hadoop.hbase.client">AsyncNonMetaRegionLocator</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/AsyncRegionLocator.html#clearCache-org.apache.hadoop.hbase.TableName-">clearCache(TableName)</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/AsyncRegionLocator.html" title="class in org.apache.hadoop.hbase.client">AsyncRegionLocator</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/AsyncRegionLocator.html#clearCache--">clearCache()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/AsyncRegionLocator.html" title="class in org.apache.hadoop.hbase.client">AsyncRegionLocator</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/MetaCache.html#clearCache--">clearCache()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/MetaCache.html" title="class in org.apache.hadoop.hbase.client">MetaCache</a></dt>
 <dd>
 <div class="block">Delete all cached entries.</div>
@@ -12506,6 +12510,12 @@
 <dd>
 <div class="block">Explicitly clears the region cache to fetch the latest value from META.</div>
 </dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/AsyncConnection.html#clearRegionLocationCache--">clearRegionLocationCache()</a></span> - Method in interface org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/AsyncConnection.html" title="interface in org.apache.hadoop.hbase.client">AsyncConnection</a></dt>
+<dd>
+<div class="block">Clear all the entries in the region location cache, for all the tables.</div>
+</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/AsyncConnectionImpl.html#clearRegionLocationCache--">clearRegionLocationCache()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/AsyncConnectionImpl.html" title="class in org.apache.hadoop.hbase.client">AsyncConnectionImpl</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/AsyncTableRegionLocator.html#clearRegionLocationCache--">clearRegionLocationCache()</a></span> - Method in interface org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/AsyncTableRegionLocator.html" title="interface in org.apache.hadoop.hbase.client">AsyncTableRegionLocator</a></dt>
 <dd>
 <div class="block">Clear all the entries in the region location cache.</div>
diff --git a/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html b/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
index 12674d3..ab6de85 100644
--- a/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
@@ -167,10 +167,10 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <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/BackupType.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupInfo.BackupPhase.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupInfo.BackupPhase</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupRestoreConstants.BackupCommand.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupRestoreConstants.BackupCommand</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupInfo.BackupState.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupInfo.BackupState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupInfo.BackupPhase.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupInfo.BackupPhase</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/client/AsyncConnection.html b/devapidocs/org/apache/hadoop/hbase/client/AsyncConnection.html
index 9113b97..e8744ad 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/AsyncConnection.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/AsyncConnection.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":18,"i1":18,"i2":6,"i3":6,"i4":18,"i5":18,"i6":6,"i7":6,"i8":6,"i9":6,"i10":6,"i11":6,"i12":18,"i13":18,"i14":6,"i15":6};
+var methods = {"i0":6,"i1":18,"i2":18,"i3":6,"i4":6,"i5":18,"i6":18,"i7":6,"i8":6,"i9":6,"i10":6,"i11":6,"i12":6,"i13":18,"i14":18,"i15":6,"i16":6};
 var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],4:["t3","Abstract Methods"],16:["t5","Default Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -136,99 +136,105 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.htm
 <th class="colLast" scope="col">Method and Description</th>
 </tr>
 <tr id="i0" class="altColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnection.html#clearRegionLocationCache--">clearRegionLocationCache</a></span>()</code>
+<div class="block">Clear all the entries in the region location cache, for all the tables.</div>
+</td>
+</tr>
+<tr id="i1" class="rowColor">
 <td class="colFirst"><code>default <a href="../../../../../org/apache/hadoop/hbase/client/AsyncAdmin.html" title="interface in org.apache.hadoop.hbase.client">AsyncAdmin</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnection.html#getAdmin--">getAdmin</a></span>()</code>
 <div class="block">Retrieve an <a href="../../../../../org/apache/hadoop/hbase/client/AsyncAdmin.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncAdmin</code></a> implementation to administer an HBase cluster.</div>
 </td>
 </tr>
-<tr id="i1" class="rowColor">
+<tr id="i2" class="altColor">
 <td class="colFirst"><code>default <a href="../../../../../org/apache/hadoop/hbase/client/AsyncAdmin.html" title="interface in org.apache.hadoop.hbase.client">AsyncAdmin</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnection.html#getAdmin-java.util.concurrent.ExecutorService-">getAdmin</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;pool)</code>
 <div class="block">Retrieve an <a href="../../../../../org/apache/hadoop/hbase/client/AsyncAdmin.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncAdmin</code></a> implementation to administer an HBase cluster.</div>
 </td>
 </tr>
-<tr id="i2" class="altColor">
+<tr id="i3" class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/client/AsyncAdminBuilder.html" title="interface in org.apache.hadoop.hbase.client">AsyncAdminBuilder</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnection.html#getAdminBuilder--">getAdminBuilder</a></span>()</code>
 <div class="block">Returns an <a href="../../../../../org/apache/hadoop/hbase/client/AsyncAdminBuilder.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncAdminBuilder</code></a> for creating <a href="../../../../../org/apache/hadoop/hbase/client/AsyncAdmin.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncAdmin</code></a>.</div>
 </td>
 </tr>
-<tr id="i3" class="rowColor">
+<tr id="i4" class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/client/AsyncAdminBuilder.html" title="interface in org.apache.hadoop.hbase.client">AsyncAdminBuilder</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnection.html#getAdminBuilder-java.util.concurrent.ExecutorService-">getAdminBuilder</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;pool)</code>
 <div class="block">Returns an <a href="../../../../../org/apache/hadoop/hbase/client/AsyncAdminBuilder.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncAdminBuilder</code></a> for creating <a href="../../../../../org/apache/hadoop/hbase/client/AsyncAdmin.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncAdmin</code></a>.</div>
 </td>
 </tr>
-<tr id="i4" class="altColor">
+<tr id="i5" class="rowColor">
 <td class="colFirst"><code>default <a href="../../../../../org/apache/hadoop/hbase/client/AsyncBufferedMutator.html" title="interface in org.apache.hadoop.hbase.client">AsyncBufferedMutator</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnection.html#getBufferedMutator-org.apache.hadoop.hbase.TableName-">getBufferedMutator</a></span>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</code>
 <div class="block">Retrieve an <a href="../../../../../org/apache/hadoop/hbase/client/AsyncBufferedMutator.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncBufferedMutator</code></a> for performing client-side buffering of writes.</div>
 </td>
 </tr>
-<tr id="i5" class="rowColor">
+<tr id="i6" class="altColor">
 <td class="colFirst"><code>default <a href="../../../../../org/apache/hadoop/hbase/client/AsyncBufferedMutator.html" title="interface in org.apache.hadoop.hbase.client">AsyncBufferedMutator</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnection.html#getBufferedMutator-org.apache.hadoop.hbase.TableName-java.util.concurrent.ExecutorService-">getBufferedMutator</a></span>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                   <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;pool)</code>
 <div class="block">Retrieve an <a href="../../../../../org/apache/hadoop/hbase/client/AsyncBufferedMutator.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncBufferedMutator</code></a> for performing client-side buffering of writes.</div>
 </td>
 </tr>
-<tr id="i6" class="altColor">
+<tr id="i7" class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/client/AsyncBufferedMutatorBuilder.html" title="interface in org.apache.hadoop.hbase.client">AsyncBufferedMutatorBuilder</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnection.html#getBufferedMutatorBuilder-org.apache.hadoop.hbase.TableName-">getBufferedMutatorBuilder</a></span>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</code>
 <div class="block">Returns an <a href="../../../../../org/apache/hadoop/hbase/client/AsyncBufferedMutatorBuilder.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncBufferedMutatorBuilder</code></a> for creating <a href="../../../../../org/apache/hadoop/hbase/client/AsyncBufferedMutator.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncBufferedMutator</code></a>.</div>
 </td>
 </tr>
-<tr id="i7" class="rowColor">
+<tr id="i8" class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/client/AsyncBufferedMutatorBuilder.html" title="interface in org.apache.hadoop.hbase.client">AsyncBufferedMutatorBuilder</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnection.html#getBufferedMutatorBuilder-org.apache.hadoop.hbase.TableName-java.util.concurrent.ExecutorService-">getBufferedMutatorBuilder</a></span>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                          <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;pool)</code>
 <div class="block">Returns an <a href="../../../../../org/apache/hadoop/hbase/client/AsyncBufferedMutatorBuilder.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncBufferedMutatorBuilder</code></a> for creating <a href="../../../../../org/apache/hadoop/hbase/client/AsyncBufferedMutator.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncBufferedMutator</code></a>.</div>
 </td>
 </tr>
-<tr id="i8" class="altColor">
+<tr id="i9" class="rowColor">
 <td class="colFirst"><code>org.apache.hadoop.conf.Configuration</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnection.html#getConfiguration--">getConfiguration</a></span>()</code>
 <div class="block">Returns the <code>Configuration</code> object used by this instance.</div>
 </td>
 </tr>
-<tr id="i9" class="rowColor">
+<tr id="i10" class="altColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html?is-external=true" title="class or interface in java.util.concurrent">CompletableFuture</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Hbck.html" title="interface in org.apache.hadoop.hbase.client">Hbck</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnection.html#getHbck--">getHbck</a></span>()</code>
 <div class="block">Retrieve an Hbck implementation to fix an HBase cluster.</div>
 </td>
 </tr>
-<tr id="i10" class="altColor">
+<tr id="i11" class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/client/Hbck.html" title="interface in org.apache.hadoop.hbase.client">Hbck</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnection.html#getHbck-org.apache.hadoop.hbase.ServerName-">getHbck</a></span>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;masterServer)</code>
 <div class="block">Retrieve an Hbck implementation to fix an HBase cluster.</div>
 </td>
 </tr>
-<tr id="i11" class="rowColor">
+<tr id="i12" class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/client/AsyncTableRegionLocator.html" title="interface in org.apache.hadoop.hbase.client">AsyncTableRegionLocator</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnection.html#getRegionLocator-org.apache.hadoop.hbase.TableName-">getRegionLocator</a></span>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</code>
 <div class="block">Retrieve a AsyncRegionLocator implementation to inspect region information on a table.</div>
 </td>
 </tr>
-<tr id="i12" class="altColor">
+<tr id="i13" class="rowColor">
 <td class="colFirst"><code>default <a href="../../../../../org/apache/hadoop/hbase/client/AsyncTable.html" title="interface in org.apache.hadoop.hbase.client">AsyncTable</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/AdvancedScanResultConsumer.html" title="interface in org.apache.hadoop.hbase.client">AdvancedScanResultConsumer</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnection.html#getTable-org.apache.hadoop.hbase.TableName-">getTable</a></span>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</code>
 <div class="block">Retrieve an <a href="../../../../../org/apache/hadoop/hbase/client/AsyncTable.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncTable</code></a> implementation for accessing a table.</div>
 </td>
 </tr>
-<tr id="i13" class="rowColor">
+<tr id="i14" class="altColor">
 <td class="colFirst"><code>default <a href="../../../../../org/apache/hadoop/hbase/client/AsyncTable.html" title="interface in org.apache.hadoop.hbase.client">AsyncTable</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/ScanResultConsumer.html" title="interface in org.apache.hadoop.hbase.client">ScanResultConsumer</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnection.html#getTable-org.apache.hadoop.hbase.TableName-java.util.concurrent.ExecutorService-">getTable</a></span>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
         <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;pool)</code>
 <div class="block">Retrieve an <a href="../../../../../org/apache/hadoop/hbase/client/AsyncTable.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncTable</code></a> implementation for accessing a table.</div>
 </td>
 </tr>
-<tr id="i14" class="altColor">
+<tr id="i15" class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/client/AsyncTableBuilder.html" title="interface in org.apache.hadoop.hbase.client">AsyncTableBuilder</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/AdvancedScanResultConsumer.html" title="interface in org.apache.hadoop.hbase.client">AdvancedScanResultConsumer</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnection.html#getTableBuilder-org.apache.hadoop.hbase.TableName-">getTableBuilder</a></span>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</code>
 <div class="block">Returns an <a href="../../../../../org/apache/hadoop/hbase/client/AsyncTableBuilder.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncTableBuilder</code></a> for creating <a href="../../../../../org/apache/hadoop/hbase/client/AsyncTable.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncTable</code></a>.</div>
 </td>
 </tr>
-<tr id="i15" class="rowColor">
+<tr id="i16" class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/client/AsyncTableBuilder.html" title="interface in org.apache.hadoop.hbase.client">AsyncTableBuilder</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/ScanResultConsumer.html" title="interface in org.apache.hadoop.hbase.client">ScanResultConsumer</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnection.html#getTableBuilder-org.apache.hadoop.hbase.TableName-java.util.concurrent.ExecutorService-">getTableBuilder</a></span>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;pool)</code>
@@ -288,13 +294,28 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.htm
 </dl>
 </li>
 </ul>
+<a name="clearRegionLocationCache--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>clearRegionLocationCache</h4>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnection.html#line.63">clearRegionLocationCache</a>()</pre>
+<div class="block">Clear all the entries in the region location cache, for all the tables.
+ <p/>
+ If you only want to clear the cache for a specific table, use
+ <a href="../../../../../org/apache/hadoop/hbase/client/AsyncTableRegionLocator.html#clearRegionLocationCache--"><code>AsyncTableRegionLocator.clearRegionLocationCache()</code></a>.
+ <p/>
+ This may cause performance issue so use it with caution.</div>
+</li>
+</ul>
 <a name="getTable-org.apache.hadoop.hbase.TableName-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>getTable</h4>
-<pre>default&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/AsyncTable.html" title="interface in org.apache.hadoop.hbase.client">AsyncTable</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/AdvancedScanResultConsumer.html" title="interface in org.apache.hadoop.hbase.client">AdvancedScanResultConsumer</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnection.html#line.72">getTable</a>(<a href="../../../../../org/apache/hadoop/hba [...]
+<pre>default&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/AsyncTable.html" title="interface in org.apache.hadoop.hbase.client">AsyncTable</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/AdvancedScanResultConsumer.html" title="interface in org.apache.hadoop.hbase.client">AdvancedScanResultConsumer</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnection.html#line.82">getTable</a>(<a href="../../../../../org/apache/hadoop/hba [...]
 <div class="block">Retrieve an <a href="../../../../../org/apache/hadoop/hbase/client/AsyncTable.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncTable</code></a> implementation for accessing a table.
  <p>
  The returned instance will use default configs. Use <a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnection.html#getTableBuilder-org.apache.hadoop.hbase.TableName-"><code>getTableBuilder(TableName)</code></a> if
@@ -323,7 +344,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableBuilder</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/client/AsyncTableBuilder.html" title="interface in org.apache.hadoop.hbase.client">AsyncTableBuilder</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/AdvancedScanResultConsumer.html" title="interface in org.apache.hadoop.hbase.client">AdvancedScanResultConsumer</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnection.html#line.83">getTableBuilder</a>(<a href="../../../../../org/apache/ha [...]
+<pre><a href="../../../../../org/apache/hadoop/hbase/client/AsyncTableBuilder.html" title="interface in org.apache.hadoop.hbase.client">AsyncTableBuilder</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/AdvancedScanResultConsumer.html" title="interface in org.apache.hadoop.hbase.client">AdvancedScanResultConsumer</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnection.html#line.93">getTableBuilder</a>(<a href="../../../../../org/apache/ha [...]
 <div class="block">Returns an <a href="../../../../../org/apache/hadoop/hbase/client/AsyncTableBuilder.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncTableBuilder</code></a> for creating <a href="../../../../../org/apache/hadoop/hbase/client/AsyncTable.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncTable</code></a>.
  <p>
  This method no longer checks table existence. An exception will be thrown if the table does not
@@ -340,7 +361,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>getTable</h4>
-<pre>default&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/AsyncTable.html" title="interface in org.apache.hadoop.hbase.client">AsyncTable</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/ScanResultConsumer.html" title="interface in org.apache.hadoop.hbase.client">ScanResultConsumer</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnection.html#line.94">getTable</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.htm [...]
+<pre>default&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/AsyncTable.html" title="interface in org.apache.hadoop.hbase.client">AsyncTable</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/ScanResultConsumer.html" title="interface in org.apache.hadoop.hbase.client">ScanResultConsumer</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnection.html#line.104">getTable</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.ht [...]
                                                 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;pool)</pre>
 <div class="block">Retrieve an <a href="../../../../../org/apache/hadoop/hbase/client/AsyncTable.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncTable</code></a> implementation for accessing a table.
  <p>
@@ -361,7 +382,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableBuilder</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/client/AsyncTableBuilder.html" title="interface in org.apache.hadoop.hbase.client">AsyncTableBuilder</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/ScanResultConsumer.html" title="interface in org.apache.hadoop.hbase.client">ScanResultConsumer</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnection.html#line.106">getTableBuilder</a>(<a href="../../../../../org/apache/hadoop/hbase/Tabl [...]
+<pre><a href="../../../../../org/apache/hadoop/hbase/client/AsyncTableBuilder.html" title="interface in org.apache.hadoop.hbase.client">AsyncTableBuilder</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/ScanResultConsumer.html" title="interface in org.apache.hadoop.hbase.client">ScanResultConsumer</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnection.html#line.116">getTableBuilder</a>(<a href="../../../../../org/apache/hadoop/hbase/Tabl [...]
                                                       <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;pool)</pre>
 <div class="block">Returns an <a href="../../../../../org/apache/hadoop/hbase/client/AsyncTableBuilder.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncTableBuilder</code></a> for creating <a href="../../../../../org/apache/hadoop/hbase/client/AsyncTable.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncTable</code></a>.
  <p>
@@ -380,7 +401,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>getAdmin</h4>
-<pre>default&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/AsyncAdmin.html" title="interface in org.apache.hadoop.hbase.client">AsyncAdmin</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnection.html#line.119">getAdmin</a>()</pre>
+<pre>default&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/AsyncAdmin.html" title="interface in org.apache.hadoop.hbase.client">AsyncAdmin</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnection.html#line.129">getAdmin</a>()</pre>
 <div class="block">Retrieve an <a href="../../../../../org/apache/hadoop/hbase/client/AsyncAdmin.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncAdmin</code></a> implementation to administer an HBase cluster.
  <p>
  The returned instance will use default configs. Use <a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnection.html#getAdminBuilder--"><code>getAdminBuilder()</code></a> if you want to
@@ -401,7 +422,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>getAdminBuilder</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/client/AsyncAdminBuilder.html" title="interface in org.apache.hadoop.hbase.client">AsyncAdminBuilder</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnection.html#line.130">getAdminBuilder</a>()</pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/client/AsyncAdminBuilder.html" title="interface in org.apache.hadoop.hbase.client">AsyncAdminBuilder</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnection.html#line.140">getAdminBuilder</a>()</pre>
 <div class="block">Returns an <a href="../../../../../org/apache/hadoop/hbase/client/AsyncAdminBuilder.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncAdminBuilder</code></a> for creating <a href="../../../../../org/apache/hadoop/hbase/client/AsyncAdmin.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncAdmin</code></a>.
  <p>
  The admin operation's returned <code>CompletableFuture</code> will be finished directly in the rpc
@@ -415,7 +436,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>getAdmin</h4>
-<pre>default&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/AsyncAdmin.html" title="interface in org.apache.hadoop.hbase.client">AsyncAdmin</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnection.html#line.140">getAdmin</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;pool)</pre>
+<pre>default&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/AsyncAdmin.html" title="interface in org.apache.hadoop.hbase.client">AsyncAdmin</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnection.html#line.150">getAdmin</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;pool)</pre>
 <div class="block">Retrieve an <a href="../../../../../org/apache/hadoop/hbase/client/AsyncAdmin.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncAdmin</code></a> implementation to administer an HBase cluster.
  <p>
  The returned instance will use default configs. Use <a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnection.html#getAdminBuilder-java.util.concurrent.ExecutorService-"><code>getAdminBuilder(ExecutorService)</code></a>
@@ -434,7 +455,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>getAdminBuilder</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/client/AsyncAdminBuilder.html" title="interface in org.apache.hadoop.hbase.client">AsyncAdminBuilder</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnection.html#line.148">getAdminBuilder</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;pool)</pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/client/AsyncAdminBuilder.html" title="interface in org.apache.hadoop.hbase.client">AsyncAdminBuilder</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnection.html#line.158">getAdminBuilder</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;pool)</pre>
 <div class="block">Returns an <a href="../../../../../org/apache/hadoop/hbase/client/AsyncAdminBuilder.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncAdminBuilder</code></a> for creating <a href="../../../../../org/apache/hadoop/hbase/client/AsyncAdmin.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncAdmin</code></a>.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -448,7 +469,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>getBufferedMutator</h4>
-<pre>default&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/AsyncBufferedMutator.html" title="interface in org.apache.hadoop.hbase.client">AsyncBufferedMutator</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnection.html#line.158">getBufferedMutator</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
+<pre>default&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/AsyncBufferedMutator.html" title="interface in org.apache.hadoop.hbase.client">AsyncBufferedMutator</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnection.html#line.168">getBufferedMutator</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
 <div class="block">Retrieve an <a href="../../../../../org/apache/hadoop/hbase/client/AsyncBufferedMutator.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncBufferedMutator</code></a> for performing client-side buffering of writes.
  <p>
  The returned instance will use default configs. Use
@@ -467,7 +488,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>getBufferedMutatorBuilder</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/client/AsyncBufferedMutatorBuilder.html" title="interface in org.apache.hadoop.hbase.client">AsyncBufferedMutatorBuilder</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnection.html#line.166">getBufferedMutatorBuilder</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/client/AsyncBufferedMutatorBuilder.html" title="interface in org.apache.hadoop.hbase.client">AsyncBufferedMutatorBuilder</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnection.html#line.176">getBufferedMutatorBuilder</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
 <div class="block">Returns an <a href="../../../../../org/apache/hadoop/hbase/client/AsyncBufferedMutatorBuilder.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncBufferedMutatorBuilder</code></a> for creating <a href="../../../../../org/apache/hadoop/hbase/client/AsyncBufferedMutator.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncBufferedMutator</code></a>.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -481,7 +502,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>getBufferedMutator</h4>
-<pre>default&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/AsyncBufferedMutator.html" title="interface in org.apache.hadoop.hbase.client">AsyncBufferedMutator</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnection.html#line.178">getBufferedMutator</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
+<pre>default&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/AsyncBufferedMutator.html" title="interface in org.apache.hadoop.hbase.client">AsyncBufferedMutator</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnection.html#line.188">getBufferedMutator</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                                                 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;pool)</pre>
 <div class="block">Retrieve an <a href="../../../../../org/apache/hadoop/hbase/client/AsyncBufferedMutator.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncBufferedMutator</code></a> for performing client-side buffering of writes.
  <p>
@@ -503,7 +524,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>getBufferedMutatorBuilder</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/client/AsyncBufferedMutatorBuilder.html" title="interface in org.apache.hadoop.hbase.client">AsyncBufferedMutatorBuilder</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnection.html#line.187">getBufferedMutatorBuilder</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
+<pre><a href="../../../../../org/apache/hadoop/hbase/client/AsyncBufferedMutatorBuilder.html" title="interface in org.apache.hadoop.hbase.client">AsyncBufferedMutatorBuilder</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnection.html#line.197">getBufferedMutatorBuilder</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                                                       <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;pool)</pre>
 <div class="block">Returns an <a href="../../../../../org/apache/hadoop/hbase/client/AsyncBufferedMutatorBuilder.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncBufferedMutatorBuilder</code></a> for creating <a href="../../../../../org/apache/hadoop/hbase/client/AsyncBufferedMutator.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncBufferedMutator</code></a>.</div>
 <dl>
@@ -520,7 +541,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.htm
 <li class="blockList">
 <h4>getHbck</h4>
 <pre>@InterfaceAudience.LimitedPrivate(value="HBCK")
-<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/client/Hbck.html" title="interface in org.apache.hadoop.hbase.client">Hbck</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnection.html#line.200">getHbck</a>()</pre>
+<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/client/Hbck.html" title="interface in org.apache.hadoop.hbase.client">Hbck</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnection.html#line.210">getHbck</a>()</pre>
 <div class="block">Retrieve an Hbck implementation to fix an HBase cluster. The returned Hbck is not guaranteed to
  be thread-safe. A new instance should be created by each thread. This is a lightweight
  operation. Pooling or caching of the returned Hbck instance is not recommended.
@@ -541,7 +562,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.htm
 <li class="blockList">
 <h4>getHbck</h4>
 <pre>@InterfaceAudience.LimitedPrivate(value="HBCK")
-<a href="../../../../../org/apache/hadoop/hbase/client/Hbck.html" title="interface in org.apache.hadoop.hbase.client">Hbck</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnection.html#line.216">getHbck</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;masterServer)
+<a href="../../../../../org/apache/hadoop/hbase/client/Hbck.html" title="interface in org.apache.hadoop.hbase.client">Hbck</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnection.html#line.226">getHbck</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;masterServer)
                                                       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Retrieve an Hbck implementation to fix an HBase cluster. The returned Hbck is not guaranteed to
  be thread-safe. A new instance should be created by each thread. This is a lightweight
diff --git a/devapidocs/org/apache/hadoop/hbase/client/AsyncConnectionImpl.html b/devapidocs/org/apache/hadoop/hbase/client/AsyncConnectionImpl.html
index 66c8434..693ff50 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/AsyncConnectionImpl.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/AsyncConnectionImpl.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10};
 var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -249,111 +249,117 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnectio
 </tr>
 <tr id="i0" class="altColor">
 <td class="colFirst"><code>void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnectionImpl.html#close--">close</a></span>()</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnectionImpl.html#clearRegionLocationCache--">clearRegionLocationCache</a></span>()</code>
+<div class="block">Clear all the entries in the region location cache, for all the tables.</div>
+</td>
 </tr>
 <tr id="i1" class="rowColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnectionImpl.html#close--">close</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i2" class="altColor">
 <td class="colFirst"><code>private org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.AdminService.Interface</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnectionImpl.html#createAdminServerStub-org.apache.hadoop.hbase.ServerName-">createAdminServerStub</a></span>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</code>&nbsp;</td>
 </tr>
-<tr id="i2" class="altColor">
+<tr id="i3" class="rowColor">
 <td class="colFirst"><code>private org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.MasterService.Interface</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnectionImpl.html#createMasterStub-org.apache.hadoop.hbase.ServerName-">createMasterStub</a></span>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</code>&nbsp;</td>
 </tr>
-<tr id="i3" class="rowColor">
+<tr id="i4" class="altColor">
 <td class="colFirst"><code>private org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.ClientService.Interface</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnectionImpl.html#createRegionServerStub-org.apache.hadoop.hbase.ServerName-">createRegionServerStub</a></span>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</code>&nbsp;</td>
 </tr>
-<tr id="i4" class="altColor">
+<tr id="i5" class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/client/AsyncAdminBuilder.html" title="interface in org.apache.hadoop.hbase.client">AsyncAdminBuilder</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnectionImpl.html#getAdminBuilder--">getAdminBuilder</a></span>()</code>
 <div class="block">Returns an <a href="../../../../../org/apache/hadoop/hbase/client/AsyncAdminBuilder.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncAdminBuilder</code></a> for creating <a href="../../../../../org/apache/hadoop/hbase/client/AsyncAdmin.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncAdmin</code></a>.</div>
 </td>
 </tr>
-<tr id="i5" class="rowColor">
+<tr id="i6" class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/client/AsyncAdminBuilder.html" title="interface in org.apache.hadoop.hbase.client">AsyncAdminBuilder</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnectionImpl.html#getAdminBuilder-java.util.concurrent.ExecutorService-">getAdminBuilder</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;pool)</code>
 <div class="block">Returns an <a href="../../../../../org/apache/hadoop/hbase/client/AsyncAdminBuilder.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncAdminBuilder</code></a> for creating <a href="../../../../../org/apache/hadoop/hbase/client/AsyncAdmin.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncAdmin</code></a>.</div>
 </td>
 </tr>
-<tr id="i6" class="altColor">
+<tr id="i7" class="rowColor">
 <td class="colFirst"><code>(package private) org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.AdminService.Interface</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnectionImpl.html#getAdminStub-org.apache.hadoop.hbase.ServerName-">getAdminStub</a></span>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</code>&nbsp;</td>
 </tr>
-<tr id="i7" class="rowColor">
+<tr id="i8" class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/client/AsyncBufferedMutatorBuilder.html" title="interface in org.apache.hadoop.hbase.client">AsyncBufferedMutatorBuilder</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnectionImpl.html#getBufferedMutatorBuilder-org.apache.hadoop.hbase.TableName-">getBufferedMutatorBuilder</a></span>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</code>
 <div class="block">Returns an <a href="../../../../../org/apache/hadoop/hbase/client/AsyncBufferedMutatorBuilder.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncBufferedMutatorBuilder</code></a> for creating <a href="../../../../../org/apache/hadoop/hbase/client/AsyncBufferedMutator.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncBufferedMutator</code></a>.</div>
 </td>
 </tr>
-<tr id="i8" class="altColor">
+<tr id="i9" class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/client/AsyncBufferedMutatorBuilder.html" title="interface in org.apache.hadoop.hbase.client">AsyncBufferedMutatorBuilder</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnectionImpl.html#getBufferedMutatorBuilder-org.apache.hadoop.hbase.TableName-java.util.concurrent.ExecutorService-">getBufferedMutatorBuilder</a></span>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                          <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;pool)</code>
 <div class="block">Returns an <a href="../../../../../org/apache/hadoop/hbase/client/AsyncBufferedMutatorBuilder.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncBufferedMutatorBuilder</code></a> for creating <a href="../../../../../org/apache/hadoop/hbase/client/AsyncBufferedMutator.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncBufferedMutator</code></a>.</div>
 </td>
 </tr>
-<tr id="i9" class="rowColor">
+<tr id="i10" class="altColor">
 <td class="colFirst"><code>org.apache.hadoop.conf.Configuration</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnectionImpl.html#getConfiguration--">getConfiguration</a></span>()</code>
 <div class="block">Returns the <code>Configuration</code> object used by this instance.</div>
 </td>
 </tr>
-<tr id="i10" class="altColor">
+<tr id="i11" 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="../../../../../org/apache/hadoop/hbase/client/Hbck.html" title="interface in org.apache.hadoop.hbase.client">Hbck</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnectionImpl.html#getHbck--">getHbck</a></span>()</code>
 <div class="block">Retrieve an Hbck implementation to fix an HBase cluster.</div>
 </td>
 </tr>
-<tr id="i11" class="rowColor">
+<tr id="i12" class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/client/Hbck.html" title="interface in org.apache.hadoop.hbase.client">Hbck</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnectionImpl.html#getHbck-org.apache.hadoop.hbase.ServerName-">getHbck</a></span>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;masterServer)</code>
 <div class="block">Retrieve an Hbck implementation to fix an HBase cluster.</div>
 </td>
 </tr>
-<tr id="i12" class="altColor">
+<tr id="i13" class="rowColor">
 <td class="colFirst"><code>(package private) <a href="../../../../../org/apache/hadoop/hbase/client/AsyncRegionLocator.html" title="class in org.apache.hadoop.hbase.client">AsyncRegionLocator</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnectionImpl.html#getLocator--">getLocator</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i13" class="rowColor">
+<tr id="i14" class="altColor">
 <td class="colFirst"><code>(package private) <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.hadoop.hbase.shaded.protobuf.generated.MasterProtos.MasterService.Interface&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnectionImpl.html#getMasterStub--">getMasterStub</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i14" class="altColor">
+<tr id="i15" class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/client/NonceGenerator.html" title="interface in org.apache.hadoop.hbase.client">NonceGenerator</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnectionImpl.html#getNonceGenerator--">getNonceGenerator</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i15" class="rowColor">
+<tr id="i16" class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/client/AsyncTableRegionLocator.html" title="interface in org.apache.hadoop.hbase.client">AsyncTableRegionLocator</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnectionImpl.html#getRegionLocator-org.apache.hadoop.hbase.TableName-">getRegionLocator</a></span>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</code>
 <div class="block">Retrieve a AsyncRegionLocator implementation to inspect region information on a table.</div>
 </td>
 </tr>
-<tr id="i16" class="altColor">
+<tr id="i17" class="rowColor">
 <td class="colFirst"><code>(package private) org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.ClientService.Interface</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnectionImpl.html#getRegionServerStub-org.apache.hadoop.hbase.ServerName-">getRegionServerStub</a></span>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</code>&nbsp;</td>
 </tr>
-<tr id="i17" class="rowColor">
+<tr id="i18" class="altColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/ipc/HBaseRpcController.html" title="interface in org.apache.hadoop.hbase.ipc">HBaseRpcController</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnectionImpl.html#getRpcController--">getRpcController</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i18" class="altColor">
+<tr id="i19" class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/client/AsyncTableBuilder.html" title="interface in org.apache.hadoop.hbase.client">AsyncTableBuilder</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/AdvancedScanResultConsumer.html" title="interface in org.apache.hadoop.hbase.client">AdvancedScanResultConsumer</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnectionImpl.html#getTableBuilder-org.apache.hadoop.hbase.TableName-">getTableBuilder</a></span>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</code>
 <div class="block">Returns an <a href="../../../../../org/apache/hadoop/hbase/client/AsyncTableBuilder.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncTableBuilder</code></a> for creating <a href="../../../../../org/apache/hadoop/hbase/client/AsyncTable.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncTable</code></a>.</div>
 </td>
 </tr>
-<tr id="i19" class="rowColor">
+<tr id="i20" class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/client/AsyncTableBuilder.html" title="interface in org.apache.hadoop.hbase.client">AsyncTableBuilder</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/ScanResultConsumer.html" title="interface in org.apache.hadoop.hbase.client">ScanResultConsumer</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnectionImpl.html#getTableBuilder-org.apache.hadoop.hbase.TableName-java.util.concurrent.ExecutorService-">getTableBuilder</a></span>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;pool)</code>
 <div class="block">Returns an <a href="../../../../../org/apache/hadoop/hbase/client/AsyncTableBuilder.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncTableBuilder</code></a> for creating <a href="../../../../../org/apache/hadoop/hbase/client/AsyncTable.html" title="interface in org.apache.hadoop.hbase.client"><code>AsyncTable</code></a>.</div>
 </td>
 </tr>
-<tr id="i20" class="altColor">
+<tr id="i21" class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnectionImpl.html#makeMasterStub-java.util.concurrent.CompletableFuture-">makeMasterStub</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;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.MasterService.Interface [...]
 </tr>
-<tr id="i21" class="rowColor">
+<tr id="i22" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnectionImpl.html#spawnRenewalChore-org.apache.hadoop.security.UserGroupInformation-">spawnRenewalChore</a></span>(org.apache.hadoop.security.UserGroupInformation&nbsp;user)</code>&nbsp;</td>
 </tr>
@@ -907,7 +913,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnectio
 <a name="getHbck-org.apache.hadoop.hbase.ServerName-">
 <!--   -->
 </a>
-<ul class="blockListLast">
+<ul class="blockList">
 <li class="blockList">
 <h4>getHbck</h4>
 <pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Hbck.html" title="interface in org.apache.hadoop.hbase.client">Hbck</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnectionImpl.html#line.349">getHbck</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;masterServer)
@@ -934,6 +940,26 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnectio
 </dl>
 </li>
 </ul>
+<a name="clearRegionLocationCache--">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>clearRegionLocationCache</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncConnectionImpl.html#line.358">clearRegionLocationCache</a>()</pre>
+<div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnection.html#clearRegionLocationCache--">AsyncConnection</a></code></span></div>
+<div class="block">Clear all the entries in the region location cache, for all the tables.
+ <p/>
+ If you only want to clear the cache for a specific table, use
+ <a href="../../../../../org/apache/hadoop/hbase/client/AsyncTableRegionLocator.html#clearRegionLocationCache--"><code>AsyncTableRegionLocator.clearRegionLocationCache()</code></a>.
+ <p/>
+ This may cause performance issue so use it with caution.</div>
+<dl>
+<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
+<dd><code><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnection.html#clearRegionLocationCache--">clearRegionLocationCache</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/AsyncConnection.html" title="interface in org.apache.hadoop.hbase.client">AsyncConnection</a></code></dd>
+</dl>
+</li>
+</ul>
 </li>
 </ul>
 </li>
diff --git a/devapidocs/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html b/devapidocs/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html
index 22973b5..fa73648 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10};
 var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -233,25 +233,29 @@ 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>(package private) void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html#clearCache-org.apache.hadoop.hbase.TableName-">clearCache</a></span>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html#clearCache--">clearCache</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i3" class="rowColor">
+<td class="colFirst"><code>(package private) void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html#clearCache-org.apache.hadoop.hbase.TableName-">clearCache</a></span>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</code>&nbsp;</td>
+</tr>
+<tr id="i4" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html#complete-org.apache.hadoop.hbase.TableName-org.apache.hadoop.hbase.client.AsyncNonMetaRegionLocator.LocateRequest-org.apache.hadoop.hbase.RegionLocations-java.lang.Throwable-">complete</a></span>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
         <a href="../../../../../org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.LocateRequest.html" title="class in org.apache.hadoop.hbase.client">AsyncNonMetaRegionLocator.LocateRequest</a>&nbsp;req,
         <a href="../../../../../org/apache/hadoop/hbase/RegionLocations.html" title="class in org.apache.hadoop.hbase">RegionLocations</a>&nbsp;locs,
         <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a>&nbsp;error)</code>&nbsp;</td>
 </tr>
-<tr id="i4" class="altColor">
+<tr id="i5" class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html#getCachedLocation-org.apache.hadoop.hbase.HRegionLocation-">getCachedLocation</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a>&nbsp;loc)</code>&nbsp;</td>
 </tr>
-<tr id="i5" class="rowColor">
+<tr id="i6" class="altColor">
 <td class="colFirst"><code>(package private) <a href="../../../../../org/apache/hadoop/hbase/RegionLocations.html" title="class in org.apache.hadoop.hbase">RegionLocations</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html#getRegionLocationInCache-org.apache.hadoop.hbase.TableName-byte:A-">getRegionLocationInCache</a></span>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                         byte[]&nbsp;row)</code>&nbsp;</td>
 </tr>
-<tr id="i6" class="altColor">
+<tr id="i7" class="rowColor">
 <td class="colFirst"><code>(package private) <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;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html#getRegionLocations-org.apache.hadoop.hbase.TableName-byte:A-int-org.apache.hadoop.hbase.client.RegionLocateType-boolean-">getRegionLocations</a></span>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                   byte[]&nbsp;row,
@@ -259,7 +263,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
                   <a href="../../../../../org/apache/hadoop/hbase/client/RegionLocateType.html" title="enum in org.apache.hadoop.hbase.client">RegionLocateType</a>&nbsp;locateType,
                   boolean&nbsp;reload)</code>&nbsp;</td>
 </tr>
-<tr id="i7" class="rowColor">
+<tr id="i8" class="altColor">
 <td class="colFirst"><code>private <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;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html#getRegionLocationsInternal-org.apache.hadoop.hbase.TableName-byte:A-int-org.apache.hadoop.hbase.client.RegionLocateType-boolean-">getRegionLocationsInternal</a></span>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                           byte[]&nbsp;row,
@@ -267,16 +271,16 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
                           <a href="../../../../../org/apache/hadoop/hbase/client/RegionLocateType.html" title="enum in org.apache.hadoop.hbase.client">RegionLocateType</a>&nbsp;locateType,
                           boolean&nbsp;reload)</code>&nbsp;</td>
 </tr>
-<tr id="i8" class="altColor">
+<tr id="i9" class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.TableCache.html" title="class in org.apache.hadoop.hbase.client">AsyncNonMetaRegionLocator.TableCache</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html#getTableCache-org.apache.hadoop.hbase.TableName-">getTableCache</a></span>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</code>&nbsp;</td>
 </tr>
-<tr id="i9" class="rowColor">
+<tr id="i10" class="altColor">
 <td class="colFirst"><code>private boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html#isEqual-org.apache.hadoop.hbase.RegionLocations-org.apache.hadoop.hbase.RegionLocations-">isEqual</a></span>(<a href="../../../../../org/apache/hadoop/hbase/RegionLocations.html" title="class in org.apache.hadoop.hbase">RegionLocations</a>&nbsp;locs1,
        <a href="../../../../../org/apache/hadoop/hbase/RegionLocations.html" title="class in org.apache.hadoop.hbase">RegionLocations</a>&nbsp;locs2)</code>&nbsp;</td>
 </tr>
-<tr id="i10" class="altColor">
+<tr id="i11" class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/RegionLocations.html" title="class in org.apache.hadoop.hbase">RegionLocations</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html#locateInCache-org.apache.hadoop.hbase.client.AsyncNonMetaRegionLocator.TableCache-org.apache.hadoop.hbase.TableName-byte:A-int-org.apache.hadoop.hbase.client.RegionLocateType-">locateInCache</a></span>(<a href="../../../../../org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.TableCache.html" title="class in org.apache.hadoop.hbase.client">Asy [...]
              <a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
@@ -284,36 +288,36 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
              int&nbsp;replicaId,
              <a href="../../../../../org/apache/hadoop/hbase/client/RegionLocateType.html" title="enum in org.apache.hadoop.hbase.client">RegionLocateType</a>&nbsp;locateType)</code>&nbsp;</td>
 </tr>
-<tr id="i11" class="rowColor">
+<tr id="i12" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html#locateInMeta-org.apache.hadoop.hbase.TableName-org.apache.hadoop.hbase.client.AsyncNonMetaRegionLocator.LocateRequest-">locateInMeta</a></span>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
             <a href="../../../../../org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.LocateRequest.html" title="class in org.apache.hadoop.hbase.client">AsyncNonMetaRegionLocator.LocateRequest</a>&nbsp;req)</code>&nbsp;</td>
 </tr>
-<tr id="i12" class="altColor">
+<tr id="i13" class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/RegionLocations.html" title="class in org.apache.hadoop.hbase">RegionLocations</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html#locateRowBeforeInCache-org.apache.hadoop.hbase.client.AsyncNonMetaRegionLocator.TableCache-org.apache.hadoop.hbase.TableName-byte:A-int-">locateRowBeforeInCache</a></span>(<a href="../../../../../org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.TableCache.html" title="class in org.apache.hadoop.hbase.client">AsyncNonMetaRegionLocator.TableCa [...]
                       <a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                       byte[]&nbsp;row,
                       int&nbsp;replicaId)</code>&nbsp;</td>
 </tr>
-<tr id="i13" class="rowColor">
+<tr id="i14" class="altColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/RegionLocations.html" title="class in org.apache.hadoop.hbase">RegionLocations</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html#locateRowInCache-org.apache.hadoop.hbase.client.AsyncNonMetaRegionLocator.TableCache-org.apache.hadoop.hbase.TableName-byte:A-int-">locateRowInCache</a></span>(<a href="../../../../../org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.TableCache.html" title="class in org.apache.hadoop.hbase.client">AsyncNonMetaRegionLocator.TableCache</a>&nbsp [...]
                 <a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                 byte[]&nbsp;row,
                 int&nbsp;replicaId)</code>&nbsp;</td>
 </tr>
-<tr id="i14" class="altColor">
+<tr id="i15" class="rowColor">
 <td class="colFirst"><code>private boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html#onScanNext-org.apache.hadoop.hbase.TableName-org.apache.hadoop.hbase.client.AsyncNonMetaRegionLocator.LocateRequest-org.apache.hadoop.hbase.client.Result-">onScanNext</a></span>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
           <a href="../../../../../org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.LocateRequest.html" title="class in org.apache.hadoop.hbase.client">AsyncNonMetaRegionLocator.LocateRequest</a>&nbsp;req,
           <a href="../../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;result)</code>&nbsp;</td>
 </tr>
-<tr id="i15" class="rowColor">
+<tr id="i16" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html#removeLocationFromCache-org.apache.hadoop.hbase.HRegionLocation-">removeLocationFromCache</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a>&nbsp;loc)</code>&nbsp;</td>
 </tr>
-<tr id="i16" class="altColor">
+<tr id="i17" class="rowColor">
 <td class="colFirst"><code>(package private) void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html#updateCachedLocationOnError-org.apache.hadoop.hbase.HRegionLocation-java.lang.Throwable-">updateCachedLocationOnError</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a>&nbsp;loc,
                            <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a>&nbsp;exception)</code>&nbsp;</td>
@@ -629,13 +633,22 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html#line.559">clearCache</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
 </li>
 </ul>
+<a name="clearCache--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>clearCache</h4>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html#line.572">clearCache</a>()</pre>
+</li>
+</ul>
 <a name="getRegionLocationInCache-org.apache.hadoop.hbase.TableName-byte:A-">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getRegionLocationInCache</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/RegionLocations.html" title="class in org.apache.hadoop.hbase">RegionLocations</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html#line.574">getRegionLocationInCache</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
+<pre><a href="../../../../../org/apache/hadoop/hbase/RegionLocations.html" title="class in org.apache.hadoop.hbase">RegionLocations</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html#line.578">getRegionLocationInCache</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                                          byte[]&nbsp;row)</pre>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/client/AsyncRegionLocator.html b/devapidocs/org/apache/hadoop/hbase/client/AsyncRegionLocator.html
index 3c994cc..4a8c0ee 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/AsyncRegionLocator.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/AsyncRegionLocator.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10};
 var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -182,9 +182,13 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </tr>
 <tr id="i0" class="altColor">
 <td class="colFirst"><code>(package private) void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncRegionLocator.html#clearCache-org.apache.hadoop.hbase.TableName-">clearCache</a></span>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncRegionLocator.html#clearCache--">clearCache</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i1" class="rowColor">
+<td class="colFirst"><code>(package private) void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncRegionLocator.html#clearCache-org.apache.hadoop.hbase.TableName-">clearCache</a></span>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</code>&nbsp;</td>
+</tr>
+<tr id="i2" class="altColor">
 <td class="colFirst"><code>(package private) <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/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncRegionLocator.html#getRegionLocation-org.apache.hadoop.hbase.TableName-byte:A-int-org.apache.hadoop.hbase.client.RegionLocateType-boolean-long-">getRegionLocation</a></span>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                  byte[]&nbsp;row,
@@ -193,7 +197,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
                  boolean&nbsp;reload,
                  long&nbsp;timeoutNs)</code>&nbsp;</td>
 </tr>
-<tr id="i2" class="altColor">
+<tr id="i3" class="rowColor">
 <td class="colFirst"><code>(package private) <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/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncRegionLocator.html#getRegionLocation-org.apache.hadoop.hbase.TableName-byte:A-int-org.apache.hadoop.hbase.client.RegionLocateType-long-">getRegionLocation</a></span>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                  byte[]&nbsp;row,
@@ -201,7 +205,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
                  <a href="../../../../../org/apache/hadoop/hbase/client/RegionLocateType.html" title="enum in org.apache.hadoop.hbase.client">RegionLocateType</a>&nbsp;type,
                  long&nbsp;timeoutNs)</code>&nbsp;</td>
 </tr>
-<tr id="i3" class="rowColor">
+<tr id="i4" class="altColor">
 <td class="colFirst"><code>(package private) <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/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncRegionLocator.html#getRegionLocation-org.apache.hadoop.hbase.TableName-byte:A-org.apache.hadoop.hbase.client.RegionLocateType-boolean-long-">getRegionLocation</a></span>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                  byte[]&nbsp;row,
@@ -209,14 +213,14 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
                  boolean&nbsp;reload,
                  long&nbsp;timeoutNs)</code>&nbsp;</td>
 </tr>
-<tr id="i4" class="altColor">
+<tr id="i5" class="rowColor">
 <td class="colFirst"><code>(package private) <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/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncRegionLocator.html#getRegionLocation-org.apache.hadoop.hbase.TableName-byte:A-org.apache.hadoop.hbase.client.RegionLocateType-long-">getRegionLocation</a></span>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                  byte[]&nbsp;row,
                  <a href="../../../../../org/apache/hadoop/hbase/client/RegionLocateType.html" title="enum in org.apache.hadoop.hbase.client">RegionLocateType</a>&nbsp;type,
                  long&nbsp;timeoutNs)</code>&nbsp;</td>
 </tr>
-<tr id="i5" class="rowColor">
+<tr id="i6" class="altColor">
 <td class="colFirst"><code>(package private) <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;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncRegionLocator.html#getRegionLocations-org.apache.hadoop.hbase.TableName-byte:A-org.apache.hadoop.hbase.client.RegionLocateType-boolean-long-">getRegionLocations</a></span>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                   byte[]&nbsp;row,
@@ -224,16 +228,16 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
                   boolean&nbsp;reload,
                   long&nbsp;timeoutNs)</code>&nbsp;</td>
 </tr>
-<tr id="i6" class="altColor">
+<tr id="i7" class="rowColor">
 <td class="colFirst"><code>private boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncRegionLocator.html#isMeta-org.apache.hadoop.hbase.TableName-">isMeta</a></span>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</code>&nbsp;</td>
 </tr>
-<tr id="i7" class="rowColor">
+<tr id="i8" class="altColor">
 <td class="colFirst"><code>(package private) void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncRegionLocator.html#updateCachedLocationOnError-org.apache.hadoop.hbase.HRegionLocation-java.lang.Throwable-">updateCachedLocationOnError</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a>&nbsp;loc,
                            <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a>&nbsp;exception)</code>&nbsp;</td>
 </tr>
-<tr id="i8" class="altColor">
+<tr id="i9" class="rowColor">
 <td class="colFirst"><code>private &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;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/AsyncRegionLocator.html#withTimeout-java.util.concurrent.CompletableFuture-long-java.util.function.Supplier-">withTimeout</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;T&gt;&nbsp;future,
            long&nbsp;timeoutNs,
@@ -421,12 +425,21 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <a name="clearCache-org.apache.hadoop.hbase.TableName-">
 <!--   -->
 </a>
-<ul class="blockListLast">
+<ul class="blockList">
 <li class="blockList">
 <h4>clearCache</h4>
 <pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncRegionLocator.html#line.152">clearCache</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
 </li>
 </ul>
+<a name="clearCache--">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>clearCache</h4>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncRegionLocator.html#line.163">clearCache</a>()</pre>
+</li>
+</ul>
 </li>
 </ul>
 </li>
diff --git a/devapidocs/org/apache/hadoop/hbase/client/package-tree.html b/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
index 09abeff..bfbdf02 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
@@ -550,23 +550,23 @@
 <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/RegionLocateType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">RegionLocateType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/IsolationLevel.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">IsolationLevel</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/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/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/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/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/CompactType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CompactType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/TableState.State.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">TableState.State</span></a></li>
 <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/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/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/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/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/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/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/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/TableState.State.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">TableState.State</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/CompactionState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CompactionState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/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/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/IsolationLevel.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">IsolationLevel</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncScanSingleRegionRpcRetryingCaller.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/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/Consistency.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Consistency</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/RegionLocateType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">RegionLocateType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/RequestController.ReturnCode.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">RequestController.ReturnCode</span></a></li>
 </ul>
 </li>
diff --git a/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html b/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
index d8b2642..9b88821 100644
--- a/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
@@ -183,14 +183,14 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.Order.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FuzzyRowFilter.Order</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/BitComparator.BitwiseOp.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">BitComparator.BitwiseOp</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/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/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/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/FuzzyRowFilter.Order.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FuzzyRowFilter.Order</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/RegexStringComparator.EngineType.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">RegexStringComparator.EngineType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/Filter.ReturnCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">Filter.ReturnCode</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.SatisfiesCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FuzzyRowFilter.SatisfiesCode</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/CompareFilter.CompareOp.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">CompareFilter.CompareOp</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/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/BitComparator.BitwiseOp.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">BitComparator.BitwiseOp</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html b/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
index ea6baf0..fc5308c 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
@@ -276,10 +276,10 @@
 <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/BlockPriority.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockPriority</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.MemoryType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">Cacheable.MemoryType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.Writer.State.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">HFileBlock.Writer.State</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/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/Cacheable.MemoryType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">Cacheable.MemoryType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.BlockCategory.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockType.BlockCategory</span></a></li>
 </ul>
 </li>
diff --git a/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html b/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
index cb4ea86..d288952 100644
--- a/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
@@ -353,8 +353,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.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/BufferCallBeforeInitHandler.BufferCallAction.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">BufferCallBeforeInitHandler.BufferCallAction</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/CallEvent.Type.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">CallEvent.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/BufferCallBeforeInitHandler.BufferCallAction.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">BufferCallBeforeInitHandler.BufferCallAction</span></a></li>
 <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>
 </ul>
 </li>
diff --git a/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html b/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
index d36fb48..d522d9d 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/CellCounter.CellCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">CellCounter.CellCounterMapper.Counters</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/SyncTable.SyncMapper.Counter.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">SyncTable.SyncMapper.Counter</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableSplit.Version.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">TableSplit.Version</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/RowCounter.RowCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">RowCounter.RowCounterMapper.Counters</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/SyncTable.SyncMapper.Counter.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">SyncTable.SyncMapper.Counter</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/MetricsAssignmentManagerSourceImpl.html b/devapidocs/org/apache/hadoop/hbase/master/MetricsAssignmentManagerSourceImpl.html
index 2ad3ff7..ce31c6a 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/MetricsAssignmentManagerSourceImpl.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/MetricsAssignmentManagerSourceImpl.html
@@ -277,7 +277,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MetricsAssignm
 </tr>
 <tr id="i8" class="altColor">
 <td class="colFirst"><code>void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/MetricsAssignmentManagerSourceImpl.html#setRITOldestAge-long-">setRITOldestAge</a></span>(long&nbsp;ritCount)</code>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/MetricsAssignmentManagerSourceImpl.html#setRITOldestAge-long-">setRITOldestAge</a></span>(long&nbsp;ritOldestAge)</code>
 <div class="block">Set the oldest region in transition.</div>
 </td>
 </tr>
@@ -496,14 +496,14 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MetricsAssignm
 <ul class="blockList">
 <li class="blockList">
 <h4>setRITOldestAge</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MetricsAssignmentManagerSourceImpl.html#line.85">setRITOldestAge</a>(long&nbsp;ritCount)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/MetricsAssignmentManagerSourceImpl.html#line.85">setRITOldestAge</a>(long&nbsp;ritOldestAge)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/master/MetricsAssignmentManagerSource.html#setRITOldestAge-long-">MetricsAssignmentManagerSource</a></code></span></div>
 <div class="block">Set the oldest region in transition.</div>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/master/MetricsAssignmentManagerSource.html#setRITOldestAge-long-">setRITOldestAge</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/master/MetricsAssignmentManagerSource.html" title="interface in org.apache.hadoop.hbase.master">MetricsAssignmentManagerSource</a></code></dd>
 <dt><span class="paramLabel">Parameters:</span></dt>
-<dd><code>ritCount</code> - age of the oldest RIT.</dd>
+<dd><code>ritOldestAge</code> - age of the oldest RIT.</dd>
 </dl>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html b/devapidocs/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html
index d2064bb..7336d55 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html
@@ -1147,7 +1147,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>STATES_EXPECTED_ON_OPEN</h4>
-<pre>private static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master">RegionState.State</a>[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1447">STATES_EXPECTED_ON_OPEN</a></pre>
+<pre>private static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master">RegionState.State</a>[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1453">STATES_EXPECTED_ON_OPEN</a></pre>
 </li>
 </ul>
 <a name="STATES_EXPECTED_ON_CLOSING">
@@ -1156,7 +1156,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>STATES_EXPECTED_ON_CLOSING</h4>
-<pre>private static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master">RegionState.State</a>[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1452">STATES_EXPECTED_ON_CLOSING</a></pre>
+<pre>private static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master">RegionState.State</a>[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1458">STATES_EXPECTED_ON_CLOSING</a></pre>
 </li>
 </ul>
 <a name="STATES_EXPECTED_ON_CLOSED">
@@ -1165,7 +1165,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>STATES_EXPECTED_ON_CLOSED</h4>
-<pre>private static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master">RegionState.State</a>[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1459">STATES_EXPECTED_ON_CLOSED</a></pre>
+<pre>private static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master">RegionState.State</a>[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1465">STATES_EXPECTED_ON_CLOSED</a></pre>
 </li>
 </ul>
 <a name="STATES_EXPECTED_ON_ASSIGN">
@@ -1174,7 +1174,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>STATES_EXPECTED_ON_ASSIGN</h4>
-<pre>private static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master">RegionState.State</a>[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1466">STATES_EXPECTED_ON_ASSIGN</a></pre>
+<pre>private static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master">RegionState.State</a>[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1472">STATES_EXPECTED_ON_ASSIGN</a></pre>
 </li>
 </ul>
 <a name="STATES_EXPECTED_ON_UNASSIGN_OR_MOVE">
@@ -1183,7 +1183,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>STATES_EXPECTED_ON_UNASSIGN_OR_MOVE</h4>
-<pre>private static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master">RegionState.State</a>[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1469">STATES_EXPECTED_ON_UNASSIGN_OR_MOVE</a></pre>
+<pre>private static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master">RegionState.State</a>[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1475">STATES_EXPECTED_ON_UNASSIGN_OR_MOVE</a></pre>
 </li>
 </ul>
 <a name="pendingAssignQueue">
@@ -1192,7 +1192,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>pendingAssignQueue</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html?is-external=true" title="class or interface in java.util">ArrayList</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1644">pendingAssignQueue</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html?is-external=true" title="class or interface in java.util">ArrayList</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1650">pendingAssignQueue</a></pre>
 </li>
 </ul>
 <a name="assignQueueLock">
@@ -1201,7 +1201,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>assignQueueLock</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/ReentrantLock.html?is-external=true" title="class or interface in java.util.concurrent.locks">ReentrantLock</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1645">assignQueueLock</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/ReentrantLock.html?is-external=true" title="class or interface in java.util.concurrent.locks">ReentrantLock</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1651">assignQueueLock</a></pre>
 </li>
 </ul>
 <a name="assignQueueFullCond">
@@ -1210,7 +1210,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>assignQueueFullCond</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/Condition.html?is-external=true" title="class or interface in java.util.concurrent.locks">Condition</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1646">assignQueueFullCond</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/Condition.html?is-external=true" title="class or interface in java.util.concurrent.locks">Condition</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1652">assignQueueFullCond</a></pre>
 </li>
 </ul>
 </li>
@@ -2028,7 +2028,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>updateRegionsInTransitionMetrics</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1213">updateRegionsInTransitionMetrics</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html" title="class in org.apache.hadoop.hbase.master.assignment">AssignmentManager.RegionInTransitionStat</a>&nbsp;ritStat)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1219">updateRegionsInTransitionMetrics</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html" title="class in org.apache.hadoop.hbase.master.assignment">AssignmentManager.RegionInTransitionStat</a>&nbsp;ritStat)</pre>
 </li>
 </ul>
 <a name="handleRegionOverStuckWarningThreshold-org.apache.hadoop.hbase.client.RegionInfo-">
@@ -2037,7 +2037,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>handleRegionOverStuckWarningThreshold</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1219">handleRegionOverStuckWarningThreshold</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1225">handleRegionOverStuckWarningThreshold</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</pre>
 </li>
 </ul>
 <a name="joinCluster--">
@@ -2046,7 +2046,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>joinCluster</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1228">joinCluster</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1234">joinCluster</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>
@@ -2060,7 +2060,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>processOfflineRegions</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1262">processOfflineRegions</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1268">processOfflineRegions</a>()</pre>
 <div class="block">Create assign procedure for offline regions.
  Just follow the old processofflineServersWithOnlineRegions method. Since now we do not need to
  deal with dead server any more, we only deal with the regions in OFFLINE state in this method.
@@ -2076,7 +2076,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>loadMeta</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1272">loadMeta</a>()
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1278">loadMeta</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>
@@ -2090,7 +2090,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>checkMetaLoaded</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1326">checkMetaLoaded</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;hri)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1332">checkMetaLoaded</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;hri)
                       throws <a href="../../../../../../org/apache/hadoop/hbase/PleaseHoldException.html" title="class in org.apache.hadoop.hbase">PleaseHoldException</a></pre>
 <div class="block">Used to check if the meta loading is done.
  <p/>
@@ -2109,7 +2109,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getNumRegionsOpened</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1341">getNumRegionsOpened</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1347">getNumRegionsOpened</a>()</pre>
 </li>
 </ul>
 <a name="submitServerCrash-org.apache.hadoop.hbase.ServerName-boolean-">
@@ -2118,7 +2118,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>submitServerCrash</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1346">submitServerCrash</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1352">submitServerCrash</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
                               boolean&nbsp;shouldSplitWal)</pre>
 </li>
 </ul>
@@ -2128,7 +2128,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>offlineRegion</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1382">offlineRegion</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1388">offlineRegion</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</pre>
 </li>
 </ul>
 <a name="onlineRegion-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.ServerName-">
@@ -2137,7 +2137,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>onlineRegion</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1390">onlineRegion</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1396">onlineRegion</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
                          <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</pre>
 </li>
 </ul>
@@ -2147,7 +2147,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getSnapShotOfAssignment</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.ht [...]
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.ht [...]
 </li>
 </ul>
 <a name="getReopenStatus-org.apache.hadoop.hbase.TableName-">
@@ -2156,7 +2156,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getReopenStatus</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</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>,<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 [...]
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</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>,<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 [...]
 <div class="block">Used by the client (via master) to identify if all regions have the schema updates</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -2174,7 +2174,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>hasRegionsInTransition</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1425">hasRegionsInTransition</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1431">hasRegionsInTransition</a>()</pre>
 </li>
 </ul>
 <a name="getRegionsInTransition--">
@@ -2183,7 +2183,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionsInTransition</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1429">getRegionsInTransition</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1435">getRegionsInTransition</a>()</pre>
 </li>
 </ul>
 <a name="getAssignedRegions--">
@@ -2192,7 +2192,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getAssignedRegions</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1433">getAssignedRegions</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1439">getAssignedRegions</a>()</pre>
 </li>
 </ul>
 <a name="getRegionInfo-byte:A-">
@@ -2201,7 +2201,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionInfo</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1437">getRegionInfo</a>(byte[]&nbsp;regionName)</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1443">getRegionInfo</a>(byte[]&nbsp;regionName)</pre>
 </li>
 </ul>
 <a name="transitStateAndUpdate-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.master.RegionState.State-org.apache.hadoop.hbase.master.RegionState.State...-">
@@ -2210,7 +2210,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>transitStateAndUpdate</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1475">transitStateAndUpdate</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1481">transitStateAndUpdate</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
                                    <a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master">RegionState.State</a>&nbsp;newState,
                                    <a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master">RegionState.State</a>...&nbsp;expectedStates)
                             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>
@@ -2226,7 +2226,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>regionOpening</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1492">regionOpening</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode)
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1498">regionOpening</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode)
             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>
@@ -2240,7 +2240,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>regionFailedOpen</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1505">regionFailedOpen</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1511">regionFailedOpen</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
                       boolean&nbsp;giveUp)
                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>
@@ -2255,7 +2255,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>regionOpened</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1529">regionOpened</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode)
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1535">regionOpened</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode)
            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>
@@ -2269,7 +2269,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>regionClosing</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1546">regionClosing</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode)
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1552">regionClosing</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode)
             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>
@@ -2283,7 +2283,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>regionClosed</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1562">regionClosed</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1568">regionClosed</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
                   boolean&nbsp;normally)
            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>
@@ -2298,7 +2298,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>markRegionAsSplit</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1589">markRegionAsSplit</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;parent,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1595">markRegionAsSplit</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;parent,
                               <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
                               <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;daughterA,
                               <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;daughterB)
@@ -2315,7 +2315,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>markRegionAsMerged</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1619">markRegionAsMerged</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;child,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1625">markRegionAsMerged</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;child,
                                <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
                                <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;mother,
                                <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;father)
@@ -2338,7 +2338,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>shouldAssignFavoredNodes</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1636">shouldAssignFavoredNodes</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region)</pre>
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1642">shouldAssignFavoredNodes</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region)</pre>
 </li>
 </ul>
 <a name="queueAssign-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">
@@ -2347,7 +2347,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>queueAssign</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1653">queueAssign</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode)</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1659">queueAssign</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode)</pre>
 <div class="block">Add the assign operation to the assignment queue.
  The pending assignment operation will be processed,
  and each region will be assigned by a server using the balancer.</div>
@@ -2359,7 +2359,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>startAssignmentThread</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1670">startAssignmentThread</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1676">startAssignmentThread</a>()</pre>
 </li>
 </ul>
 <a name="stopAssignmentThread--">
@@ -2368,7 +2368,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>stopAssignmentThread</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1688">stopAssignmentThread</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1694">stopAssignmentThread</a>()</pre>
 </li>
 </ul>
 <a name="assignQueueSignal--">
@@ -2377,7 +2377,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>assignQueueSignal</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1701">assignQueueSignal</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1707">assignQueueSignal</a>()</pre>
 </li>
 </ul>
 <a name="waitOnAssignQueue--">
@@ -2386,7 +2386,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>waitOnAssignQueue</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html?is-external=true" title="class or interface in java.util">HashMap</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&gt;&nbsp;<a hre [...]
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html?is-external=true" title="class or interface in java.util">HashMap</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&gt;&nbsp;<a hre [...]
 </li>
 </ul>
 <a name="processAssignQueue--">
@@ -2395,7 +2395,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>processAssignQueue</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1736">processAssignQueue</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1742">processAssignQueue</a>()</pre>
 </li>
 </ul>
 <a name="processAssignmentPlans-java.util.HashMap-java.util.HashMap-java.util.List-java.util.List-">
@@ -2404,7 +2404,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>processAssignmentPlans</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1798">processAssignmentPlans</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html?is-external=true" title="class or interface in java.util">HashMap</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../../../org/apach [...]
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1804">processAssignmentPlans</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html?is-external=true" title="class or interface in java.util">HashMap</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../../../org/apach [...]
                                     <a href="https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html?is-external=true" title="class or interface in java.util">HashMap</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;retainMap,
                                     <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;hris,
                                     <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</pre>
@@ -2416,7 +2416,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>acceptPlan</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1836">acceptPlan</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html?is-external=true" title="class or interface in java.util">HashMap</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../../../org/apache/hadoop/hba [...]
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1842">acceptPlan</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html?is-external=true" title="class or interface in java.util">HashMap</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../../../org/apache/hadoop/hba [...]
                         <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/Region [...]
                  throws <a href="../../../../../../org/apache/hadoop/hbase/HBaseIOException.html" title="class in org.apache.hadoop.hbase">HBaseIOException</a></pre>
 <dl>
@@ -2431,7 +2431,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>addToPendingAssignment</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1865">addToPendingAssignment</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html?is-external=true" title="class or interface in java.util">HashMap</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../../../org/apach [...]
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1871">addToPendingAssignment</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html?is-external=true" title="class or interface in java.util">HashMap</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../../../org/apach [...]
                                     <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;pendingRegions)</pre>
 </li>
 </ul>
@@ -2441,7 +2441,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getExcludedServersForSystemTable</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../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/master/assignment/AssignmentManager.html#line.1881">getExcludedServersForSystemTable</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../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/master/assignment/AssignmentManager.html#line.1887">getExcludedServersForSystemTable</a>()</pre>
 <div class="block">Get a list of servers that this region cannot be assigned to.
  For system tables, we must assign them to a server with highest version.</div>
 </li>
@@ -2452,7 +2452,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getMaster</h4>
-<pre><a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1901">getMaster</a>()</pre>
+<pre><a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1907">getMaster</a>()</pre>
 </li>
 </ul>
 </li>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/assignment/RegionStateNode.html b/devapidocs/org/apache/hadoop/hbase/master/assignment/RegionStateNode.html
index e73f066..27496b7 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/assignment/RegionStateNode.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/assignment/RegionStateNode.html
@@ -644,7 +644,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>setLastHost</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStateNode.html#line.175">setLastHost</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStateNode.html#line.179">setLastHost</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</pre>
 </li>
 </ul>
 <a name="setOpenSeqNum-long-">
@@ -653,7 +653,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>setOpenSeqNum</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStateNode.html#line.179">setOpenSeqNum</a>(long&nbsp;seqId)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStateNode.html#line.183">setOpenSeqNum</a>(long&nbsp;seqId)</pre>
 </li>
 </ul>
 <a name="setRegionLocation-org.apache.hadoop.hbase.ServerName-">
@@ -662,7 +662,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>setRegionLocation</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStateNode.html#line.183">setRegionLocation</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStateNode.html#line.187">setRegionLocation</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</pre>
 </li>
 </ul>
 <a name="setProcedure-org.apache.hadoop.hbase.master.assignment.TransitRegionStateProcedure-">
@@ -671,7 +671,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>setProcedure</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStateNode.html#line.193">setProcedure</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a>&nbsp;proc)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStateNode.html#line.197">setProcedure</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a>&nbsp;proc)</pre>
 </li>
 </ul>
 <a name="unsetProcedure-org.apache.hadoop.hbase.master.assignment.TransitRegionStateProcedure-">
@@ -680,7 +680,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>unsetProcedure</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStateNode.html#line.199">unsetProcedure</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a>&nbsp;proc)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStateNode.html#line.203">unsetProcedure</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a>&nbsp;proc)</pre>
 </li>
 </ul>
 <a name="getProcedure--">
@@ -689,7 +689,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>getProcedure</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStateNode.html#line.205">getProcedure</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStateNode.html#line.209">getProcedure</a>()</pre>
 </li>
 </ul>
 <a name="getProcedureEvent--">
@@ -698,7 +698,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>getProcedureEvent</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureEvent.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureEvent</a>&lt;?&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStateNode.html#line.209">getProcedureEvent</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureEvent.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureEvent</a>&lt;?&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStateNode.html#line.213">getProcedureEvent</a>()</pre>
 </li>
 </ul>
 <a name="getRegionInfo--">
@@ -707,7 +707,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionInfo</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStateNode.html#line.213">getRegionInfo</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStateNode.html#line.217">getRegionInfo</a>()</pre>
 </li>
 </ul>
 <a name="getTable--">
@@ -716,7 +716,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>getTable</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStateNode.html#line.217">getTable</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStateNode.html#line.221">getTable</a>()</pre>
 </li>
 </ul>
 <a name="isSystemTable--">
@@ -725,7 +725,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>isSystemTable</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStateNode.html#line.221">isSystemTable</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStateNode.html#line.225">isSystemTable</a>()</pre>
 </li>
 </ul>
 <a name="getLastHost--">
@@ -734,7 +734,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>getLastHost</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStateNode.html#line.225">getLastHost</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStateNode.html#line.229">getLastHost</a>()</pre>
 </li>
 </ul>
 <a name="getRegionLocation--">
@@ -743,7 +743,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionLocation</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStateNode.html#line.229">getRegionLocation</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStateNode.html#line.233">getRegionLocation</a>()</pre>
 </li>
 </ul>
 <a name="getState--">
@@ -752,7 +752,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>getState</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master">RegionState.State</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStateNode.html#line.233">getState</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master">RegionState.State</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStateNode.html#line.237">getState</a>()</pre>
 </li>
 </ul>
 <a name="getOpenSeqNum--">
@@ -761,7 +761,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>getOpenSeqNum</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStateNode.html#line.237">getOpenSeqNum</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStateNode.html#line.241">getOpenSeqNum</a>()</pre>
 </li>
 </ul>
 <a name="getFormatVersion--">
@@ -770,7 +770,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>getFormatVersion</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStateNode.html#line.241">getFormatVersion</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStateNode.html#line.245">getFormatVersion</a>()</pre>
 </li>
 </ul>
 <a name="toRegionState--">
@@ -779,7 +779,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>toRegionState</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.html" title="class in org.apache.hadoop.hbase.master">RegionState</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStateNode.html#line.247">toRegionState</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.html" title="class in org.apache.hadoop.hbase.master">RegionState</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStateNode.html#line.251">toRegionState</a>()</pre>
 </li>
 </ul>
 <a name="compareTo-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">
@@ -788,7 +788,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>compareTo</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStateNode.html#line.252">compareTo</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;other)</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStateNode.html#line.256">compareTo</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;other)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true#compareTo-T-" title="class or interface in java.lang">compareTo</a></code>&nbsp;in interface&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase. [...]
@@ -801,7 +801,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>hashCode</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStateNode.html#line.259">hashCode</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStateNode.html#line.263">hashCode</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#hashCode--" title="class or interface in java.lang">hashCode</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
@@ -814,7 +814,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>equals</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStateNode.html#line.264">equals</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&nbsp;other)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStateNode.html#line.268">equals</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&nbsp;other)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#equals-java.lang.Object-" title="class or interface in java.lang">equals</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
@@ -827,7 +827,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>toString</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStateNode.html#line.275">toString</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStateNode.html#line.279">toString</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#toString--" title="class or interface in java.lang">toString</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
@@ -840,7 +840,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>toShortString</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/master/assignment/RegionStateNode.html#line.279">toShortString</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/master/assignment/RegionStateNode.html#line.283">toShortString</a>()</pre>
 </li>
 </ul>
 <a name="toDescriptiveString--">
@@ -849,7 +849,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>toDescriptiveString</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/master/assignment/RegionStateNode.html#line.284">toDescriptiveString</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/master/assignment/RegionStateNode.html#line.288">toDescriptiveString</a>()</pre>
 </li>
 </ul>
 <a name="checkOnline--">
@@ -858,7 +858,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>checkOnline</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStateNode.html#line.289">checkOnline</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStateNode.html#line.293">checkOnline</a>()
                  throws <a href="../../../../../../org/apache/hadoop/hbase/client/DoNotRetryRegionException.html" title="class in org.apache.hadoop.hbase.client">DoNotRetryRegionException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -872,7 +872,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>lock</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStateNode.html#line.308">lock</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStateNode.html#line.312">lock</a>()</pre>
 </li>
 </ul>
 <a name="unlock--">
@@ -881,7 +881,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockListLast">
 <li class="blockList">
 <h4>unlock</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStateNode.html#line.312">unlock</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStateNode.html#line.316">unlock</a>()</pre>
 </li>
 </ul>
 </li>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/package-tree.html b/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
index 846026d..a3947e1 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
@@ -349,10 +349,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/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.ResubmitDirective.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">SplitLogManager.ResubmitDirective</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">RegionState.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.ResubmitDirective.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">SplitLogManager.ResubmitDirective</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.TerminationStatus.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">SplitLogManager.TerminationStatus</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/MetricsMasterSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">MetricsMasterSourceFactoryImpl.FactoryStorage</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/MasterRpcServices.BalanceSwitchMode.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">MasterRpcServices.BalanceSwitchMode</span></a></li>
 </ul>
 </li>
diff --git a/devapidocs/org/apache/hadoop/hbase/monitoring/package-tree.html b/devapidocs/org/apache/hadoop/hbase/monitoring/package-tree.html
index 7524d90..452eaee 100644
--- a/devapidocs/org/apache/hadoop/hbase/monitoring/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/monitoring/package-tree.html
@@ -127,8 +127,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.monitoring.<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html" title="enum in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">MonitoredTask.State</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.monitoring.<a href="../../../../../org/apache/hadoop/hbase/monitoring/TaskMonitor.TaskFilter.TaskType.html" title="enum in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">TaskMonitor.TaskFilter.TaskType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.monitoring.<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html" title="enum in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">MonitoredTask.State</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/package-tree.html b/devapidocs/org/apache/hadoop/hbase/package-tree.html
index 1564a8a..dbf8a8c 100644
--- a/devapidocs/org/apache/hadoop/hbase/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/package-tree.html
@@ -432,19 +432,19 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HConstants.OperationStatusCode.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HConstants.OperationStatusCode</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/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/Size.Unit.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Size.Unit</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CompareOperator.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompareOperator</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Coprocessor.State.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Coprocessor.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MetaTableAccessor.QueryType</span></a></li>
+<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/KeepDeletedCells.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeepDeletedCells</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HealthChecker.HealthCheckerExitStatus.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HealthChecker.HealthCheckerExitStatus</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CompatibilitySingletonFactory.SingletonStorage.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompatibilitySingletonFactory.SingletonStorage</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/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/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/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/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>
-<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/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/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/KeepDeletedCells.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeepDeletedCells</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html b/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
index 3677403..340f6a7 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/LockedResourceType.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">LockedResourceType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/RootProcedureState.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">RootProcedureState.State</span></a></li>
+<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>
 <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/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 ccd6474..273e3fc 100644
--- a/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
@@ -237,13 +237,13 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/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/OperationQuota.OperationType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">OperationQuota.OperationType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/QuotaScope.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">QuotaScope</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/ThrottlingException.Type.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">ThrottlingException.Type</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/RpcThrottlingException.Type.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">RpcThrottlingException.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/QuotaScope.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">QuotaScope</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/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/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/ThrottleType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">ThrottleType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html b/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
index d08848c..d9e148e 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -717,20 +717,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/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/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/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/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/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.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/SplitLogWorker.TaskExecutor.Status.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">SplitLogWorker.TaskExecutor.Status</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsRegionServerSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MetricsRegionServerSourceFactoryImpl.FactoryStorage</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/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/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/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/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/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/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/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">HRegion.FlushResult.Result</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/CompactingMemStore.IndexType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">CompactingMemStore.IndexType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/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/ScannerContext.NextState.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScannerContext.NextState</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 0a43c84..93a5847 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
@@ -247,9 +247,9 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/RingBufferTruck.Type.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">RingBufferTruck.Type</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/ProtobufLogReader.WALHdrResult.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">ProtobufLogReader.WALHdrResult</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/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/ProtobufLogReader.WALHdrResult.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">ProtobufLogReader.WALHdrResult</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/RingBufferTruck.Type.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">RingBufferTruck.Type</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/rest/model/package-tree.html b/devapidocs/org/apache/hadoop/hbase/rest/model/package-tree.html
index 3aa879d..7d70035 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.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>
+<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>
 </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 1591eab..71a004f 100644
--- a/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
@@ -136,10 +136,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/Permission.Scope.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">Permission.Scope</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessControlFilter.Strategy.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">AccessControlFilter.Strategy</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/Permission.Action.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">Permission.Action</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">AccessController.OpType</span></a></li>
-<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>
 </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 4cad661..b26d46f 100644
--- a/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
@@ -192,8 +192,8 @@
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
 <li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/AuthMethod.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">AuthMethod</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslStatus.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">SaslStatus</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslUtil.QualityOfProtection.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">SaslUtil.QualityOfProtection</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslStatus.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">SaslStatus</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html b/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
index 13d8b06..82c818f 100644
--- a/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
@@ -207,8 +207,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.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/ThriftMetrics.ThriftServerType.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">ThriftMetrics.ThriftServerType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/MetricsThriftServerSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">MetricsThriftServerSourceFactoryImpl.FactoryStorage</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/ThriftMetrics.ThriftServerType.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">ThriftMetrics.ThriftServerType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/ImplType.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">ImplType</span></a></li>
 </ul>
 </li>
diff --git a/devapidocs/org/apache/hadoop/hbase/util/package-tree.html b/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
index 3396a78..e7d9c59 100644
--- a/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
@@ -545,14 +545,14 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PoolMap.PoolType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PoolMap.PoolType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/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/PrettyPrinter.Unit.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PrettyPrinter.Unit</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/HBaseFsck.ErrorReporter.ERROR_CODE.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">HBaseFsck.ErrorReporter.ERROR_CODE</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.LexicographicalComparerHolder.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/Order.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Order</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/IdReadWriteLock.ReferenceType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">IdReadWriteLock.ReferenceType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/ChecksumType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">ChecksumType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PoolMap.PoolType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PoolMap.PoolType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/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/PrettyPrinter.Unit.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PrettyPrinter.Unit</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.LexicographicalComparerHolder.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/HBaseFsck.ErrorReporter.ERROR_CODE.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">HBaseFsck.ErrorReporter.ERROR_CODE</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html b/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html
index 951fb0c..cb3db448 100644
--- a/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html
@@ -191,8 +191,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.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.Providers.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">WALFactory.Providers</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/RegionGroupingProvider.Strategies.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">RegionGroupingProvider.Strategies</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.Providers.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">WALFactory.Providers</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/Version.html b/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
index a17ed4b..5a50d54 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
@@ -18,9 +18,9 @@
 <span class="sourceLineNo">010</span>  public static final String version = "3.0.0-SNAPSHOT";<a name="line.10"></a>
 <span class="sourceLineNo">011</span>  public static final String revision = "";<a name="line.11"></a>
 <span class="sourceLineNo">012</span>  public static final String user = "jenkins";<a name="line.12"></a>
-<span class="sourceLineNo">013</span>  public static final String date = "Tue Feb 12 14:58:34 UTC 2019";<a name="line.13"></a>
+<span class="sourceLineNo">013</span>  public static final String date = "Wed Feb 13 14:38:19 UTC 2019";<a name="line.13"></a>
 <span class="sourceLineNo">014</span>  public static final String url = "git://jenkins-websites1.apache.org/home/jenkins/jenkins-slave/workspace/hbase_generate_website/hbase";<a name="line.14"></a>
-<span class="sourceLineNo">015</span>  public static final String srcChecksum = "02906457f8c621f88e1fd05db77893bd";<a name="line.15"></a>
+<span class="sourceLineNo">015</span>  public static final String srcChecksum = "74c6ce927119c354026c5908ec3f35e4";<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/AsyncConnection.html b/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncConnection.html
index 3804f4d..4d02aa0 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncConnection.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncConnection.html
@@ -61,168 +61,178 @@
 <span class="sourceLineNo">053</span>  AsyncTableRegionLocator getRegionLocator(TableName tableName);<a name="line.53"></a>
 <span class="sourceLineNo">054</span><a name="line.54"></a>
 <span class="sourceLineNo">055</span>  /**<a name="line.55"></a>
-<span class="sourceLineNo">056</span>   * Retrieve an {@link AsyncTable} implementation for accessing a table.<a name="line.56"></a>
-<span class="sourceLineNo">057</span>   * &lt;p&gt;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>   * The returned instance will use default configs. Use {@link #getTableBuilder(TableName)} if<a name="line.58"></a>
-<span class="sourceLineNo">059</span>   * you want to customize some configs.<a name="line.59"></a>
-<span class="sourceLineNo">060</span>   * &lt;p&gt;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>   * This method no longer checks table existence. An exception will be thrown if the table does not<a name="line.61"></a>
-<span class="sourceLineNo">062</span>   * exist only when the first operation is attempted.<a name="line.62"></a>
-<span class="sourceLineNo">063</span>   * &lt;p&gt;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>   * The returned {@code CompletableFuture} will be finished directly in the rpc framework's<a name="line.64"></a>
-<span class="sourceLineNo">065</span>   * callback thread, so typically you should not do any time consuming work inside these methods.<a name="line.65"></a>
-<span class="sourceLineNo">066</span>   * And also the observer style scan API will use {@link AdvancedScanResultConsumer} which is<a name="line.66"></a>
-<span class="sourceLineNo">067</span>   * designed for experts only. Only use it when you know what you are doing.<a name="line.67"></a>
-<span class="sourceLineNo">068</span>   * @param tableName the name of the table<a name="line.68"></a>
-<span class="sourceLineNo">069</span>   * @return an AsyncTable to use for interactions with this table<a name="line.69"></a>
-<span class="sourceLineNo">070</span>   * @see #getTableBuilder(TableName)<a name="line.70"></a>
-<span class="sourceLineNo">071</span>   */<a name="line.71"></a>
-<span class="sourceLineNo">072</span>  default AsyncTable&lt;AdvancedScanResultConsumer&gt; getTable(TableName tableName) {<a name="line.72"></a>
-<span class="sourceLineNo">073</span>    return getTableBuilder(tableName).build();<a name="line.73"></a>
-<span class="sourceLineNo">074</span>  }<a name="line.74"></a>
-<span class="sourceLineNo">075</span><a name="line.75"></a>
-<span class="sourceLineNo">076</span>  /**<a name="line.76"></a>
-<span class="sourceLineNo">077</span>   * Returns an {@link AsyncTableBuilder} for creating {@link AsyncTable}.<a name="line.77"></a>
-<span class="sourceLineNo">078</span>   * &lt;p&gt;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>   * This method no longer checks table existence. An exception will be thrown if the table does not<a name="line.79"></a>
-<span class="sourceLineNo">080</span>   * exist only when the first operation is attempted.<a name="line.80"></a>
-<span class="sourceLineNo">081</span>   * @param tableName the name of the table<a name="line.81"></a>
-<span class="sourceLineNo">082</span>   */<a name="line.82"></a>
-<span class="sourceLineNo">083</span>  AsyncTableBuilder&lt;AdvancedScanResultConsumer&gt; getTableBuilder(TableName tableName);<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>   * Retrieve an {@link AsyncTable} implementation for accessing a table.<a name="line.86"></a>
-<span class="sourceLineNo">087</span>   * &lt;p&gt;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>   * This method no longer checks table existence. An exception will be thrown if the table does not<a name="line.88"></a>
-<span class="sourceLineNo">089</span>   * exist only when the first operation is attempted.<a name="line.89"></a>
-<span class="sourceLineNo">090</span>   * @param tableName the name of the table<a name="line.90"></a>
-<span class="sourceLineNo">091</span>   * @param pool the thread pool to use for executing callback<a name="line.91"></a>
-<span class="sourceLineNo">092</span>   * @return an AsyncTable to use for interactions with this table<a name="line.92"></a>
-<span class="sourceLineNo">093</span>   */<a name="line.93"></a>
-<span class="sourceLineNo">094</span>  default AsyncTable&lt;ScanResultConsumer&gt; getTable(TableName tableName, ExecutorService pool) {<a name="line.94"></a>
-<span class="sourceLineNo">095</span>    return getTableBuilder(tableName, pool).build();<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  }<a name="line.96"></a>
-<span class="sourceLineNo">097</span><a name="line.97"></a>
-<span class="sourceLineNo">098</span>  /**<a name="line.98"></a>
-<span class="sourceLineNo">099</span>   * Returns an {@link AsyncTableBuilder} for creating {@link AsyncTable}.<a name="line.99"></a>
-<span class="sourceLineNo">100</span>   * &lt;p&gt;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>   * This method no longer checks table existence. An exception will be thrown if the table does not<a name="line.101"></a>
-<span class="sourceLineNo">102</span>   * exist only when the first operation is attempted.<a name="line.102"></a>
-<span class="sourceLineNo">103</span>   * @param tableName the name of the table<a name="line.103"></a>
-<span class="sourceLineNo">104</span>   * @param pool the thread pool to use for executing callback<a name="line.104"></a>
-<span class="sourceLineNo">105</span>   */<a name="line.105"></a>
-<span class="sourceLineNo">106</span>  AsyncTableBuilder&lt;ScanResultConsumer&gt; getTableBuilder(TableName tableName, ExecutorService pool);<a name="line.106"></a>
+<span class="sourceLineNo">056</span>   * Clear all the entries in the region location cache, for all the tables.<a name="line.56"></a>
+<span class="sourceLineNo">057</span>   * &lt;p/&gt;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>   * If you only want to clear the cache for a specific table, use<a name="line.58"></a>
+<span class="sourceLineNo">059</span>   * {@link AsyncTableRegionLocator#clearRegionLocationCache()}.<a name="line.59"></a>
+<span class="sourceLineNo">060</span>   * &lt;p/&gt;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>   * This may cause performance issue so use it with caution.<a name="line.61"></a>
+<span class="sourceLineNo">062</span>   */<a name="line.62"></a>
+<span class="sourceLineNo">063</span>  void clearRegionLocationCache();<a name="line.63"></a>
+<span class="sourceLineNo">064</span><a name="line.64"></a>
+<span class="sourceLineNo">065</span>  /**<a name="line.65"></a>
+<span class="sourceLineNo">066</span>   * Retrieve an {@link AsyncTable} implementation for accessing a table.<a name="line.66"></a>
+<span class="sourceLineNo">067</span>   * &lt;p&gt;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>   * The returned instance will use default configs. Use {@link #getTableBuilder(TableName)} if<a name="line.68"></a>
+<span class="sourceLineNo">069</span>   * you want to customize some configs.<a name="line.69"></a>
+<span class="sourceLineNo">070</span>   * &lt;p&gt;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>   * This method no longer checks table existence. An exception will be thrown if the table does not<a name="line.71"></a>
+<span class="sourceLineNo">072</span>   * exist only when the first operation is attempted.<a name="line.72"></a>
+<span class="sourceLineNo">073</span>   * &lt;p&gt;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>   * The returned {@code CompletableFuture} will be finished directly in the rpc framework's<a name="line.74"></a>
+<span class="sourceLineNo">075</span>   * callback thread, so typically you should not do any time consuming work inside these methods.<a name="line.75"></a>
+<span class="sourceLineNo">076</span>   * And also the observer style scan API will use {@link AdvancedScanResultConsumer} which is<a name="line.76"></a>
+<span class="sourceLineNo">077</span>   * designed for experts only. Only use it when you know what you are doing.<a name="line.77"></a>
+<span class="sourceLineNo">078</span>   * @param tableName the name of the table<a name="line.78"></a>
+<span class="sourceLineNo">079</span>   * @return an AsyncTable to use for interactions with this table<a name="line.79"></a>
+<span class="sourceLineNo">080</span>   * @see #getTableBuilder(TableName)<a name="line.80"></a>
+<span class="sourceLineNo">081</span>   */<a name="line.81"></a>
+<span class="sourceLineNo">082</span>  default AsyncTable&lt;AdvancedScanResultConsumer&gt; getTable(TableName tableName) {<a name="line.82"></a>
+<span class="sourceLineNo">083</span>    return getTableBuilder(tableName).build();<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>  /**<a name="line.86"></a>
+<span class="sourceLineNo">087</span>   * Returns an {@link AsyncTableBuilder} for creating {@link AsyncTable}.<a name="line.87"></a>
+<span class="sourceLineNo">088</span>   * &lt;p&gt;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>   * This method no longer checks table existence. An exception will be thrown if the table does not<a name="line.89"></a>
+<span class="sourceLineNo">090</span>   * exist only when the first operation is attempted.<a name="line.90"></a>
+<span class="sourceLineNo">091</span>   * @param tableName the name of the table<a name="line.91"></a>
+<span class="sourceLineNo">092</span>   */<a name="line.92"></a>
+<span class="sourceLineNo">093</span>  AsyncTableBuilder&lt;AdvancedScanResultConsumer&gt; getTableBuilder(TableName tableName);<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>   * Retrieve an {@link AsyncTable} implementation for accessing a table.<a name="line.96"></a>
+<span class="sourceLineNo">097</span>   * &lt;p&gt;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>   * This method no longer checks table existence. An exception will be thrown if the table does not<a name="line.98"></a>
+<span class="sourceLineNo">099</span>   * exist only when the first operation is attempted.<a name="line.99"></a>
+<span class="sourceLineNo">100</span>   * @param tableName the name of the table<a name="line.100"></a>
+<span class="sourceLineNo">101</span>   * @param pool the thread pool to use for executing callback<a name="line.101"></a>
+<span class="sourceLineNo">102</span>   * @return an AsyncTable to use for interactions with this table<a name="line.102"></a>
+<span class="sourceLineNo">103</span>   */<a name="line.103"></a>
+<span class="sourceLineNo">104</span>  default AsyncTable&lt;ScanResultConsumer&gt; getTable(TableName tableName, ExecutorService pool) {<a name="line.104"></a>
+<span class="sourceLineNo">105</span>    return getTableBuilder(tableName, pool).build();<a name="line.105"></a>
+<span class="sourceLineNo">106</span>  }<a name="line.106"></a>
 <span class="sourceLineNo">107</span><a name="line.107"></a>
 <span class="sourceLineNo">108</span>  /**<a name="line.108"></a>
-<span class="sourceLineNo">109</span>   * Retrieve an {@link AsyncAdmin} implementation to administer an HBase cluster.<a name="line.109"></a>
+<span class="sourceLineNo">109</span>   * Returns an {@link AsyncTableBuilder} for creating {@link AsyncTable}.<a name="line.109"></a>
 <span class="sourceLineNo">110</span>   * &lt;p&gt;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>   * The returned instance will use default configs. Use {@link #getAdminBuilder()} if you want to<a name="line.111"></a>
-<span class="sourceLineNo">112</span>   * customize some configs.<a name="line.112"></a>
-<span class="sourceLineNo">113</span>   * &lt;p&gt;<a name="line.113"></a>
-<span class="sourceLineNo">114</span>   * The admin operation's returned {@code CompletableFuture} will be finished directly in the rpc<a name="line.114"></a>
-<span class="sourceLineNo">115</span>   * framework's callback thread, so typically you should not do any time consuming work inside<a name="line.115"></a>
-<span class="sourceLineNo">116</span>   * these methods.<a name="line.116"></a>
-<span class="sourceLineNo">117</span>   * @return an {@link AsyncAdmin} instance for cluster administration<a name="line.117"></a>
-<span class="sourceLineNo">118</span>   */<a name="line.118"></a>
-<span class="sourceLineNo">119</span>  default AsyncAdmin getAdmin() {<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    return getAdminBuilder().build();<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>  /**<a name="line.123"></a>
-<span class="sourceLineNo">124</span>   * Returns an {@link AsyncAdminBuilder} for creating {@link AsyncAdmin}.<a name="line.124"></a>
-<span class="sourceLineNo">125</span>   * &lt;p&gt;<a name="line.125"></a>
-<span class="sourceLineNo">126</span>   * The admin operation's returned {@code CompletableFuture} will be finished directly in the rpc<a name="line.126"></a>
-<span class="sourceLineNo">127</span>   * framework's callback thread, so typically you should not do any time consuming work inside<a name="line.127"></a>
-<span class="sourceLineNo">128</span>   * these methods.<a name="line.128"></a>
-<span class="sourceLineNo">129</span>   */<a name="line.129"></a>
-<span class="sourceLineNo">130</span>  AsyncAdminBuilder getAdminBuilder();<a name="line.130"></a>
-<span class="sourceLineNo">131</span><a name="line.131"></a>
-<span class="sourceLineNo">132</span>  /**<a name="line.132"></a>
-<span class="sourceLineNo">133</span>   * Retrieve an {@link AsyncAdmin} implementation to administer an HBase cluster.<a name="line.133"></a>
-<span class="sourceLineNo">134</span>   * &lt;p&gt;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>   * The returned instance will use default configs. Use {@link #getAdminBuilder(ExecutorService)}<a name="line.135"></a>
-<span class="sourceLineNo">136</span>   * if you want to customize some configs.<a name="line.136"></a>
-<span class="sourceLineNo">137</span>   * @param pool the thread pool to use for executing callback<a name="line.137"></a>
-<span class="sourceLineNo">138</span>   * @return an {@link AsyncAdmin} instance for cluster administration<a name="line.138"></a>
+<span class="sourceLineNo">111</span>   * This method no longer checks table existence. An exception will be thrown if the table does not<a name="line.111"></a>
+<span class="sourceLineNo">112</span>   * exist only when the first operation is attempted.<a name="line.112"></a>
+<span class="sourceLineNo">113</span>   * @param tableName the name of the table<a name="line.113"></a>
+<span class="sourceLineNo">114</span>   * @param pool the thread pool to use for executing callback<a name="line.114"></a>
+<span class="sourceLineNo">115</span>   */<a name="line.115"></a>
+<span class="sourceLineNo">116</span>  AsyncTableBuilder&lt;ScanResultConsumer&gt; getTableBuilder(TableName tableName, ExecutorService pool);<a name="line.116"></a>
+<span class="sourceLineNo">117</span><a name="line.117"></a>
+<span class="sourceLineNo">118</span>  /**<a name="line.118"></a>
+<span class="sourceLineNo">119</span>   * Retrieve an {@link AsyncAdmin} implementation to administer an HBase cluster.<a name="line.119"></a>
+<span class="sourceLineNo">120</span>   * &lt;p&gt;<a name="line.120"></a>
+<span class="sourceLineNo">121</span>   * The returned instance will use default configs. Use {@link #getAdminBuilder()} if you want to<a name="line.121"></a>
+<span class="sourceLineNo">122</span>   * customize some configs.<a name="line.122"></a>
+<span class="sourceLineNo">123</span>   * &lt;p&gt;<a name="line.123"></a>
+<span class="sourceLineNo">124</span>   * The admin operation's returned {@code CompletableFuture} will be finished directly in the rpc<a name="line.124"></a>
+<span class="sourceLineNo">125</span>   * framework's callback thread, so typically you should not do any time consuming work inside<a name="line.125"></a>
+<span class="sourceLineNo">126</span>   * these methods.<a name="line.126"></a>
+<span class="sourceLineNo">127</span>   * @return an {@link AsyncAdmin} instance for cluster administration<a name="line.127"></a>
+<span class="sourceLineNo">128</span>   */<a name="line.128"></a>
+<span class="sourceLineNo">129</span>  default AsyncAdmin getAdmin() {<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    return getAdminBuilder().build();<a name="line.130"></a>
+<span class="sourceLineNo">131</span>  }<a name="line.131"></a>
+<span class="sourceLineNo">132</span><a name="line.132"></a>
+<span class="sourceLineNo">133</span>  /**<a name="line.133"></a>
+<span class="sourceLineNo">134</span>   * Returns an {@link AsyncAdminBuilder} for creating {@link AsyncAdmin}.<a name="line.134"></a>
+<span class="sourceLineNo">135</span>   * &lt;p&gt;<a name="line.135"></a>
+<span class="sourceLineNo">136</span>   * The admin operation's returned {@code CompletableFuture} will be finished directly in the rpc<a name="line.136"></a>
+<span class="sourceLineNo">137</span>   * framework's callback thread, so typically you should not do any time consuming work inside<a name="line.137"></a>
+<span class="sourceLineNo">138</span>   * these methods.<a name="line.138"></a>
 <span class="sourceLineNo">139</span>   */<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  default AsyncAdmin getAdmin(ExecutorService pool) {<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    return getAdminBuilder(pool).build();<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>  /**<a name="line.144"></a>
-<span class="sourceLineNo">145</span>   * Returns an {@link AsyncAdminBuilder} for creating {@link AsyncAdmin}.<a name="line.145"></a>
-<span class="sourceLineNo">146</span>   * @param pool the thread pool to use for executing callback<a name="line.146"></a>
-<span class="sourceLineNo">147</span>   */<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  AsyncAdminBuilder getAdminBuilder(ExecutorService pool);<a name="line.148"></a>
-<span class="sourceLineNo">149</span><a name="line.149"></a>
-<span class="sourceLineNo">150</span>  /**<a name="line.150"></a>
-<span class="sourceLineNo">151</span>   * Retrieve an {@link AsyncBufferedMutator} for performing client-side buffering of writes.<a name="line.151"></a>
-<span class="sourceLineNo">152</span>   * &lt;p&gt;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>   * The returned instance will use default configs. Use<a name="line.153"></a>
-<span class="sourceLineNo">154</span>   * {@link #getBufferedMutatorBuilder(TableName)} if you want to customize some configs.<a name="line.154"></a>
-<span class="sourceLineNo">155</span>   * @param tableName the name of the table<a name="line.155"></a>
-<span class="sourceLineNo">156</span>   * @return an {@link AsyncBufferedMutator} for the supplied tableName.<a name="line.156"></a>
+<span class="sourceLineNo">140</span>  AsyncAdminBuilder getAdminBuilder();<a name="line.140"></a>
+<span class="sourceLineNo">141</span><a name="line.141"></a>
+<span class="sourceLineNo">142</span>  /**<a name="line.142"></a>
+<span class="sourceLineNo">143</span>   * Retrieve an {@link AsyncAdmin} implementation to administer an HBase cluster.<a name="line.143"></a>
+<span class="sourceLineNo">144</span>   * &lt;p&gt;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>   * The returned instance will use default configs. Use {@link #getAdminBuilder(ExecutorService)}<a name="line.145"></a>
+<span class="sourceLineNo">146</span>   * if you want to customize some configs.<a name="line.146"></a>
+<span class="sourceLineNo">147</span>   * @param pool the thread pool to use for executing callback<a name="line.147"></a>
+<span class="sourceLineNo">148</span>   * @return an {@link AsyncAdmin} instance for cluster administration<a name="line.148"></a>
+<span class="sourceLineNo">149</span>   */<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  default AsyncAdmin getAdmin(ExecutorService pool) {<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    return getAdminBuilder(pool).build();<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  }<a name="line.152"></a>
+<span class="sourceLineNo">153</span><a name="line.153"></a>
+<span class="sourceLineNo">154</span>  /**<a name="line.154"></a>
+<span class="sourceLineNo">155</span>   * Returns an {@link AsyncAdminBuilder} for creating {@link AsyncAdmin}.<a name="line.155"></a>
+<span class="sourceLineNo">156</span>   * @param pool the thread pool to use for executing callback<a name="line.156"></a>
 <span class="sourceLineNo">157</span>   */<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  default AsyncBufferedMutator getBufferedMutator(TableName tableName) {<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    return getBufferedMutatorBuilder(tableName).build();<a name="line.159"></a>
-<span class="sourceLineNo">160</span>  }<a name="line.160"></a>
-<span class="sourceLineNo">161</span><a name="line.161"></a>
-<span class="sourceLineNo">162</span>  /**<a name="line.162"></a>
-<span class="sourceLineNo">163</span>   * Returns an {@link AsyncBufferedMutatorBuilder} for creating {@link AsyncBufferedMutator}.<a name="line.163"></a>
-<span class="sourceLineNo">164</span>   * @param tableName the name of the table<a name="line.164"></a>
-<span class="sourceLineNo">165</span>   */<a name="line.165"></a>
-<span class="sourceLineNo">166</span>  AsyncBufferedMutatorBuilder getBufferedMutatorBuilder(TableName tableName);<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>   * Retrieve an {@link AsyncBufferedMutator} for performing client-side buffering of writes.<a name="line.169"></a>
-<span class="sourceLineNo">170</span>   * &lt;p&gt;<a name="line.170"></a>
-<span class="sourceLineNo">171</span>   * The returned instance will use default configs. Use<a name="line.171"></a>
-<span class="sourceLineNo">172</span>   * {@link #getBufferedMutatorBuilder(TableName, ExecutorService)} if you want to customize some<a name="line.172"></a>
-<span class="sourceLineNo">173</span>   * configs.<a name="line.173"></a>
+<span class="sourceLineNo">158</span>  AsyncAdminBuilder getAdminBuilder(ExecutorService pool);<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  /**<a name="line.160"></a>
+<span class="sourceLineNo">161</span>   * Retrieve an {@link AsyncBufferedMutator} for performing client-side buffering of writes.<a name="line.161"></a>
+<span class="sourceLineNo">162</span>   * &lt;p&gt;<a name="line.162"></a>
+<span class="sourceLineNo">163</span>   * The returned instance will use default configs. Use<a name="line.163"></a>
+<span class="sourceLineNo">164</span>   * {@link #getBufferedMutatorBuilder(TableName)} if you want to customize some configs.<a name="line.164"></a>
+<span class="sourceLineNo">165</span>   * @param tableName the name of the table<a name="line.165"></a>
+<span class="sourceLineNo">166</span>   * @return an {@link AsyncBufferedMutator} for the supplied tableName.<a name="line.166"></a>
+<span class="sourceLineNo">167</span>   */<a name="line.167"></a>
+<span class="sourceLineNo">168</span>  default AsyncBufferedMutator getBufferedMutator(TableName tableName) {<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    return getBufferedMutatorBuilder(tableName).build();<a name="line.169"></a>
+<span class="sourceLineNo">170</span>  }<a name="line.170"></a>
+<span class="sourceLineNo">171</span><a name="line.171"></a>
+<span class="sourceLineNo">172</span>  /**<a name="line.172"></a>
+<span class="sourceLineNo">173</span>   * Returns an {@link AsyncBufferedMutatorBuilder} for creating {@link AsyncBufferedMutator}.<a name="line.173"></a>
 <span class="sourceLineNo">174</span>   * @param tableName the name of the table<a name="line.174"></a>
-<span class="sourceLineNo">175</span>   * @param pool the thread pool to use for executing callback<a name="line.175"></a>
-<span class="sourceLineNo">176</span>   * @return an {@link AsyncBufferedMutator} for the supplied tableName.<a name="line.176"></a>
-<span class="sourceLineNo">177</span>   */<a name="line.177"></a>
-<span class="sourceLineNo">178</span>  default AsyncBufferedMutator getBufferedMutator(TableName tableName, ExecutorService pool) {<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    return getBufferedMutatorBuilder(tableName, pool).build();<a name="line.179"></a>
-<span class="sourceLineNo">180</span>  }<a name="line.180"></a>
-<span class="sourceLineNo">181</span><a name="line.181"></a>
-<span class="sourceLineNo">182</span>  /**<a name="line.182"></a>
-<span class="sourceLineNo">183</span>   * Returns an {@link AsyncBufferedMutatorBuilder} for creating {@link AsyncBufferedMutator}.<a name="line.183"></a>
+<span class="sourceLineNo">175</span>   */<a name="line.175"></a>
+<span class="sourceLineNo">176</span>  AsyncBufferedMutatorBuilder getBufferedMutatorBuilder(TableName tableName);<a name="line.176"></a>
+<span class="sourceLineNo">177</span><a name="line.177"></a>
+<span class="sourceLineNo">178</span>  /**<a name="line.178"></a>
+<span class="sourceLineNo">179</span>   * Retrieve an {@link AsyncBufferedMutator} for performing client-side buffering of writes.<a name="line.179"></a>
+<span class="sourceLineNo">180</span>   * &lt;p&gt;<a name="line.180"></a>
+<span class="sourceLineNo">181</span>   * The returned instance will use default configs. Use<a name="line.181"></a>
+<span class="sourceLineNo">182</span>   * {@link #getBufferedMutatorBuilder(TableName, ExecutorService)} if you want to customize some<a name="line.182"></a>
+<span class="sourceLineNo">183</span>   * configs.<a name="line.183"></a>
 <span class="sourceLineNo">184</span>   * @param tableName the name of the table<a name="line.184"></a>
 <span class="sourceLineNo">185</span>   * @param pool the thread pool to use for executing callback<a name="line.185"></a>
-<span class="sourceLineNo">186</span>   */<a name="line.186"></a>
-<span class="sourceLineNo">187</span>  AsyncBufferedMutatorBuilder getBufferedMutatorBuilder(TableName tableName, ExecutorService pool);<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>   * Retrieve an Hbck implementation to fix an HBase cluster. The returned Hbck is not guaranteed to<a name="line.190"></a>
-<span class="sourceLineNo">191</span>   * be thread-safe. A new instance should be created by each thread. This is a lightweight<a name="line.191"></a>
-<span class="sourceLineNo">192</span>   * operation. Pooling or caching of the returned Hbck instance is not recommended.<a name="line.192"></a>
-<span class="sourceLineNo">193</span>   * &lt;p/&gt;<a name="line.193"></a>
-<span class="sourceLineNo">194</span>   * The caller is responsible for calling {@link Hbck#close()} on the returned Hbck instance.<a name="line.194"></a>
-<span class="sourceLineNo">195</span>   * &lt;p/&gt;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>   * This will be used mostly by hbck tool.<a name="line.196"></a>
-<span class="sourceLineNo">197</span>   * @return an Hbck instance for active master. Active master is fetched from the zookeeper.<a name="line.197"></a>
-<span class="sourceLineNo">198</span>   */<a name="line.198"></a>
-<span class="sourceLineNo">199</span>  @InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.HBCK)<a name="line.199"></a>
-<span class="sourceLineNo">200</span>  CompletableFuture&lt;Hbck&gt; getHbck();<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>   * Retrieve an Hbck implementation to fix an HBase cluster. The returned Hbck is not guaranteed to<a name="line.203"></a>
-<span class="sourceLineNo">204</span>   * be thread-safe. A new instance should be created by each thread. This is a lightweight<a name="line.204"></a>
-<span class="sourceLineNo">205</span>   * operation. Pooling or caching of the returned Hbck instance is not recommended.<a name="line.205"></a>
-<span class="sourceLineNo">206</span>   * &lt;p/&gt;<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * The caller is responsible for calling {@link Hbck#close()} on the returned Hbck instance.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   * &lt;p/&gt;<a name="line.208"></a>
-<span class="sourceLineNo">209</span>   * This will be used mostly by hbck tool. This may only be used to by pass getting registered<a name="line.209"></a>
-<span class="sourceLineNo">210</span>   * master from ZK. In situations where ZK is not available or active master is not registered with<a name="line.210"></a>
-<span class="sourceLineNo">211</span>   * ZK and user can get master address by other means, master can be explicitly specified.<a name="line.211"></a>
-<span class="sourceLineNo">212</span>   * @param masterServer explicit {@link ServerName} for master server<a name="line.212"></a>
-<span class="sourceLineNo">213</span>   * @return an Hbck instance for a specified master server<a name="line.213"></a>
-<span class="sourceLineNo">214</span>   */<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  @InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.HBCK)<a name="line.215"></a>
-<span class="sourceLineNo">216</span>  Hbck getHbck(ServerName masterServer) throws IOException;<a name="line.216"></a>
-<span class="sourceLineNo">217</span>}<a name="line.217"></a>
+<span class="sourceLineNo">186</span>   * @return an {@link AsyncBufferedMutator} for the supplied tableName.<a name="line.186"></a>
+<span class="sourceLineNo">187</span>   */<a name="line.187"></a>
+<span class="sourceLineNo">188</span>  default AsyncBufferedMutator getBufferedMutator(TableName tableName, ExecutorService pool) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    return getBufferedMutatorBuilder(tableName, pool).build();<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>   * Returns an {@link AsyncBufferedMutatorBuilder} for creating {@link AsyncBufferedMutator}.<a name="line.193"></a>
+<span class="sourceLineNo">194</span>   * @param tableName the name of the table<a name="line.194"></a>
+<span class="sourceLineNo">195</span>   * @param pool the thread pool to use for executing callback<a name="line.195"></a>
+<span class="sourceLineNo">196</span>   */<a name="line.196"></a>
+<span class="sourceLineNo">197</span>  AsyncBufferedMutatorBuilder getBufferedMutatorBuilder(TableName tableName, ExecutorService pool);<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>   * Retrieve an Hbck implementation to fix an HBase cluster. The returned Hbck is not guaranteed to<a name="line.200"></a>
+<span class="sourceLineNo">201</span>   * be thread-safe. A new instance should be created by each thread. This is a lightweight<a name="line.201"></a>
+<span class="sourceLineNo">202</span>   * operation. Pooling or caching of the returned Hbck instance is not recommended.<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   * &lt;p/&gt;<a name="line.203"></a>
+<span class="sourceLineNo">204</span>   * The caller is responsible for calling {@link Hbck#close()} on the returned Hbck instance.<a name="line.204"></a>
+<span class="sourceLineNo">205</span>   * &lt;p/&gt;<a name="line.205"></a>
+<span class="sourceLineNo">206</span>   * This will be used mostly by hbck tool.<a name="line.206"></a>
+<span class="sourceLineNo">207</span>   * @return an Hbck instance for active master. Active master is fetched from the zookeeper.<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   */<a name="line.208"></a>
+<span class="sourceLineNo">209</span>  @InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.HBCK)<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  CompletableFuture&lt;Hbck&gt; getHbck();<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>   * Retrieve an Hbck implementation to fix an HBase cluster. The returned Hbck is not guaranteed to<a name="line.213"></a>
+<span class="sourceLineNo">214</span>   * be thread-safe. A new instance should be created by each thread. This is a lightweight<a name="line.214"></a>
+<span class="sourceLineNo">215</span>   * operation. Pooling or caching of the returned Hbck instance is not recommended.<a name="line.215"></a>
+<span class="sourceLineNo">216</span>   * &lt;p/&gt;<a name="line.216"></a>
+<span class="sourceLineNo">217</span>   * The caller is responsible for calling {@link Hbck#close()} on the returned Hbck instance.<a name="line.217"></a>
+<span class="sourceLineNo">218</span>   * &lt;p/&gt;<a name="line.218"></a>
+<span class="sourceLineNo">219</span>   * This will be used mostly by hbck tool. This may only be used to by pass getting registered<a name="line.219"></a>
+<span class="sourceLineNo">220</span>   * master from ZK. In situations where ZK is not available or active master is not registered with<a name="line.220"></a>
+<span class="sourceLineNo">221</span>   * ZK and user can get master address by other means, master can be explicitly specified.<a name="line.221"></a>
+<span class="sourceLineNo">222</span>   * @param masterServer explicit {@link ServerName} for master server<a name="line.222"></a>
+<span class="sourceLineNo">223</span>   * @return an Hbck instance for a specified master server<a name="line.223"></a>
+<span class="sourceLineNo">224</span>   */<a name="line.224"></a>
+<span class="sourceLineNo">225</span>  @InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.HBCK)<a name="line.225"></a>
+<span class="sourceLineNo">226</span>  Hbck getHbck(ServerName masterServer) throws IOException;<a name="line.226"></a>
+<span class="sourceLineNo">227</span>}<a name="line.227"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncConnectionImpl.html b/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncConnectionImpl.html
index 39b8c47..88e8d15 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncConnectionImpl.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncConnectionImpl.html
@@ -361,7 +361,12 @@
 <span class="sourceLineNo">353</span>    return new HBaseHbck(MasterProtos.HbckService.newBlockingStub(<a name="line.353"></a>
 <span class="sourceLineNo">354</span>      rpcClient.createBlockingRpcChannel(masterServer, user, rpcTimeout)), rpcControllerFactory);<a name="line.354"></a>
 <span class="sourceLineNo">355</span>  }<a name="line.355"></a>
-<span class="sourceLineNo">356</span>}<a name="line.356"></a>
+<span class="sourceLineNo">356</span><a name="line.356"></a>
+<span class="sourceLineNo">357</span>  @Override<a name="line.357"></a>
+<span class="sourceLineNo">358</span>  public void clearRegionLocationCache() {<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    locator.clearCache();<a name="line.359"></a>
+<span class="sourceLineNo">360</span>  }<a name="line.360"></a>
+<span class="sourceLineNo">361</span>}<a name="line.361"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.LocateRequest.html b/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.LocateRequest.html
index e76636a..ab60361 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.LocateRequest.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.LocateRequest.html
@@ -577,16 +577,20 @@
 <span class="sourceLineNo">569</span>    }<a name="line.569"></a>
 <span class="sourceLineNo">570</span>  }<a name="line.570"></a>
 <span class="sourceLineNo">571</span><a name="line.571"></a>
-<span class="sourceLineNo">572</span>  // only used for testing whether we have cached the location for a region.<a name="line.572"></a>
-<span class="sourceLineNo">573</span>  @VisibleForTesting<a name="line.573"></a>
-<span class="sourceLineNo">574</span>  RegionLocations getRegionLocationInCache(TableName tableName, byte[] row) {<a name="line.574"></a>
-<span class="sourceLineNo">575</span>    TableCache tableCache = cache.get(tableName);<a name="line.575"></a>
-<span class="sourceLineNo">576</span>    if (tableCache == null) {<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      return null;<a name="line.577"></a>
-<span class="sourceLineNo">578</span>    }<a name="line.578"></a>
-<span class="sourceLineNo">579</span>    return locateRowInCache(tableCache, tableName, row, RegionReplicaUtil.DEFAULT_REPLICA_ID);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>  }<a name="line.580"></a>
-<span class="sourceLineNo">581</span>}<a name="line.581"></a>
+<span class="sourceLineNo">572</span>  void clearCache() {<a name="line.572"></a>
+<span class="sourceLineNo">573</span>    cache.clear();<a name="line.573"></a>
+<span class="sourceLineNo">574</span>  }<a name="line.574"></a>
+<span class="sourceLineNo">575</span><a name="line.575"></a>
+<span class="sourceLineNo">576</span>  // only used for testing whether we have cached the location for a region.<a name="line.576"></a>
+<span class="sourceLineNo">577</span>  @VisibleForTesting<a name="line.577"></a>
+<span class="sourceLineNo">578</span>  RegionLocations getRegionLocationInCache(TableName tableName, byte[] row) {<a name="line.578"></a>
+<span class="sourceLineNo">579</span>    TableCache tableCache = cache.get(tableName);<a name="line.579"></a>
+<span class="sourceLineNo">580</span>    if (tableCache == null) {<a name="line.580"></a>
+<span class="sourceLineNo">581</span>      return null;<a name="line.581"></a>
+<span class="sourceLineNo">582</span>    }<a name="line.582"></a>
+<span class="sourceLineNo">583</span>    return locateRowInCache(tableCache, tableName, row, RegionReplicaUtil.DEFAULT_REPLICA_ID);<a name="line.583"></a>
+<span class="sourceLineNo">584</span>  }<a name="line.584"></a>
+<span class="sourceLineNo">585</span>}<a name="line.585"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.TableCache.html b/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.TableCache.html
index e76636a..ab60361 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.TableCache.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.TableCache.html
@@ -577,16 +577,20 @@
 <span class="sourceLineNo">569</span>    }<a name="line.569"></a>
 <span class="sourceLineNo">570</span>  }<a name="line.570"></a>
 <span class="sourceLineNo">571</span><a name="line.571"></a>
-<span class="sourceLineNo">572</span>  // only used for testing whether we have cached the location for a region.<a name="line.572"></a>
-<span class="sourceLineNo">573</span>  @VisibleForTesting<a name="line.573"></a>
-<span class="sourceLineNo">574</span>  RegionLocations getRegionLocationInCache(TableName tableName, byte[] row) {<a name="line.574"></a>
-<span class="sourceLineNo">575</span>    TableCache tableCache = cache.get(tableName);<a name="line.575"></a>
-<span class="sourceLineNo">576</span>    if (tableCache == null) {<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      return null;<a name="line.577"></a>
-<span class="sourceLineNo">578</span>    }<a name="line.578"></a>
-<span class="sourceLineNo">579</span>    return locateRowInCache(tableCache, tableName, row, RegionReplicaUtil.DEFAULT_REPLICA_ID);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>  }<a name="line.580"></a>
-<span class="sourceLineNo">581</span>}<a name="line.581"></a>
+<span class="sourceLineNo">572</span>  void clearCache() {<a name="line.572"></a>
+<span class="sourceLineNo">573</span>    cache.clear();<a name="line.573"></a>
+<span class="sourceLineNo">574</span>  }<a name="line.574"></a>
+<span class="sourceLineNo">575</span><a name="line.575"></a>
+<span class="sourceLineNo">576</span>  // only used for testing whether we have cached the location for a region.<a name="line.576"></a>
+<span class="sourceLineNo">577</span>  @VisibleForTesting<a name="line.577"></a>
+<span class="sourceLineNo">578</span>  RegionLocations getRegionLocationInCache(TableName tableName, byte[] row) {<a name="line.578"></a>
+<span class="sourceLineNo">579</span>    TableCache tableCache = cache.get(tableName);<a name="line.579"></a>
+<span class="sourceLineNo">580</span>    if (tableCache == null) {<a name="line.580"></a>
+<span class="sourceLineNo">581</span>      return null;<a name="line.581"></a>
+<span class="sourceLineNo">582</span>    }<a name="line.582"></a>
+<span class="sourceLineNo">583</span>    return locateRowInCache(tableCache, tableName, row, RegionReplicaUtil.DEFAULT_REPLICA_ID);<a name="line.583"></a>
+<span class="sourceLineNo">584</span>  }<a name="line.584"></a>
+<span class="sourceLineNo">585</span>}<a name="line.585"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html b/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html
index e76636a..ab60361 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html
@@ -577,16 +577,20 @@
 <span class="sourceLineNo">569</span>    }<a name="line.569"></a>
 <span class="sourceLineNo">570</span>  }<a name="line.570"></a>
 <span class="sourceLineNo">571</span><a name="line.571"></a>
-<span class="sourceLineNo">572</span>  // only used for testing whether we have cached the location for a region.<a name="line.572"></a>
-<span class="sourceLineNo">573</span>  @VisibleForTesting<a name="line.573"></a>
-<span class="sourceLineNo">574</span>  RegionLocations getRegionLocationInCache(TableName tableName, byte[] row) {<a name="line.574"></a>
-<span class="sourceLineNo">575</span>    TableCache tableCache = cache.get(tableName);<a name="line.575"></a>
-<span class="sourceLineNo">576</span>    if (tableCache == null) {<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      return null;<a name="line.577"></a>
-<span class="sourceLineNo">578</span>    }<a name="line.578"></a>
-<span class="sourceLineNo">579</span>    return locateRowInCache(tableCache, tableName, row, RegionReplicaUtil.DEFAULT_REPLICA_ID);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>  }<a name="line.580"></a>
-<span class="sourceLineNo">581</span>}<a name="line.581"></a>
+<span class="sourceLineNo">572</span>  void clearCache() {<a name="line.572"></a>
+<span class="sourceLineNo">573</span>    cache.clear();<a name="line.573"></a>
+<span class="sourceLineNo">574</span>  }<a name="line.574"></a>
+<span class="sourceLineNo">575</span><a name="line.575"></a>
+<span class="sourceLineNo">576</span>  // only used for testing whether we have cached the location for a region.<a name="line.576"></a>
+<span class="sourceLineNo">577</span>  @VisibleForTesting<a name="line.577"></a>
+<span class="sourceLineNo">578</span>  RegionLocations getRegionLocationInCache(TableName tableName, byte[] row) {<a name="line.578"></a>
+<span class="sourceLineNo">579</span>    TableCache tableCache = cache.get(tableName);<a name="line.579"></a>
+<span class="sourceLineNo">580</span>    if (tableCache == null) {<a name="line.580"></a>
+<span class="sourceLineNo">581</span>      return null;<a name="line.581"></a>
+<span class="sourceLineNo">582</span>    }<a name="line.582"></a>
+<span class="sourceLineNo">583</span>    return locateRowInCache(tableCache, tableName, row, RegionReplicaUtil.DEFAULT_REPLICA_ID);<a name="line.583"></a>
+<span class="sourceLineNo">584</span>  }<a name="line.584"></a>
+<span class="sourceLineNo">585</span>}<a name="line.585"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncRegionLocator.html b/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncRegionLocator.html
index eead66b..1a455c7 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncRegionLocator.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncRegionLocator.html
@@ -167,7 +167,12 @@
 <span class="sourceLineNo">159</span>      nonMetaRegionLocator.clearCache(tableName);<a name="line.159"></a>
 <span class="sourceLineNo">160</span>    }<a name="line.160"></a>
 <span class="sourceLineNo">161</span>  }<a name="line.161"></a>
-<span class="sourceLineNo">162</span>}<a name="line.162"></a>
+<span class="sourceLineNo">162</span><a name="line.162"></a>
+<span class="sourceLineNo">163</span>  void clearCache() {<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    metaRegionLocator.clearCache();<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    nonMetaRegionLocator.clearCache();<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  }<a name="line.166"></a>
+<span class="sourceLineNo">167</span>}<a name="line.167"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/MetricsAssignmentManagerSourceImpl.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/MetricsAssignmentManagerSourceImpl.html
index b709aac..df03394 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/MetricsAssignmentManagerSourceImpl.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/MetricsAssignmentManagerSourceImpl.html
@@ -90,8 +90,8 @@
 <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>  @Override<a name="line.84"></a>
-<span class="sourceLineNo">085</span>  public void setRITOldestAge(final long ritCount) {<a name="line.85"></a>
-<span class="sourceLineNo">086</span>    ritOldestAgeGauge.set(ritCount);<a name="line.86"></a>
+<span class="sourceLineNo">085</span>  public void setRITOldestAge(final long ritOldestAge) {<a name="line.85"></a>
+<span class="sourceLineNo">086</span>    ritOldestAgeGauge.set(ritOldestAge);<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>  @Override<a name="line.89"></a>
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionChore.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionChore.html
index 48ff447..7237a8a 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionChore.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionChore.html
@@ -1203,713 +1203,719 @@
 <span class="sourceLineNo">1195</span>    private void update(final Collection&lt;RegionState&gt; regions, final long currentTime) {<a name="line.1195"></a>
 <span class="sourceLineNo">1196</span>      for (RegionState state: regions) {<a name="line.1196"></a>
 <span class="sourceLineNo">1197</span>        totalRITs++;<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>        final long ritTime = currentTime - state.getStamp();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>        if (ritTime &gt; ritThreshold) {<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>          if (ritsOverThreshold == null) {<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>            ritsOverThreshold = new HashMap&lt;String, RegionState&gt;();<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          }<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>          ritsOverThreshold.put(state.getRegion().getEncodedName(), state);<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>          totalRITsTwiceThreshold += (ritTime &gt; (ritThreshold * 2)) ? 1 : 0;<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>        }<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>        if (oldestRITTime &lt; ritTime) {<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>          oldestRITTime = ritTime;<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>        }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>      }<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>    }<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>  }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span><a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>  private void updateRegionsInTransitionMetrics(final RegionInTransitionStat ritStat) {<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>    metrics.updateRITOldestAge(ritStat.getOldestRITTime());<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    metrics.updateRITCount(ritStat.getTotalRITs());<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>    metrics.updateRITCountOverThreshold(ritStat.getTotalRITsOverThreshold());<a name="line.1216"></a>
+<span class="sourceLineNo">1198</span>        final long ritStartedMs = state.getStamp();<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>        if (ritStartedMs == 0) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>          // Don't output bogus values to metrics if they accidentally make it here.<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>          LOG.warn("The RIT {} has no start time", state.getRegion());<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>          continue;<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>        }<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>        final long ritTime = currentTime - ritStartedMs;<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>        if (ritTime &gt; ritThreshold) {<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>          if (ritsOverThreshold == null) {<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>            ritsOverThreshold = new HashMap&lt;String, RegionState&gt;();<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>          }<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>          ritsOverThreshold.put(state.getRegion().getEncodedName(), state);<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>          totalRITsTwiceThreshold += (ritTime &gt; (ritThreshold * 2)) ? 1 : 0;<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>        }<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>        if (oldestRITTime &lt; ritTime) {<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>          oldestRITTime = ritTime;<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>        }<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>      }<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>    }<a name="line.1216"></a>
 <span class="sourceLineNo">1217</span>  }<a name="line.1217"></a>
 <span class="sourceLineNo">1218</span><a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>  private void handleRegionOverStuckWarningThreshold(final RegionInfo regionInfo) {<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    final RegionStateNode regionNode = regionStates.getRegionStateNode(regionInfo);<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>    //if (regionNode.isStuck()) {<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>    LOG.warn("STUCK Region-In-Transition {}", regionNode);<a name="line.1222"></a>
+<span class="sourceLineNo">1219</span>  private void updateRegionsInTransitionMetrics(final RegionInTransitionStat ritStat) {<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>    metrics.updateRITOldestAge(ritStat.getOldestRITTime());<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>    metrics.updateRITCount(ritStat.getTotalRITs());<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>    metrics.updateRITCountOverThreshold(ritStat.getTotalRITsOverThreshold());<a name="line.1222"></a>
 <span class="sourceLineNo">1223</span>  }<a name="line.1223"></a>
 <span class="sourceLineNo">1224</span><a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>  // ============================================================================================<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>  //  TODO: Master load/bootstrap<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>  // ============================================================================================<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>  public void joinCluster() throws IOException {<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    long startTime = System.nanoTime();<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>    LOG.debug("Joining cluster...");<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span><a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    // Scan hbase:meta to build list of existing regions, servers, and assignment.<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    // hbase:meta is online now or will be. Inside loadMeta, we keep trying. Can't make progress<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    // w/o  meta.<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    loadMeta();<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span><a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>    while (master.getServerManager().countOfRegionServers() &lt; 1) {<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      LOG.info("Waiting for RegionServers to join; current count={}",<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>        master.getServerManager().countOfRegionServers());<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>      Threads.sleep(250);<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    }<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>    LOG.info("Number of RegionServers={}", master.getServerManager().countOfRegionServers());<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span><a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    // Start the RIT chore<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    master.getMasterProcedureExecutor().addChore(this.ritChore);<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span><a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    long costMs = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startTime);<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>    LOG.info("Joined the cluster in {}", StringUtils.humanTimeDiff(costMs));<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>  }<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span><a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>  /**<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>   * Create assign procedure for offline regions.<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>   * Just follow the old processofflineServersWithOnlineRegions method. Since now we do not need to<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>   * deal with dead server any more, we only deal with the regions in OFFLINE state in this method.<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>   * And this is a bit strange, that for new regions, we will add it in CLOSED state instead of<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>   * OFFLINE state, and usually there will be a procedure to track them. The<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>   * processofflineServersWithOnlineRegions is a legacy from long ago, as things are going really<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>   * different now, maybe we do not need this method any more. Need to revisit later.<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>   */<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>  // Public so can be run by the Master as part of the startup. Needs hbase:meta to be online.<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>  // Needs to be done after the table state manager has been started.<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>  public void processOfflineRegions() {<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    List&lt;RegionInfo&gt; offlineRegions = regionStates.getRegionStates().stream()<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>      .filter(RegionState::isOffline).filter(s -&gt; isTableEnabled(s.getRegion().getTable()))<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>      .map(RegionState::getRegion).collect(Collectors.toList());<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    if (!offlineRegions.isEmpty()) {<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>      master.getMasterProcedureExecutor().submitProcedures(<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>        master.getAssignmentManager().createRoundRobinAssignProcedures(offlineRegions));<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    }<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>  }<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span><a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>  private void loadMeta() throws IOException {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    // TODO: use a thread pool<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>    regionStateStore.visitMeta(new RegionStateStore.RegionStateVisitor() {<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>      @Override<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      public void visitRegionState(Result result, final RegionInfo regionInfo, final State state,<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>          final ServerName regionLocation, final ServerName lastHost, final long openSeqNum) {<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>        if (state == null &amp;&amp; regionLocation == null &amp;&amp; lastHost == null &amp;&amp;<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>            openSeqNum == SequenceId.NO_SEQUENCE_ID) {<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>          // This is a row with nothing in it.<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>          LOG.warn("Skipping empty row={}", result);<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>          return;<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>        }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>        State localState = state;<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>        if (localState == null) {<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>          // No region state column data in hbase:meta table! Are I doing a rolling upgrade from<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>          // hbase1 to hbase2? Am I restoring a SNAPSHOT or otherwise adding a region to hbase:meta?<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>          // In any of these cases, state is empty. For now, presume OFFLINE but there are probably<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>          // cases where we need to probe more to be sure this correct; TODO informed by experience.<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>          LOG.info(regionInfo.getEncodedName() + " regionState=null; presuming " + State.OFFLINE);<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span><a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>          localState = State.OFFLINE;<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>        }<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>        RegionStateNode regionNode = regionStates.getOrCreateRegionStateNode(regionInfo);<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>        // Do not need to lock on regionNode, as we can make sure that before we finish loading<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>        // meta, all the related procedures can not be executed. The only exception is for meta<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>        // region related operations, but here we do not load the informations for meta region.<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>        regionNode.setState(localState);<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>        regionNode.setLastHost(lastHost);<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>        regionNode.setRegionLocation(regionLocation);<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>        regionNode.setOpenSeqNum(openSeqNum);<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span><a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>        // Note: keep consistent with other methods, see region(Opening|Opened|Closing)<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>        //       RIT/ServerCrash handling should take care of the transiting regions.<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>        if (localState.matches(State.OPEN, State.OPENING, State.CLOSING, State.SPLITTING,<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>          State.MERGING)) {<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>          assert regionLocation != null : "found null region location for " + regionNode;<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>          regionStates.addRegionToServer(regionNode);<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>        } else if (localState == State.OFFLINE || regionInfo.isOffline()) {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>          regionStates.addToOfflineRegions(regionNode);<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>        }<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>      }<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    });<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span><a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>    // every assignment is blocked until meta is loaded.<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    wakeMetaLoadedEvent();<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>  }<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span><a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>  /**<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>   * Used to check if the meta loading is done.<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>   * &lt;p/&gt;<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>   * if not we throw PleaseHoldException since we are rebuilding the RegionStates<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>   * @param hri region to check if it is already rebuild<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>   * @throws PleaseHoldException if meta has not been loaded yet<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>   */<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>  private void checkMetaLoaded(RegionInfo hri) throws PleaseHoldException {<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>    if (!isRunning()) {<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>      throw new PleaseHoldException("AssignmentManager not running");<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    }<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>    boolean meta = isMetaRegion(hri);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>    boolean metaLoaded = isMetaLoaded();<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>    if (!meta &amp;&amp; !metaLoaded) {<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>      throw new PleaseHoldException(<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>        "Master not fully online; hbase:meta=" + meta + ", metaLoaded=" + metaLoaded);<a name="line.1334"></a>
+<span class="sourceLineNo">1225</span>  private void handleRegionOverStuckWarningThreshold(final RegionInfo regionInfo) {<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>    final RegionStateNode regionNode = regionStates.getRegionStateNode(regionInfo);<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>    //if (regionNode.isStuck()) {<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    LOG.warn("STUCK Region-In-Transition {}", regionNode);<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>  }<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span><a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>  // ============================================================================================<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>  //  TODO: Master load/bootstrap<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>  // ============================================================================================<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>  public void joinCluster() throws IOException {<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>    long startTime = System.nanoTime();<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>    LOG.debug("Joining cluster...");<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span><a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>    // Scan hbase:meta to build list of existing regions, servers, and assignment.<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>    // hbase:meta is online now or will be. Inside loadMeta, we keep trying. Can't make progress<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>    // w/o  meta.<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>    loadMeta();<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span><a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>    while (master.getServerManager().countOfRegionServers() &lt; 1) {<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>      LOG.info("Waiting for RegionServers to join; current count={}",<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>        master.getServerManager().countOfRegionServers());<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>      Threads.sleep(250);<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    }<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>    LOG.info("Number of RegionServers={}", master.getServerManager().countOfRegionServers());<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span><a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>    // Start the RIT chore<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>    master.getMasterProcedureExecutor().addChore(this.ritChore);<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span><a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>    long costMs = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startTime);<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>    LOG.info("Joined the cluster in {}", StringUtils.humanTimeDiff(costMs));<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>  }<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span><a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>  /**<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>   * Create assign procedure for offline regions.<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>   * Just follow the old processofflineServersWithOnlineRegions method. Since now we do not need to<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>   * deal with dead server any more, we only deal with the regions in OFFLINE state in this method.<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>   * And this is a bit strange, that for new regions, we will add it in CLOSED state instead of<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>   * OFFLINE state, and usually there will be a procedure to track them. The<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>   * processofflineServersWithOnlineRegions is a legacy from long ago, as things are going really<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>   * different now, maybe we do not need this method any more. Need to revisit later.<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>   */<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>  // Public so can be run by the Master as part of the startup. Needs hbase:meta to be online.<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>  // Needs to be done after the table state manager has been started.<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>  public void processOfflineRegions() {<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>    List&lt;RegionInfo&gt; offlineRegions = regionStates.getRegionStates().stream()<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>      .filter(RegionState::isOffline).filter(s -&gt; isTableEnabled(s.getRegion().getTable()))<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>      .map(RegionState::getRegion).collect(Collectors.toList());<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    if (!offlineRegions.isEmpty()) {<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>      master.getMasterProcedureExecutor().submitProcedures(<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>        master.getAssignmentManager().createRoundRobinAssignProcedures(offlineRegions));<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>    }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>  }<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span><a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>  private void loadMeta() throws IOException {<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>    // TODO: use a thread pool<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>    regionStateStore.visitMeta(new RegionStateStore.RegionStateVisitor() {<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>      @Override<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>      public void visitRegionState(Result result, final RegionInfo regionInfo, final State state,<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>          final ServerName regionLocation, final ServerName lastHost, final long openSeqNum) {<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>        if (state == null &amp;&amp; regionLocation == null &amp;&amp; lastHost == null &amp;&amp;<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>            openSeqNum == SequenceId.NO_SEQUENCE_ID) {<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>          // This is a row with nothing in it.<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>          LOG.warn("Skipping empty row={}", result);<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>          return;<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>        }<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>        State localState = state;<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>        if (localState == null) {<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>          // No region state column data in hbase:meta table! Are I doing a rolling upgrade from<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>          // hbase1 to hbase2? Am I restoring a SNAPSHOT or otherwise adding a region to hbase:meta?<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>          // In any of these cases, state is empty. For now, presume OFFLINE but there are probably<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>          // cases where we need to probe more to be sure this correct; TODO informed by experience.<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>          LOG.info(regionInfo.getEncodedName() + " regionState=null; presuming " + State.OFFLINE);<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>          localState = State.OFFLINE;<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>        }<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>        RegionStateNode regionNode = regionStates.getOrCreateRegionStateNode(regionInfo);<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>        // Do not need to lock on regionNode, as we can make sure that before we finish loading<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>        // meta, all the related procedures can not be executed. The only exception is for meta<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>        // region related operations, but here we do not load the informations for meta region.<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>        regionNode.setState(localState);<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>        regionNode.setLastHost(lastHost);<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>        regionNode.setRegionLocation(regionLocation);<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>        regionNode.setOpenSeqNum(openSeqNum);<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span><a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>        // Note: keep consistent with other methods, see region(Opening|Opened|Closing)<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>        //       RIT/ServerCrash handling should take care of the transiting regions.<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>        if (localState.matches(State.OPEN, State.OPENING, State.CLOSING, State.SPLITTING,<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>          State.MERGING)) {<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>          assert regionLocation != null : "found null region location for " + regionNode;<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>          regionStates.addRegionToServer(regionNode);<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>        } else if (localState == State.OFFLINE || regionInfo.isOffline()) {<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>          regionStates.addToOfflineRegions(regionNode);<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>        }<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>      }<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>    });<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span><a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    // every assignment is blocked until meta is loaded.<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>    wakeMetaLoadedEvent();<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>  }<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span><a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>  /**<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>   * Used to check if the meta loading is done.<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>   * &lt;p/&gt;<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>   * if not we throw PleaseHoldException since we are rebuilding the RegionStates<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>   * @param hri region to check if it is already rebuild<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>   * @throws PleaseHoldException if meta has not been loaded yet<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>   */<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>  private void checkMetaLoaded(RegionInfo hri) throws PleaseHoldException {<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>    if (!isRunning()) {<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>      throw new PleaseHoldException("AssignmentManager not running");<a name="line.1334"></a>
 <span class="sourceLineNo">1335</span>    }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>  }<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span><a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>  // ============================================================================================<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>  //  TODO: Metrics<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>  // ============================================================================================<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>  public int getNumRegionsOpened() {<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>    // TODO: Used by TestRegionPlacement.java and assume monotonically increasing value<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>    return 0;<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>  }<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span><a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>  public long submitServerCrash(ServerName serverName, boolean shouldSplitWal) {<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>    boolean carryingMeta;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>    long pid;<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>    ServerStateNode serverNode = regionStates.getServerNode(serverName);<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>    if(serverNode == null){<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      LOG.info("Skip to add SCP for {} since this server should be OFFLINE already", serverName);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>      return -1;<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>    }<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>    // we hold the write lock here for fencing on reportRegionStateTransition. Once we set the<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>    // server state to CRASHED, we will no longer accept the reportRegionStateTransition call from<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>    // this server. This is used to simplify the implementation for TRSP and SCP, where we can make<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    // sure that, the region list fetched by SCP will not be changed any more.<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>    serverNode.writeLock().lock();<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>    try {<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>      ProcedureExecutor&lt;MasterProcedureEnv&gt; procExec = this.master.getMasterProcedureExecutor();<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>      carryingMeta = isCarryingMeta(serverName);<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>      if (!serverNode.isInState(ServerState.ONLINE)) {<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>        LOG.info(<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>          "Skip to add SCP for {} with meta= {}, " +<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>              "since there should be a SCP is processing or already done for this server node",<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>          serverName, carryingMeta);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>        return -1;<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>      } else {<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>        serverNode.setState(ServerState.CRASHED);<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>        pid = procExec.submitProcedure(new ServerCrashProcedure(procExec.getEnvironment(),<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>            serverName, shouldSplitWal, carryingMeta));<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>        LOG.info(<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>          "Added {} to dead servers which carryingMeta={}, submitted ServerCrashProcedure pid={}",<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>          serverName, carryingMeta, pid);<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>      }<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>    } finally {<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>      serverNode.writeLock().unlock();<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>    }<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>    return pid;<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>  }<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span><a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>  public void offlineRegion(final RegionInfo regionInfo) {<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    // TODO used by MasterRpcServices<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    RegionStateNode node = regionStates.getRegionStateNode(regionInfo);<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>    if (node != null) {<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>      node.offline();<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>    }<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>  }<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span><a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>  public void onlineRegion(final RegionInfo regionInfo, final ServerName serverName) {<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>    // TODO used by TestSplitTransactionOnCluster.java<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>  }<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span><a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; getSnapShotOfAssignment(<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>      final Collection&lt;RegionInfo&gt; regions) {<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>    return regionStates.getSnapShotOfAssignment(regions);<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>  }<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span><a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>  // ============================================================================================<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>  //  TODO: UTILS/HELPERS?<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>  // ============================================================================================<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>  /**<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>   * Used by the client (via master) to identify if all regions have the schema updates<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>   *<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>   * @param tableName<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>   * @return Pair indicating the status of the alter command (pending/total)<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>   * @throws IOException<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>   */<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>  public Pair&lt;Integer, Integer&gt; getReopenStatus(TableName tableName) {<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>    if (isTableDisabled(tableName)) return new Pair&lt;Integer, Integer&gt;(0, 0);<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span><a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>    final List&lt;RegionState&gt; states = regionStates.getTableRegionStates(tableName);<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>    int ritCount = 0;<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>    for (RegionState regionState: states) {<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>      if (!regionState.isOpened() &amp;&amp; !regionState.isSplit()) {<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>        ritCount++;<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>      }<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    }<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>    return new Pair&lt;Integer, Integer&gt;(ritCount, states.size());<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>  }<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span><a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>  // ============================================================================================<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>  //  TODO: Region State In Transition<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>  // ============================================================================================<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>  public boolean hasRegionsInTransition() {<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>    return regionStates.hasRegionsInTransition();<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>  }<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span><a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>  public List&lt;RegionStateNode&gt; getRegionsInTransition() {<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>    return regionStates.getRegionsInTransition();<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>  }<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span><a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>  public List&lt;RegionInfo&gt; getAssignedRegions() {<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>    return regionStates.getAssignedRegions();<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>  }<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span><a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>  public RegionInfo getRegionInfo(final byte[] regionName) {<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    final RegionStateNode regionState = regionStates.getRegionStateNodeFromName(regionName);<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    return regionState != null ? regionState.getRegionInfo() : null;<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>  }<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span><a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>  // ============================================================================================<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>  //  Expected states on region state transition.<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>  //  Notice that there is expected states for transiting to OPENING state, this is because SCP.<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>  //  See the comments in regionOpening method for more details.<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>  // ============================================================================================<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>  private static final State[] STATES_EXPECTED_ON_OPEN = {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>    State.OPENING, // Normal case<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>    State.OPEN // Retrying<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>  };<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span><a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>  private static final State[] STATES_EXPECTED_ON_CLOSING = {<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    State.OPEN, // Normal case<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    State.CLOSING, // Retrying<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>    State.SPLITTING, // Offline the split parent<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>    State.MERGING // Offline the merge parents<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>  };<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span><a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>  private static final State[] STATES_EXPECTED_ON_CLOSED = {<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>    State.CLOSING, // Normal case<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>    State.CLOSED // Retrying<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>  };<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span><a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>  // This is for manually scheduled region assign, can add other states later if we find out other<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>  // usages<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>  private static final State[] STATES_EXPECTED_ON_ASSIGN = { State.CLOSED, State.OFFLINE };<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span><a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>  // We only allow unassign or move a region which is in OPEN state.<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>  private static final State[] STATES_EXPECTED_ON_UNASSIGN_OR_MOVE = { State.OPEN };<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span><a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>  // ============================================================================================<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>  //  Region Status update<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>  //  Should only be called in TransitRegionStateProcedure<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>  // ============================================================================================<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>  private void transitStateAndUpdate(RegionStateNode regionNode, RegionState.State newState,<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>      RegionState.State... expectedStates) throws IOException {<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>    RegionState.State state = regionNode.getState();<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>    regionNode.transitionState(newState, expectedStates);<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>    boolean succ = false;<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>    try {<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>      regionStateStore.updateRegionLocation(regionNode);<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>      succ = true;<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>    } finally {<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>      if (!succ) {<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>        // revert<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>        regionNode.setState(state);<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>      }<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>    }<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>  }<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span><a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>  // should be called within the synchronized block of RegionStateNode<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>  void regionOpening(RegionStateNode regionNode) throws IOException {<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>    // As in SCP, for performance reason, there is no TRSP attached with this region, we will not<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>    // update the region state, which means that the region could be in any state when we want to<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>    // assign it after a RS crash. So here we do not pass the expectedStates parameter.<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>    transitStateAndUpdate(regionNode, State.OPENING);<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>    regionStates.addRegionToServer(regionNode);<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>    // update the operation count metrics<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>    metrics.incrementOperationCounter();<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>  }<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span><a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>  // should be called within the synchronized block of RegionStateNode.<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>  // The parameter 'giveUp' means whether we will try to open the region again, if it is true, then<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span>  // we will persist the FAILED_OPEN state into hbase:meta.<a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>  void regionFailedOpen(RegionStateNode regionNode, boolean giveUp) throws IOException {<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>    RegionState.State state = regionNode.getState();<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>    ServerName regionLocation = regionNode.getRegionLocation();<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>    if (giveUp) {<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>      regionNode.setState(State.FAILED_OPEN);<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span>      regionNode.setRegionLocation(null);<a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>      boolean succ = false;<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>      try {<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>        regionStateStore.updateRegionLocation(regionNode);<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>        succ = true;<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>      } finally {<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>        if (!succ) {<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>          // revert<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>          regionNode.setState(state);<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>          regionNode.setRegionLocation(regionLocation);<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span>        }<a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>      }<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span>    }<a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>    if (regionLocation != null) {<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>      regionStates.removeRegionFromServer(regionLocation, regionNode);<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>    }<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>  }<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span><a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>  // should be called within the synchronized block of RegionStateNode<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>  void regionOpened(RegionStateNode regionNode) throws IOException {<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>    // TODO: OPENING Updates hbase:meta too... we need to do both here and there?<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span>    // That is a lot of hbase:meta writing.<a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>    transitStateAndUpdate(regionNode, State.OPEN, STATES_EXPECTED_ON_OPEN);<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>    RegionInfo hri = regionNode.getRegionInfo();<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>    if (isMetaRegion(hri)) {<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span>      // Usually we'd set a table ENABLED at this stage but hbase:meta is ALWAYs enabled, it<a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>      // can't be disabled -- so skip the RPC (besides... enabled is managed by TableStateManager<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>      // which is backed by hbase:meta... Avoid setting ENABLED to avoid having to update state<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>      // on table that contains state.<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>      setMetaAssigned(hri, true);<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>    }<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>    regionStates.addRegionToServer(regionNode);<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>    regionStates.removeFromFailedOpen(hri);<a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>  }<a name="line.1543"></a>
-<span class="sourceLineNo">1544</span><a name="line.1544"></a>
-<span class="sourceLineNo">1545</span>  // should be called within the synchronized block of RegionStateNode<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span>  void regionClosing(RegionStateNode regionNode) throws IOException {<a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>    transitStateAndUpdate(regionNode, State.CLOSING, STATES_EXPECTED_ON_CLOSING);<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span><a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>    RegionInfo hri = regionNode.getRegionInfo();<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>    // Set meta has not initialized early. so people trying to create/edit tables will wait<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>    if (isMetaRegion(hri)) {<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>      setMetaAssigned(hri, false);<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>    }<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>    regionStates.addRegionToServer(regionNode);<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>    // update the operation count metrics<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>    metrics.incrementOperationCounter();<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>  }<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span><a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>  // should be called within the synchronized block of RegionStateNode<a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>  // The parameter 'normally' means whether we are closed cleanly, if it is true, then it means that<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>  // we are closed due to a RS crash.<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>  void regionClosed(RegionStateNode regionNode, boolean normally) throws IOException {<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span>    RegionState.State state = regionNode.getState();<a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>    ServerName regionLocation = regionNode.getRegionLocation();<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>    if (normally) {<a name="line.1565"></a>
-<span class="sourceLineNo">1566</span>      regionNode.transitionState(State.CLOSED, STATES_EXPECTED_ON_CLOSED);<a name="line.1566"></a>
-<span class="sourceLineNo">1567</span>    } else {<a name="line.1567"></a>
-<span class="sourceLineNo">1568</span>      // For SCP<a name="line.1568"></a>
-<span class="sourceLineNo">1569</span>      regionNode.transitionState(State.ABNORMALLY_CLOSED);<a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>    }<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>    regionNode.setRegionLocation(null);<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>    boolean succ = false;<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>    try {<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span>      regionStateStore.updateRegionLocation(regionNode);<a name="line.1574"></a>
-<span class="sourceLineNo">1575</span>      succ = true;<a name="line.1575"></a>
-<span class="sourceLineNo">1576</span>    } finally {<a name="line.1576"></a>
-<span class="sourceLineNo">1577</span>      if (!succ) {<a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>        // revert<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>        regionNode.setState(state);<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>        regionNode.setRegionLocation(regionLocation);<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span>      }<a name="line.1581"></a>
-<span class="sourceLineNo">1582</span>    }<a name="line.1582"></a>
-<span class="sourceLineNo">1583</span>    if (regionLocation != null) {<a name="line.1583"></a>
-<span class="sourceLineNo">1584</span>      regionNode.setLastHost(regionLocation);<a name="line.1584"></a>
-<span class="sourceLineNo">1585</span>      regionStates.removeRegionFromServer(regionLocation, regionNode);<a name="line.1585"></a>
-<span class="sourceLineNo">1586</span>    }<a name="line.1586"></a>
-<span class="sourceLineNo">1587</span>  }<a name="line.1587"></a>
-<span class="sourceLineNo">1588</span><a name="line.1588"></a>
-<span class="sourceLineNo">1589</span>  public void markRegionAsSplit(final RegionInfo parent, final ServerName serverName,<a name="line.1589"></a>
-<span class="sourceLineNo">1590</span>      final RegionInfo daughterA, final RegionInfo daughterB) throws IOException {<a name="line.1590"></a>
-<span class="sourceLineNo">1591</span>    // Update hbase:meta. Parent will be marked offline and split up in hbase:meta.<a name="line.1591"></a>
-<span class="sourceLineNo">1592</span>    // The parent stays in regionStates until cleared when removed by CatalogJanitor.<a name="line.1592"></a>
-<span class="sourceLineNo">1593</span>    // Update its state in regionStates to it shows as offline and split when read<a name="line.1593"></a>
-<span class="sourceLineNo">1594</span>    // later figuring what regions are in a table and what are not: see<a name="line.1594"></a>
-<span class="sourceLineNo">1595</span>    // regionStates#getRegionsOfTable<a name="line.1595"></a>
-<span class="sourceLineNo">1596</span>    final RegionStateNode node = regionStates.getOrCreateRegionStateNode(parent);<a name="line.1596"></a>
-<span class="sourceLineNo">1597</span>    node.setState(State.SPLIT);<a name="line.1597"></a>
-<span class="sourceLineNo">1598</span>    final RegionStateNode nodeA = regionStates.getOrCreateRegionStateNode(daughterA);<a name="line.1598"></a>
-<span class="sourceLineNo">1599</span>    nodeA.setState(State.SPLITTING_NEW);<a name="line.1599"></a>
-<span class="sourceLineNo">1600</span>    final RegionStateNode nodeB = regionStates.getOrCreateRegionStateNode(daughterB);<a name="line.1600"></a>
-<span class="sourceLineNo">1601</span>    nodeB.setState(State.SPLITTING_NEW);<a name="line.1601"></a>
-<span class="sourceLineNo">1602</span><a name="line.1602"></a>
-<span class="sourceLineNo">1603</span>    regionStateStore.splitRegion(parent, daughterA, daughterB, serverName);<a name="line.1603"></a>
-<span class="sourceLineNo">1604</span>    if (shouldAssignFavoredNodes(parent)) {<a name="line.1604"></a>
-<span class="sourceLineNo">1605</span>      List&lt;ServerName&gt; onlineServers = this.master.getServerManager().getOnlineServersList();<a name="line.1605"></a>
-<span class="sourceLineNo">1606</span>      ((FavoredNodesPromoter)getBalancer()).<a name="line.1606"></a>
-<span class="sourceLineNo">1607</span>          generateFavoredNodesForDaughter(onlineServers, parent, daughterA, daughterB);<a name="line.1607"></a>
-<span class="sourceLineNo">1608</span>    }<a name="line.1608"></a>
-<span class="sourceLineNo">1609</span>  }<a name="line.1609"></a>
-<span class="sourceLineNo">1610</span><a name="line.1610"></a>
-<span class="sourceLineNo">1611</span>  /**<a name="line.1611"></a>
-<span class="sourceLineNo">1612</span>   * When called here, the merge has happened. The two merged regions have been<a name="line.1612"></a>
-<span class="sourceLineNo">1613</span>   * unassigned and the above markRegionClosed has been called on each so they have been<a name="line.1613"></a>
-<span class="sourceLineNo">1614</span>   * disassociated from a hosting Server. The merged region will be open after this call. The<a name="line.1614"></a>
-<span class="sourceLineNo">1615</span>   * merged regions are removed from hbase:meta below&gt; Later they are deleted from the filesystem<a name="line.1615"></a>
-<span class="sourceLineNo">1616</span>   * by the catalog janitor running against hbase:meta. It notices when the merged region no<a name="line.1616"></a>
-<span class="sourceLineNo">1617</span>   * longer holds references to the old regions.<a name="line.1617"></a>
-<span class="sourceLineNo">1618</span>   */<a name="line.1618"></a>
-<span class="sourceLineNo">1619</span>  public void markRegionAsMerged(final RegionInfo child, final ServerName serverName,<a name="line.1619"></a>
-<span class="sourceLineNo">1620</span>      final RegionInfo mother, final RegionInfo father) throws IOException {<a name="line.1620"></a>
-<span class="sourceLineNo">1621</span>    final RegionStateNode node = regionStates.getOrCreateRegionStateNode(child);<a name="line.1621"></a>
-<span class="sourceLineNo">1622</span>    node.setState(State.MERGED);<a name="line.1622"></a>
-<span class="sourceLineNo">1623</span>    regionStates.deleteRegion(mother);<a name="line.1623"></a>
-<span class="sourceLineNo">1624</span>    regionStates.deleteRegion(father);<a name="line.1624"></a>
-<span class="sourceLineNo">1625</span>    regionStateStore.mergeRegions(child, mother, father, serverName);<a name="line.1625"></a>
-<span class="sourceLineNo">1626</span>    if (shouldAssignFavoredNodes(child)) {<a name="line.1626"></a>
-<span class="sourceLineNo">1627</span>      ((FavoredNodesPromoter)getBalancer()).<a name="line.1627"></a>
-<span class="sourceLineNo">1628</span>        generateFavoredNodesForMergedRegion(child, mother, father);<a name="line.1628"></a>
-<span class="sourceLineNo">1629</span>    }<a name="line.1629"></a>
-<span class="sourceLineNo">1630</span>  }<a name="line.1630"></a>
-<span class="sourceLineNo">1631</span><a name="line.1631"></a>
-<span class="sourceLineNo">1632</span>  /*<a name="line.1632"></a>
-<span class="sourceLineNo">1633</span>   * Favored nodes should be applied only when FavoredNodes balancer is configured and the region<a name="line.1633"></a>
-<span class="sourceLineNo">1634</span>   * belongs to a non-system table.<a name="line.1634"></a>
-<span class="sourceLineNo">1635</span>   */<a name="line.1635"></a>
-<span class="sourceLineNo">1636</span>  private boolean shouldAssignFavoredNodes(RegionInfo region) {<a name="line.1636"></a>
-<span class="sourceLineNo">1637</span>    return this.shouldAssignRegionsWithFavoredNodes &amp;&amp;<a name="line.1637"></a>
-<span class="sourceLineNo">1638</span>        FavoredNodesManager.isFavoredNodeApplicable(region);<a name="line.1638"></a>
-<span class="sourceLineNo">1639</span>  }<a name="line.1639"></a>
-<span class="sourceLineNo">1640</span><a name="line.1640"></a>
-<span class="sourceLineNo">1641</span>  // ============================================================================================<a name="line.1641"></a>
-<span class="sourceLineNo">1642</span>  //  Assign Queue (Assign/Balance)<a name="line.1642"></a>
-<span class="sourceLineNo">1643</span>  // ============================================================================================<a name="line.1643"></a>
-<span class="sourceLineNo">1644</span>  private final ArrayList&lt;RegionStateNode&gt; pendingAssignQueue = new ArrayList&lt;RegionStateNode&gt;();<a name="line.1644"></a>
-<span class="sourceLineNo">1645</span>  private final ReentrantLock assignQueueLock = new ReentrantLock();<a name="line.1645"></a>
-<span class="sourceLineNo">1646</span>  private final Condition assignQueueFullCond = assignQueueLock.newCondition();<a name="line.1646"></a>
-<span class="sourceLineNo">1647</span><a name="line.1647"></a>
-<span class="sourceLineNo">1648</span>  /**<a name="line.1648"></a>
-<span class="sourceLineNo">1649</span>   * Add the assign operation to the assignment queue.<a name="line.1649"></a>
-<span class="sourceLineNo">1650</span>   * The pending assignment operation will be processed,<a name="line.1650"></a>
-<span class="sourceLineNo">1651</span>   * and each region will be assigned by a server using the balancer.<a name="line.1651"></a>
-<span class="sourceLineNo">1652</span>   */<a name="line.1652"></a>
-<span class="sourceLineNo">1653</span>  protected void queueAssign(final RegionStateNode regionNode) {<a name="line.1653"></a>
-<span class="sourceLineNo">1654</span>    regionNode.getProcedureEvent().suspend();<a name="line.1654"></a>
-<span class="sourceLineNo">1655</span><a name="line.1655"></a>
-<span class="sourceLineNo">1656</span>    // TODO: quick-start for meta and the other sys-tables?<a name="line.1656"></a>
-<span class="sourceLineNo">1657</span>    assignQueueLock.lock();<a name="line.1657"></a>
-<span class="sourceLineNo">1658</span>    try {<a name="line.1658"></a>
-<span class="sourceLineNo">1659</span>      pendingAssignQueue.add(regionNode);<a name="line.1659"></a>
-<span class="sourceLineNo">1660</span>      if (regionNode.isSystemTable() ||<a name="line.1660"></a>
-<span class="sourceLineNo">1661</span>          pendingAssignQueue.size() == 1 ||<a name="line.1661"></a>
-<span class="sourceLineNo">1662</span>          pendingAssignQueue.size() &gt;= assignDispatchWaitQueueMaxSize) {<a name="line.1662"></a>
-<span class="sourceLineNo">1663</span>        assignQueueFullCond.signal();<a name="line.1663"></a>
-<span class="sourceLineNo">1664</span>      }<a name="line.1664"></a>
-<span class="sourceLineNo">1665</span>    } finally {<a name="line.1665"></a>
-<span class="sourceLineNo">1666</span>      assignQueueLock.unlock();<a name="line.1666"></a>
-<span class="sourceLineNo">1667</span>    }<a name="line.1667"></a>
-<span class="sourceLineNo">1668</span>  }<a name="line.1668"></a>
-<span class="sourceLineNo">1669</span><a name="line.1669"></a>
-<span class="sourceLineNo">1670</span>  private void startAssignmentThread() {<a name="line.1670"></a>
-<span class="sourceLineNo">1671</span>    // Get Server Thread name. Sometimes the Server is mocked so may not implement HasThread.<a name="line.1671"></a>
-<span class="sourceLineNo">1672</span>    // For example, in tests.<a name="line.1672"></a>
-<span class="sourceLineNo">1673</span>    String name = master instanceof HasThread? ((HasThread)master).getName():<a name="line.1673"></a>
-<span class="sourceLineNo">1674</span>        master.getServerName().toShortString();<a name="line.1674"></a>
-<span class="sourceLineNo">1675</span>    assignThread = new Thread(name) {<a name="line.1675"></a>
-<span class="sourceLineNo">1676</span>      @Override<a name="line.1676"></a>
-<span class="sourceLineNo">1677</span>      public void run() {<a name="line.1677"></a>
-<span class="sourceLineNo">1678</span>        while (isRunning()) {<a name="line.1678"></a>
-<span class="sourceLineNo">1679</span>          processAssignQueue();<a name="line.1679"></a>
-<span class="sourceLineNo">1680</span>        }<a name="line.1680"></a>
-<span class="sourceLineNo">1681</span>        pendingAssignQueue.clear();<a name="line.1681"></a>
-<span class="sourceLineNo">1682</span>      }<a name="line.1682"></a>
-<span class="sourceLineNo">1683</span>    };<a name="line.1683"></a>
-<span class="sourceLineNo">1684</span>    assignThread.setDaemon(true);<a name="line.1684"></a>
-<span class="sourceLineNo">1685</span>    assignThread.start();<a name="line.1685"></a>
-<span class="sourceLineNo">1686</span>  }<a name="line.1686"></a>
-<span class="sourceLineNo">1687</span><a name="line.1687"></a>
-<span class="sourceLineNo">1688</span>  private void stopAssignmentThread() {<a name="line.1688"></a>
-<span class="sourceLineNo">1689</span>    assignQueueSignal();<a name="line.1689"></a>
-<span class="sourceLineNo">1690</span>    try {<a name="line.1690"></a>
-<span class="sourceLineNo">1691</span>      while (assignThread.isAlive()) {<a name="line.1691"></a>
-<span class="sourceLineNo">1692</span>        assignQueueSignal();<a name="line.1692"></a>
-<span class="sourceLineNo">1693</span>        assignThread.join(250);<a name="line.1693"></a>
-<span class="sourceLineNo">1694</span>      }<a name="line.1694"></a>
-<span class="sourceLineNo">1695</span>    } catch (InterruptedException e) {<a name="line.1695"></a>
-<span class="sourceLineNo">1696</span>      LOG.warn("join interrupted", e);<a name="line.1696"></a>
-<span class="sourceLineNo">1697</span>      Thread.currentThread().interrupt();<a name="line.1697"></a>
-<span class="sourceLineNo">1698</span>    }<a name="line.1698"></a>
-<span class="sourceLineNo">1699</span>  }<a name="line.1699"></a>
-<span class="sourceLineNo">1700</span><a name="line.1700"></a>
-<span class="sourceLineNo">1701</span>  private void assignQueueSignal() {<a name="line.1701"></a>
-<span class="sourceLineNo">1702</span>    assignQueueLock.lock();<a name="line.1702"></a>
-<span class="sourceLineNo">1703</span>    try {<a name="line.1703"></a>
-<span class="sourceLineNo">1704</span>      assignQueueFullCond.signal();<a name="line.1704"></a>
-<span class="sourceLineNo">1705</span>    } finally {<a name="line.1705"></a>
-<span class="sourceLineNo">1706</span>      assignQueueLock.unlock();<a name="line.1706"></a>
-<span class="sourceLineNo">1707</span>    }<a name="line.1707"></a>
-<span class="sourceLineNo">1708</span>  }<a name="line.1708"></a>
-<span class="sourceLineNo">1709</span><a name="line.1709"></a>
-<span class="sourceLineNo">1710</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings("WA_AWAIT_NOT_IN_LOOP")<a name="line.1710"></a>
-<span class="sourceLineNo">1711</span>  private HashMap&lt;RegionInfo, RegionStateNode&gt; waitOnAssignQueue() {<a name="line.1711"></a>
-<span class="sourceLineNo">1712</span>    HashMap&lt;RegionInfo, RegionStateNode&gt; regions = null;<a name="line.1712"></a>
-<span class="sourceLineNo">1713</span><a name="line.1713"></a>
-<span class="sourceLineNo">1714</span>    assignQueueLock.lock();<a name="line.1714"></a>
-<span class="sourceLineNo">1715</span>    try {<a name="line.1715"></a>
-<span class="sourceLineNo">1716</span>      if (pendingAssignQueue.isEmpty() &amp;&amp; isRunning()) {<a name="line.1716"></a>
-<span class="sourceLineNo">1717</span>        assignQueueFullCond.await();<a name="line.1717"></a>
-<span class="sourceLineNo">1718</span>      }<a name="line.1718"></a>
+<span class="sourceLineNo">1336</span>    boolean meta = isMetaRegion(hri);<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    boolean metaLoaded = isMetaLoaded();<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>    if (!meta &amp;&amp; !metaLoaded) {<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>      throw new PleaseHoldException(<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>        "Master not fully online; hbase:meta=" + meta + ", metaLoaded=" + metaLoaded);<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>    }<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>  }<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span><a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>  // ============================================================================================<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>  //  TODO: Metrics<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>  // ============================================================================================<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>  public int getNumRegionsOpened() {<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    // TODO: Used by TestRegionPlacement.java and assume monotonically increasing value<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>    return 0;<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>  }<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span><a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>  public long submitServerCrash(ServerName serverName, boolean shouldSplitWal) {<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>    boolean carryingMeta;<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>    long pid;<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    ServerStateNode serverNode = regionStates.getServerNode(serverName);<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>    if(serverNode == null){<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>      LOG.info("Skip to add SCP for {} since this server should be OFFLINE already", serverName);<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>      return -1;<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    }<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    // we hold the write lock here for fencing on reportRegionStateTransition. Once we set the<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>    // server state to CRASHED, we will no longer accept the reportRegionStateTransition call from<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>    // this server. This is used to simplify the implementation for TRSP and SCP, where we can make<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>    // sure that, the region list fetched by SCP will not be changed any more.<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>    serverNode.writeLock().lock();<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    try {<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>      ProcedureExecutor&lt;MasterProcedureEnv&gt; procExec = this.master.getMasterProcedureExecutor();<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>      carryingMeta = isCarryingMeta(serverName);<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>      if (!serverNode.isInState(ServerState.ONLINE)) {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>        LOG.info(<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>          "Skip to add SCP for {} with meta= {}, " +<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>              "since there should be a SCP is processing or already done for this server node",<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>          serverName, carryingMeta);<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>        return -1;<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>      } else {<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>        serverNode.setState(ServerState.CRASHED);<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>        pid = procExec.submitProcedure(new ServerCrashProcedure(procExec.getEnvironment(),<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>            serverName, shouldSplitWal, carryingMeta));<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>        LOG.info(<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>          "Added {} to dead servers which carryingMeta={}, submitted ServerCrashProcedure pid={}",<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>          serverName, carryingMeta, pid);<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>      }<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>    } finally {<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>      serverNode.writeLock().unlock();<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>    }<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>    return pid;<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>  }<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span><a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>  public void offlineRegion(final RegionInfo regionInfo) {<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>    // TODO used by MasterRpcServices<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>    RegionStateNode node = regionStates.getRegionStateNode(regionInfo);<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>    if (node != null) {<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>      node.offline();<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>    }<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>  }<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span><a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>  public void onlineRegion(final RegionInfo regionInfo, final ServerName serverName) {<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>    // TODO used by TestSplitTransactionOnCluster.java<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span>  }<a name="line.1398"></a>
+<span class="sourceLineNo">1399</span><a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; getSnapShotOfAssignment(<a name="line.1400"></a>
+<span class="sourceLineNo">1401</span>      final Collection&lt;RegionInfo&gt; regions) {<a name="line.1401"></a>
+<span class="sourceLineNo">1402</span>    return regionStates.getSnapShotOfAssignment(regions);<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>  }<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span><a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>  // ============================================================================================<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>  //  TODO: UTILS/HELPERS?<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>  // ============================================================================================<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>  /**<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>   * Used by the client (via master) to identify if all regions have the schema updates<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>   *<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>   * @param tableName<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>   * @return Pair indicating the status of the alter command (pending/total)<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>   * @throws IOException<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>   */<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>  public Pair&lt;Integer, Integer&gt; getReopenStatus(TableName tableName) {<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>    if (isTableDisabled(tableName)) return new Pair&lt;Integer, Integer&gt;(0, 0);<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span><a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>    final List&lt;RegionState&gt; states = regionStates.getTableRegionStates(tableName);<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>    int ritCount = 0;<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span>    for (RegionState regionState: states) {<a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>      if (!regionState.isOpened() &amp;&amp; !regionState.isSplit()) {<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>        ritCount++;<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>      }<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span>    }<a name="line.1424"></a>
+<span class="sourceLineNo">1425</span>    return new Pair&lt;Integer, Integer&gt;(ritCount, states.size());<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>  }<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span><a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>  // ============================================================================================<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>  //  TODO: Region State In Transition<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span>  // ============================================================================================<a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>  public boolean hasRegionsInTransition() {<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>    return regionStates.hasRegionsInTransition();<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span>  }<a name="line.1433"></a>
+<span class="sourceLineNo">1434</span><a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>  public List&lt;RegionStateNode&gt; getRegionsInTransition() {<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span>    return regionStates.getRegionsInTransition();<a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>  }<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span><a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>  public List&lt;RegionInfo&gt; getAssignedRegions() {<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>    return regionStates.getAssignedRegions();<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>  }<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span><a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>  public RegionInfo getRegionInfo(final byte[] regionName) {<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>    final RegionStateNode regionState = regionStates.getRegionStateNodeFromName(regionName);<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>    return regionState != null ? regionState.getRegionInfo() : null;<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span>  }<a name="line.1446"></a>
+<span class="sourceLineNo">1447</span><a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>  // ============================================================================================<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>  //  Expected states on region state transition.<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span>  //  Notice that there is expected states for transiting to OPENING state, this is because SCP.<a name="line.1450"></a>
+<span class="sourceLineNo">1451</span>  //  See the comments in regionOpening method for more details.<a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>  // ============================================================================================<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>  private static final State[] STATES_EXPECTED_ON_OPEN = {<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>    State.OPENING, // Normal case<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>    State.OPEN // Retrying<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>  };<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span><a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>  private static final State[] STATES_EXPECTED_ON_CLOSING = {<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>    State.OPEN, // Normal case<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>    State.CLOSING, // Retrying<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>    State.SPLITTING, // Offline the split parent<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>    State.MERGING // Offline the merge parents<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>  };<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span><a name="line.1464"></a>
+<span class="sourceLineNo">1465</span>  private static final State[] STATES_EXPECTED_ON_CLOSED = {<a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>    State.CLOSING, // Normal case<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>    State.CLOSED // Retrying<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>  };<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span><a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>  // This is for manually scheduled region assign, can add other states later if we find out other<a name="line.1470"></a>
+<span class="sourceLineNo">1471</span>  // usages<a name="line.1471"></a>
+<span class="sourceLineNo">1472</span>  private static final State[] STATES_EXPECTED_ON_ASSIGN = { State.CLOSED, State.OFFLINE };<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span><a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>  // We only allow unassign or move a region which is in OPEN state.<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span>  private static final State[] STATES_EXPECTED_ON_UNASSIGN_OR_MOVE = { State.OPEN };<a name="line.1475"></a>
+<span class="sourceLineNo">1476</span><a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>  // ============================================================================================<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>  //  Region Status update<a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>  //  Should only be called in TransitRegionStateProcedure<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span>  // ============================================================================================<a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>  private void transitStateAndUpdate(RegionStateNode regionNode, RegionState.State newState,<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>      RegionState.State... expectedStates) throws IOException {<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>    RegionState.State state = regionNode.getState();<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>    regionNode.transitionState(newState, expectedStates);<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>    boolean succ = false;<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span>    try {<a name="line.1486"></a>
+<span class="sourceLineNo">1487</span>      regionStateStore.updateRegionLocation(regionNode);<a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>      succ = true;<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>    } finally {<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>      if (!succ) {<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>        // revert<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span>        regionNode.setState(state);<a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>      }<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>    }<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>  }<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span><a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>  // should be called within the synchronized block of RegionStateNode<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>  void regionOpening(RegionStateNode regionNode) throws IOException {<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>    // As in SCP, for performance reason, there is no TRSP attached with this region, we will not<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>    // update the region state, which means that the region could be in any state when we want to<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span>    // assign it after a RS crash. So here we do not pass the expectedStates parameter.<a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>    transitStateAndUpdate(regionNode, State.OPENING);<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span>    regionStates.addRegionToServer(regionNode);<a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>    // update the operation count metrics<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>    metrics.incrementOperationCounter();<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span>  }<a name="line.1506"></a>
+<span class="sourceLineNo">1507</span><a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>  // should be called within the synchronized block of RegionStateNode.<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span>  // The parameter 'giveUp' means whether we will try to open the region again, if it is true, then<a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>  // we will persist the FAILED_OPEN state into hbase:meta.<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>  void regionFailedOpen(RegionStateNode regionNode, boolean giveUp) throws IOException {<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>    RegionState.State state = regionNode.getState();<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span>    ServerName regionLocation = regionNode.getRegionLocation();<a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>    if (giveUp) {<a name="line.1514"></a>
+<span class="sourceLineNo">1515</span>      regionNode.setState(State.FAILED_OPEN);<a name="line.1515"></a>
+<span class="sourceLineNo">1516</span>      regionNode.setRegionLocation(null);<a name="line.1516"></a>
+<span class="sourceLineNo">1517</span>      boolean succ = false;<a name="line.1517"></a>
+<span class="sourceLineNo">1518</span>      try {<a name="line.1518"></a>
+<span class="sourceLineNo">1519</span>        regionStateStore.updateRegionLocation(regionNode);<a name="line.1519"></a>
+<span class="sourceLineNo">1520</span>        succ = true;<a name="line.1520"></a>
+<span class="sourceLineNo">1521</span>      } finally {<a name="line.1521"></a>
+<span class="sourceLineNo">1522</span>        if (!succ) {<a name="line.1522"></a>
+<span class="sourceLineNo">1523</span>          // revert<a name="line.1523"></a>
+<span class="sourceLineNo">1524</span>          regionNode.setState(state);<a name="line.1524"></a>
+<span class="sourceLineNo">1525</span>          regionNode.setRegionLocation(regionLocation);<a name="line.1525"></a>
+<span class="sourceLineNo">1526</span>        }<a name="line.1526"></a>
+<span class="sourceLineNo">1527</span>      }<a name="line.1527"></a>
+<span class="sourceLineNo">1528</span>    }<a name="line.1528"></a>
+<span class="sourceLineNo">1529</span>    if (regionLocation != null) {<a name="line.1529"></a>
+<span class="sourceLineNo">1530</span>      regionStates.removeRegionFromServer(regionLocation, regionNode);<a name="line.1530"></a>
+<span class="sourceLineNo">1531</span>    }<a name="line.1531"></a>
+<span class="sourceLineNo">1532</span>  }<a name="line.1532"></a>
+<span class="sourceLineNo">1533</span><a name="line.1533"></a>
+<span class="sourceLineNo">1534</span>  // should be called within the synchronized block of RegionStateNode<a name="line.1534"></a>
+<span class="sourceLineNo">1535</span>  void regionOpened(RegionStateNode regionNode) throws IOException {<a name="line.1535"></a>
+<span class="sourceLineNo">1536</span>    // TODO: OPENING Updates hbase:meta too... we need to do both here and there?<a name="line.1536"></a>
+<span class="sourceLineNo">1537</span>    // That is a lot of hbase:meta writing.<a name="line.1537"></a>
+<span class="sourceLineNo">1538</span>    transitStateAndUpdate(regionNode, State.OPEN, STATES_EXPECTED_ON_OPEN);<a name="line.1538"></a>
+<span class="sourceLineNo">1539</span>    RegionInfo hri = regionNode.getRegionInfo();<a name="line.1539"></a>
+<span class="sourceLineNo">1540</span>    if (isMetaRegion(hri)) {<a name="line.1540"></a>
+<span class="sourceLineNo">1541</span>      // Usually we'd set a table ENABLED at this stage but hbase:meta is ALWAYs enabled, it<a name="line.1541"></a>
+<span class="sourceLineNo">1542</span>      // can't be disabled -- so skip the RPC (besides... enabled is managed by TableStateManager<a name="line.1542"></a>
+<span class="sourceLineNo">1543</span>      // which is backed by hbase:meta... Avoid setting ENABLED to avoid having to update state<a name="line.1543"></a>
+<span class="sourceLineNo">1544</span>      // on table that contains state.<a name="line.1544"></a>
+<span class="sourceLineNo">1545</span>      setMetaAssigned(hri, true);<a name="line.1545"></a>
+<span class="sourceLineNo">1546</span>    }<a name="line.1546"></a>
+<span class="sourceLineNo">1547</span>    regionStates.addRegionToServer(regionNode);<a name="line.1547"></a>
+<span class="sourceLineNo">1548</span>    regionStates.removeFromFailedOpen(hri);<a name="line.1548"></a>
+<span class="sourceLineNo">1549</span>  }<a name="line.1549"></a>
+<span class="sourceLineNo">1550</span><a name="line.1550"></a>
+<span class="sourceLineNo">1551</span>  // should be called within the synchronized block of RegionStateNode<a name="line.1551"></a>
+<span class="sourceLineNo">1552</span>  void regionClosing(RegionStateNode regionNode) throws IOException {<a name="line.1552"></a>
+<span class="sourceLineNo">1553</span>    transitStateAndUpdate(regionNode, State.CLOSING, STATES_EXPECTED_ON_CLOSING);<a name="line.1553"></a>
+<span class="sourceLineNo">1554</span><a name="line.1554"></a>
+<span class="sourceLineNo">1555</span>    RegionInfo hri = regionNode.getRegionInfo();<a name="line.1555"></a>
+<span class="sourceLineNo">1556</span>    // Set meta has not initialized early. so people trying to create/edit tables will wait<a name="line.1556"></a>
+<span class="sourceLineNo">1557</span>    if (isMetaRegion(hri)) {<a name="line.1557"></a>
+<span class="sourceLineNo">1558</span>      setMetaAssigned(hri, false);<a name="line.1558"></a>
+<span class="sourceLineNo">1559</span>    }<a name="line.1559"></a>
+<span class="sourceLineNo">1560</span>    regionStates.addRegionToServer(regionNode);<a name="line.1560"></a>
+<span class="sourceLineNo">1561</span>    // update the operation count metrics<a name="line.1561"></a>
+<span class="sourceLineNo">1562</span>    metrics.incrementOperationCounter();<a name="line.1562"></a>
+<span class="sourceLineNo">1563</span>  }<a name="line.1563"></a>
+<span class="sourceLineNo">1564</span><a name="line.1564"></a>
+<span class="sourceLineNo">1565</span>  // should be called within the synchronized block of RegionStateNode<a name="line.1565"></a>
+<span class="sourceLineNo">1566</span>  // The parameter 'normally' means whether we are closed cleanly, if it is true, then it means that<a name="line.1566"></a>
+<span class="sourceLineNo">1567</span>  // we are closed due to a RS crash.<a name="line.1567"></a>
+<span class="sourceLineNo">1568</span>  void regionClosed(RegionStateNode regionNode, boolean normally) throws IOException {<a name="line.1568"></a>
+<span class="sourceLineNo">1569</span>    RegionState.State state = regionNode.getState();<a name="line.1569"></a>
+<span class="sourceLineNo">1570</span>    ServerName regionLocation = regionNode.getRegionLocation();<a name="line.1570"></a>
+<span class="sourceLineNo">1571</span>    if (normally) {<a name="line.1571"></a>
+<span class="sourceLineNo">1572</span>      regionNode.transitionState(State.CLOSED, STATES_EXPECTED_ON_CLOSED);<a name="line.1572"></a>
+<span class="sourceLineNo">1573</span>    } else {<a name="line.1573"></a>
+<span class="sourceLineNo">1574</span>      // For SCP<a name="line.1574"></a>
+<span class="sourceLineNo">1575</span>      regionNode.transitionState(State.ABNORMALLY_CLOSED);<a name="line.1575"></a>
+<span class="sourceLineNo">1576</span>    }<a name="line.1576"></a>
+<span class="sourceLineNo">1577</span>    regionNode.setRegionLocation(null);<a name="line.1577"></a>
+<span class="sourceLineNo">1578</span>    boolean succ = false;<a name="line.1578"></a>
+<span class="sourceLineNo">1579</span>    try {<a name="line.1579"></a>
+<span class="sourceLineNo">1580</span>      regionStateStore.updateRegionLocation(regionNode);<a name="line.1580"></a>
+<span class="sourceLineNo">1581</span>      succ = true;<a name="line.1581"></a>
+<span class="sourceLineNo">1582</span>    } finally {<a name="line.1582"></a>
+<span class="sourceLineNo">1583</span>      if (!succ) {<a name="line.1583"></a>
+<span class="sourceLineNo">1584</span>        // revert<a name="line.1584"></a>
+<span class="sourceLineNo">1585</span>        regionNode.setState(state);<a name="line.1585"></a>
+<span class="sourceLineNo">1586</span>        regionNode.setRegionLocation(regionLocation);<a name="line.1586"></a>
+<span class="sourceLineNo">1587</span>      }<a name="line.1587"></a>
+<span class="sourceLineNo">1588</span>    }<a name="line.1588"></a>
+<span class="sourceLineNo">1589</span>    if (regionLocation != null) {<a name="line.1589"></a>
+<span class="sourceLineNo">1590</span>      regionNode.setLastHost(regionLocation);<a name="line.1590"></a>
+<span class="sourceLineNo">1591</span>      regionStates.removeRegionFromServer(regionLocation, regionNode);<a name="line.1591"></a>
+<span class="sourceLineNo">1592</span>    }<a name="line.1592"></a>
+<span class="sourceLineNo">1593</span>  }<a name="line.1593"></a>
+<span class="sourceLineNo">1594</span><a name="line.1594"></a>
+<span class="sourceLineNo">1595</span>  public void markRegionAsSplit(final RegionInfo parent, final ServerName serverName,<a name="line.1595"></a>
+<span class="sourceLineNo">1596</span>      final RegionInfo daughterA, final RegionInfo daughterB) throws IOException {<a name="line.1596"></a>
+<span class="sourceLineNo">1597</span>    // Update hbase:meta. Parent will be marked offline and split up in hbase:meta.<a name="line.1597"></a>
+<span class="sourceLineNo">1598</span>    // The parent stays in regionStates until cleared when removed by CatalogJanitor.<a name="line.1598"></a>
+<span class="sourceLineNo">1599</span>    // Update its state in regionStates to it shows as offline and split when read<a name="line.1599"></a>
+<span class="sourceLineNo">1600</span>    // later figuring what regions are in a table and what are not: see<a name="line.1600"></a>
+<span class="sourceLineNo">1601</span>    // regionStates#getRegionsOfTable<a name="line.1601"></a>
+<span class="sourceLineNo">1602</span>    final RegionStateNode node = regionStates.getOrCreateRegionStateNode(parent);<a name="line.1602"></a>
+<span class="sourceLineNo">1603</span>    node.setState(State.SPLIT);<a name="line.1603"></a>
+<span class="sourceLineNo">1604</span>    final RegionStateNode nodeA = regionStates.getOrCreateRegionStateNode(daughterA);<a name="line.1604"></a>
+<span class="sourceLineNo">1605</span>    nodeA.setState(State.SPLITTING_NEW);<a name="line.1605"></a>
+<span class="sourceLineNo">1606</span>    final RegionStateNode nodeB = regionStates.getOrCreateRegionStateNode(daughterB);<a name="line.1606"></a>
+<span class="sourceLineNo">1607</span>    nodeB.setState(State.SPLITTING_NEW);<a name="line.1607"></a>
+<span class="sourceLineNo">1608</span><a name="line.1608"></a>
+<span class="sourceLineNo">1609</span>    regionStateStore.splitRegion(parent, daughterA, daughterB, serverName);<a name="line.1609"></a>
+<span class="sourceLineNo">1610</span>    if (shouldAssignFavoredNodes(parent)) {<a name="line.1610"></a>
+<span class="sourceLineNo">1611</span>      List&lt;ServerName&gt; onlineServers = this.master.getServerManager().getOnlineServersList();<a name="line.1611"></a>
+<span class="sourceLineNo">1612</span>      ((FavoredNodesPromoter)getBalancer()).<a name="line.1612"></a>
+<span class="sourceLineNo">1613</span>          generateFavoredNodesForDaughter(onlineServers, parent, daughterA, daughterB);<a name="line.1613"></a>
+<span class="sourceLineNo">1614</span>    }<a name="line.1614"></a>
+<span class="sourceLineNo">1615</span>  }<a name="line.1615"></a>
+<span class="sourceLineNo">1616</span><a name="line.1616"></a>
+<span class="sourceLineNo">1617</span>  /**<a name="line.1617"></a>
+<span class="sourceLineNo">1618</span>   * When called here, the merge has happened. The two merged regions have been<a name="line.1618"></a>
+<span class="sourceLineNo">1619</span>   * unassigned and the above markRegionClosed has been called on each so they have been<a name="line.1619"></a>
+<span class="sourceLineNo">1620</span>   * disassociated from a hosting Server. The merged region will be open after this call. The<a name="line.1620"></a>
+<span class="sourceLineNo">1621</span>   * merged regions are removed from hbase:meta below&gt; Later they are deleted from the filesystem<a name="line.1621"></a>
+<span class="sourceLineNo">1622</span>   * by the catalog janitor running against hbase:meta. It notices when the merged region no<a name="line.1622"></a>
+<span class="sourceLineNo">1623</span>   * longer holds references to the old regions.<a name="line.1623"></a>
+<span class="sourceLineNo">1624</span>   */<a name="line.1624"></a>
+<span class="sourceLineNo">1625</span>  public void markRegionAsMerged(final RegionInfo child, final ServerName serverName,<a name="line.1625"></a>
+<span class="sourceLineNo">1626</span>      final RegionInfo mother, final RegionInfo father) throws IOException {<a name="line.1626"></a>
+<span class="sourceLineNo">1627</span>    final RegionStateNode node = regionStates.getOrCreateRegionStateNode(child);<a name="line.1627"></a>
+<span class="sourceLineNo">1628</span>    node.setState(State.MERGED);<a name="line.1628"></a>
+<span class="sourceLineNo">1629</span>    regionStates.deleteRegion(mother);<a name="line.1629"></a>
+<span class="sourceLineNo">1630</span>    regionStates.deleteRegion(father);<a name="line.1630"></a>
+<span class="sourceLineNo">1631</span>    regionStateStore.mergeRegions(child, mother, father, serverName);<a name="line.1631"></a>
+<span class="sourceLineNo">1632</span>    if (shouldAssignFavoredNodes(child)) {<a name="line.1632"></a>
+<span class="sourceLineNo">1633</span>      ((FavoredNodesPromoter)getBalancer()).<a name="line.1633"></a>
+<span class="sourceLineNo">1634</span>        generateFavoredNodesForMergedRegion(child, mother, father);<a name="line.1634"></a>
+<span class="sourceLineNo">1635</span>    }<a name="line.1635"></a>
+<span class="sourceLineNo">1636</span>  }<a name="line.1636"></a>
+<span class="sourceLineNo">1637</span><a name="line.1637"></a>
+<span class="sourceLineNo">1638</span>  /*<a name="line.1638"></a>
+<span class="sourceLineNo">1639</span>   * Favored nodes should be applied only when FavoredNodes balancer is configured and the region<a name="line.1639"></a>
+<span class="sourceLineNo">1640</span>   * belongs to a non-system table.<a name="line.1640"></a>
+<span class="sourceLineNo">1641</span>   */<a name="line.1641"></a>
+<span class="sourceLineNo">1642</span>  private boolean shouldAssignFavoredNodes(RegionInfo region) {<a name="line.1642"></a>
+<span class="sourceLineNo">1643</span>    return this.shouldAssignRegionsWithFavoredNodes &amp;&amp;<a name="line.1643"></a>
+<span class="sourceLineNo">1644</span>        FavoredNodesManager.isFavoredNodeApplicable(region);<a name="line.1644"></a>
+<span class="sourceLineNo">1645</span>  }<a name="line.1645"></a>
+<span class="sourceLineNo">1646</span><a name="line.1646"></a>
+<span class="sourceLineNo">1647</span>  // ============================================================================================<a name="line.1647"></a>
+<span class="sourceLineNo">1648</span>  //  Assign Queue (Assign/Balance)<a name="line.1648"></a>
+<span class="sourceLineNo">1649</span>  // ============================================================================================<a name="line.1649"></a>
+<span class="sourceLineNo">1650</span>  private final ArrayList&lt;RegionStateNode&gt; pendingAssignQueue = new ArrayList&lt;RegionStateNode&gt;();<a name="line.1650"></a>
+<span class="sourceLineNo">1651</span>  private final ReentrantLock assignQueueLock = new ReentrantLock();<a name="line.1651"></a>
+<span class="sourceLineNo">1652</span>  private final Condition assignQueueFullCond = assignQueueLock.newCondition();<a name="line.1652"></a>
+<span class="sourceLineNo">1653</span><a name="line.1653"></a>
+<span class="sourceLineNo">1654</span>  /**<a name="line.1654"></a>
+<span class="sourceLineNo">1655</span>   * Add the assign operation to the assignment queue.<a name="line.1655"></a>
+<span class="sourceLineNo">1656</span>   * The pending assignment operation will be processed,<a name="line.1656"></a>
+<span class="sourceLineNo">1657</span>   * and each region will be assigned by a server using the balancer.<a name="line.1657"></a>
+<span class="sourceLineNo">1658</span>   */<a name="line.1658"></a>
+<span class="sourceLineNo">1659</span>  protected void queueAssign(final RegionStateNode regionNode) {<a name="line.1659"></a>
+<span class="sourceLineNo">1660</span>    regionNode.getProcedureEvent().suspend();<a name="line.1660"></a>
+<span class="sourceLineNo">1661</span><a name="line.1661"></a>
+<span class="sourceLineNo">1662</span>    // TODO: quick-start for meta and the other sys-tables?<a name="line.1662"></a>
+<span class="sourceLineNo">1663</span>    assignQueueLock.lock();<a name="line.1663"></a>
+<span class="sourceLineNo">1664</span>    try {<a name="line.1664"></a>
+<span class="sourceLineNo">1665</span>      pendingAssignQueue.add(regionNode);<a name="line.1665"></a>
+<span class="sourceLineNo">1666</span>      if (regionNode.isSystemTable() ||<a name="line.1666"></a>
+<span class="sourceLineNo">1667</span>          pendingAssignQueue.size() == 1 ||<a name="line.1667"></a>
+<span class="sourceLineNo">1668</span>          pendingAssignQueue.size() &gt;= assignDispatchWaitQueueMaxSize) {<a name="line.1668"></a>
+<span class="sourceLineNo">1669</span>        assignQueueFullCond.signal();<a name="line.1669"></a>
+<span class="sourceLineNo">1670</span>      }<a name="line.1670"></a>
+<span class="sourceLineNo">1671</span>    } finally {<a name="line.1671"></a>
+<span class="sourceLineNo">1672</span>      assignQueueLock.unlock();<a name="line.1672"></a>
+<span class="sourceLineNo">1673</span>    }<a name="line.1673"></a>
+<span class="sourceLineNo">1674</span>  }<a name="line.1674"></a>
+<span class="sourceLineNo">1675</span><a name="line.1675"></a>
+<span class="sourceLineNo">1676</span>  private void startAssignmentThread() {<a name="line.1676"></a>
+<span class="sourceLineNo">1677</span>    // Get Server Thread name. Sometimes the Server is mocked so may not implement HasThread.<a name="line.1677"></a>
+<span class="sourceLineNo">1678</span>    // For example, in tests.<a name="line.1678"></a>
+<span class="sourceLineNo">1679</span>    String name = master instanceof HasThread? ((HasThread)master).getName():<a name="line.1679"></a>
+<span class="sourceLineNo">1680</span>        master.getServerName().toShortString();<a name="line.1680"></a>
+<span class="sourceLineNo">1681</span>    assignThread = new Thread(name) {<a name="line.1681"></a>
+<span class="sourceLineNo">1682</span>      @Override<a name="line.1682"></a>
+<span class="sourceLineNo">1683</span>      public void run() {<a name="line.1683"></a>
+<span class="sourceLineNo">1684</span>        while (isRunning()) {<a name="line.1684"></a>
+<span class="sourceLineNo">1685</span>          processAssignQueue();<a name="line.1685"></a>
+<span class="sourceLineNo">1686</span>        }<a name="line.1686"></a>
+<span class="sourceLineNo">1687</span>        pendingAssignQueue.clear();<a name="line.1687"></a>
+<span class="sourceLineNo">1688</span>      }<a name="line.1688"></a>
+<span class="sourceLineNo">1689</span>    };<a name="line.1689"></a>
+<span class="sourceLineNo">1690</span>    assignThread.setDaemon(true);<a name="line.1690"></a>
+<span class="sourceLineNo">1691</span>    assignThread.start();<a name="line.1691"></a>
+<span class="sourceLineNo">1692</span>  }<a name="line.1692"></a>
+<span class="sourceLineNo">1693</span><a name="line.1693"></a>
+<span class="sourceLineNo">1694</span>  private void stopAssignmentThread() {<a name="line.1694"></a>
+<span class="sourceLineNo">1695</span>    assignQueueSignal();<a name="line.1695"></a>
+<span class="sourceLineNo">1696</span>    try {<a name="line.1696"></a>
+<span class="sourceLineNo">1697</span>      while (assignThread.isAlive()) {<a name="line.1697"></a>
+<span class="sourceLineNo">1698</span>        assignQueueSignal();<a name="line.1698"></a>
+<span class="sourceLineNo">1699</span>        assignThread.join(250);<a name="line.1699"></a>
+<span class="sourceLineNo">1700</span>      }<a name="line.1700"></a>
+<span class="sourceLineNo">1701</span>    } catch (InterruptedException e) {<a name="line.1701"></a>
+<span class="sourceLineNo">1702</span>      LOG.warn("join interrupted", e);<a name="line.1702"></a>
+<span class="sourceLineNo">1703</span>      Thread.currentThread().interrupt();<a name="line.1703"></a>
+<span class="sourceLineNo">1704</span>    }<a name="line.1704"></a>
+<span class="sourceLineNo">1705</span>  }<a name="line.1705"></a>
+<span class="sourceLineNo">1706</span><a name="line.1706"></a>
+<span class="sourceLineNo">1707</span>  private void assignQueueSignal() {<a name="line.1707"></a>
+<span class="sourceLineNo">1708</span>    assignQueueLock.lock();<a name="line.1708"></a>
+<span class="sourceLineNo">1709</span>    try {<a name="line.1709"></a>
+<span class="sourceLineNo">1710</span>      assignQueueFullCond.signal();<a name="line.1710"></a>
+<span class="sourceLineNo">1711</span>    } finally {<a name="line.1711"></a>
+<span class="sourceLineNo">1712</span>      assignQueueLock.unlock();<a name="line.1712"></a>
+<span class="sourceLineNo">1713</span>    }<a name="line.1713"></a>
+<span class="sourceLineNo">1714</span>  }<a name="line.1714"></a>
+<span class="sourceLineNo">1715</span><a name="line.1715"></a>
+<span class="sourceLineNo">1716</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings("WA_AWAIT_NOT_IN_LOOP")<a name="line.1716"></a>
+<span class="sourceLineNo">1717</span>  private HashMap&lt;RegionInfo, RegionStateNode&gt; waitOnAssignQueue() {<a name="line.1717"></a>
+<span class="sourceLineNo">1718</span>    HashMap&lt;RegionInfo, RegionStateNode&gt; regions = null;<a name="line.1718"></a>
 <span class="sourceLineNo">1719</span><a name="line.1719"></a>
-<span class="sourceLineNo">1720</span>      if (!isRunning()) return null;<a name="line.1720"></a>
-<span class="sourceLineNo">1721</span>      assignQueueFullCond.await(assignDispatchWaitMillis, TimeUnit.MILLISECONDS);<a name="line.1721"></a>
-<span class="sourceLineNo">1722</span>      regions = new HashMap&lt;RegionInfo, RegionStateNode&gt;(pendingAssignQueue.size());<a name="line.1722"></a>
-<span class="sourceLineNo">1723</span>      for (RegionStateNode regionNode: pendingAssignQueue) {<a name="line.1723"></a>
-<span class="sourceLineNo">1724</span>        regions.put(regionNode.getRegionInfo(), regionNode);<a name="line.1724"></a>
-<span class="sourceLineNo">1725</span>      }<a name="line.1725"></a>
-<span class="sourceLineNo">1726</span>      pendingAssignQueue.clear();<a name="line.1726"></a>
-<span class="sourceLineNo">1727</span>    } catch (InterruptedException e) {<a name="line.1727"></a>
-<span class="sourceLineNo">1728</span>      LOG.warn("got interrupted ", e);<a name="line.1728"></a>
-<span class="sourceLineNo">1729</span>      Thread.currentThread().interrupt();<a name="line.1729"></a>
-<span class="sourceLineNo">1730</span>    } finally {<a name="line.1730"></a>
-<span class="sourceLineNo">1731</span>      assignQueueLock.unlock();<a name="line.1731"></a>
-<span class="sourceLineNo">1732</span>    }<a name="line.1732"></a>
-<span class="sourceLineNo">1733</span>    return regions;<a name="line.1733"></a>
-<span class="sourceLineNo">1734</span>  }<a name="line.1734"></a>
-<span class="sourceLineNo">1735</span><a name="line.1735"></a>
-<span class="sourceLineNo">1736</span>  private void processAssignQueue() {<a name="line.1736"></a>
-<span class="sourceLineNo">1737</span>    final HashMap&lt;RegionInfo, RegionStateNode&gt; regions = waitOnAssignQueue();<a name="line.1737"></a>
-<span class="sourceLineNo">1738</span>    if (regions == null || regions.size() == 0 || !isRunning()) {<a name="line.1738"></a>
-<span class="sourceLineNo">1739</span>      return;<a name="line.1739"></a>
-<span class="sourceLineNo">1740</span>    }<a name="line.1740"></a>
+<span class="sourceLineNo">1720</span>    assignQueueLock.lock();<a name="line.1720"></a>
+<span class="sourceLineNo">1721</span>    try {<a name="line.1721"></a>
+<span class="sourceLineNo">1722</span>      if (pendingAssignQueue.isEmpty() &amp;&amp; isRunning()) {<a name="line.1722"></a>
+<span class="sourceLineNo">1723</span>        assignQueueFullCond.await();<a name="line.1723"></a>
+<span class="sourceLineNo">1724</span>      }<a name="line.1724"></a>
+<span class="sourceLineNo">1725</span><a name="line.1725"></a>
+<span class="sourceLineNo">1726</span>      if (!isRunning()) return null;<a name="line.1726"></a>
+<span class="sourceLineNo">1727</span>      assignQueueFullCond.await(assignDispatchWaitMillis, TimeUnit.MILLISECONDS);<a name="line.1727"></a>
+<span class="sourceLineNo">1728</span>      regions = new HashMap&lt;RegionInfo, RegionStateNode&gt;(pendingAssignQueue.size());<a name="line.1728"></a>
+<span class="sourceLineNo">1729</span>      for (RegionStateNode regionNode: pendingAssignQueue) {<a name="line.1729"></a>
+<span class="sourceLineNo">1730</span>        regions.put(regionNode.getRegionInfo(), regionNode);<a name="line.1730"></a>
+<span class="sourceLineNo">1731</span>      }<a name="line.1731"></a>
+<span class="sourceLineNo">1732</span>      pendingAssignQueue.clear();<a name="line.1732"></a>
+<span class="sourceLineNo">1733</span>    } catch (InterruptedException e) {<a name="line.1733"></a>
+<span class="sourceLineNo">1734</span>      LOG.warn("got interrupted ", e);<a name="line.1734"></a>
+<span class="sourceLineNo">1735</span>      Thread.currentThread().interrupt();<a name="line.1735"></a>
+<span class="sourceLineNo">1736</span>    } finally {<a name="line.1736"></a>
+<span class="sourceLineNo">1737</span>      assignQueueLock.unlock();<a name="line.1737"></a>
+<span class="sourceLineNo">1738</span>    }<a name="line.1738"></a>
+<span class="sourceLineNo">1739</span>    return regions;<a name="line.1739"></a>
+<span class="sourceLineNo">1740</span>  }<a name="line.1740"></a>
 <span class="sourceLineNo">1741</span><a name="line.1741"></a>
-<span class="sourceLineNo">1742</span>    if (LOG.isTraceEnabled()) {<a name="line.1742"></a>
-<span class="sourceLineNo">1743</span>      LOG.trace("PROCESS ASSIGN QUEUE regionCount=" + regions.size());<a name="line.1743"></a>
-<span class="sourceLineNo">1744</span>    }<a name="line.1744"></a>
-<span class="sourceLineNo">1745</span><a name="line.1745"></a>
-<span class="sourceLineNo">1746</span>    // TODO: Optimize balancer. pass a RegionPlan?<a name="line.1746"></a>
-<span class="sourceLineNo">1747</span>    final HashMap&lt;RegionInfo, ServerName&gt; retainMap = new HashMap&lt;&gt;();<a name="line.1747"></a>
-<span class="sourceLineNo">1748</span>    final List&lt;RegionInfo&gt; userHRIs = new ArrayList&lt;&gt;(regions.size());<a name="line.1748"></a>
-<span class="sourceLineNo">1749</span>    // Regions for system tables requiring reassignment<a name="line.1749"></a>
-<span class="sourceLineNo">1750</span>    final List&lt;RegionInfo&gt; systemHRIs = new ArrayList&lt;&gt;();<a name="line.1750"></a>
-<span class="sourceLineNo">1751</span>    for (RegionStateNode regionStateNode: regions.values()) {<a name="line.1751"></a>
-<span class="sourceLineNo">1752</span>      boolean sysTable = regionStateNode.isSystemTable();<a name="line.1752"></a>
-<span class="sourceLineNo">1753</span>      final List&lt;RegionInfo&gt; hris = sysTable? systemHRIs: userHRIs;<a name="line.1753"></a>
-<span class="sourceLineNo">1754</span>      if (regionStateNode.getRegionLocation() != null) {<a name="line.1754"></a>
-<span class="sourceLineNo">1755</span>        retainMap.put(regionStateNode.getRegionInfo(), regionStateNode.getRegionLocation());<a name="line.1755"></a>
-<span class="sourceLineNo">1756</span>      } else {<a name="line.1756"></a>
-<span class="sourceLineNo">1757</span>        hris.add(regionStateNode.getRegionInfo());<a name="line.1757"></a>
-<span class="sourceLineNo">1758</span>      }<a name="line.1758"></a>
-<span class="sourceLineNo">1759</span>    }<a name="line.1759"></a>
-<span class="sourceLineNo">1760</span><a name="line.1760"></a>
-<span class="sourceLineNo">1761</span>    // TODO: connect with the listener to invalidate the cache<a name="line.1761"></a>
-<span class="sourceLineNo">1762</span><a name="line.1762"></a>
-<span class="sourceLineNo">1763</span>    // TODO use events<a name="line.1763"></a>
-<span class="sourceLineNo">1764</span>    List&lt;ServerName&gt; servers = master.getServerManager().createDestinationServersList();<a name="line.1764"></a>
-<span class="sourceLineNo">1765</span>    for (int i = 0; servers.size() &lt; 1; ++i) {<a name="line.1765"></a>
-<span class="sourceLineNo">1766</span>      // Report every fourth time around this loop; try not to flood log.<a name="line.1766"></a>
-<span class="sourceLineNo">1767</span>      if (i % 4 == 0) {<a name="line.1767"></a>
-<span class="sourceLineNo">1768</span>        LOG.warn("No servers available; cannot place " + regions.size() + " unassigned regions.");<a name="line.1768"></a>
-<span class="sourceLineNo">1769</span>      }<a name="line.1769"></a>
-<span class="sourceLineNo">1770</span><a name="line.1770"></a>
-<span class="sourceLineNo">1771</span>      if (!isRunning()) {<a name="line.1771"></a>
-<span class="sourceLineNo">1772</span>        LOG.debug("Stopped! Dropping assign of " + regions.size() + " queued regions.");<a name="line.1772"></a>
-<span class="sourceLineNo">1773</span>        return;<a name="line.1773"></a>
-<span class="sourceLineNo">1774</span>      }<a name="line.1774"></a>
-<span class="sourceLineNo">1775</span>      Threads.sleep(250);<a name="line.1775"></a>
-<span class="sourceLineNo">1776</span>      servers = master.getServerManager().createDestinationServersList();<a name="line.1776"></a>
-<span class="sourceLineNo">1777</span>    }<a name="line.1777"></a>
-<span class="sourceLineNo">1778</span><a name="line.1778"></a>
-<span class="sourceLineNo">1779</span>    if (!systemHRIs.isEmpty()) {<a name="line.1779"></a>
-<span class="sourceLineNo">1780</span>      // System table regions requiring reassignment are present, get region servers<a name="line.1780"></a>
-<span class="sourceLineNo">1781</span>      // not available for system table regions<a name="line.1781"></a>
-<span class="sourceLineNo">1782</span>      final List&lt;ServerName&gt; excludeServers = getExcludedServersForSystemTable();<a name="line.1782"></a>
-<span class="sourceLineNo">1783</span>      List&lt;ServerName&gt; serversForSysTables = servers.stream()<a name="line.1783"></a>
-<span class="sourceLineNo">1784</span>          .filter(s -&gt; !excludeServers.contains(s)).collect(Collectors.toList());<a name="line.1784"></a>
-<span class="sourceLineNo">1785</span>      if (serversForSysTables.isEmpty()) {<a name="line.1785"></a>
-<span class="sourceLineNo">1786</span>        LOG.warn("Filtering old server versions and the excluded produced an empty set; " +<a name="line.1786"></a>
-<span class="sourceLineNo">1787</span>            "instead considering all candidate servers!");<a name="line.1787"></a>
-<span class="sourceLineNo">1788</span>      }<a name="line.1788"></a>
-<span class="sourceLineNo">1789</span>      LOG.debug("Processing assignQueue; systemServersCount=" + serversForSysTables.size() +<a name="line.1789"></a>
-<span class="sourceLineNo">1790</span>          ", allServersCount=" + servers.size());<a name="line.1790"></a>
-<span class="sourceLineNo">1791</span>      processAssignmentPlans(regions, null, systemHRIs,<a name="line.1791"></a>
-<span class="sourceLineNo">1792</span>          serversForSysTables.isEmpty()? servers: serversForSysTables);<a name="line.1792"></a>
-<span class="sourceLineNo">1793</span>    }<a name="line.1793"></a>
-<span class="sourceLineNo">1794</span><a name="line.1794"></a>
-<span class="sourceLineNo">1795</span>    processAssignmentPlans(regions, retainMap, userHRIs, servers);<a name="line.1795"></a>
-<span class="sourceLineNo">1796</span>  }<a name="line.1796"></a>
-<span class="sourceLineNo">1797</span><a name="line.1797"></a>
-<span class="sourceLineNo">1798</span>  private void processAssignmentPlans(final HashMap&lt;RegionInfo, RegionStateNode&gt; regions,<a name="line.1798"></a>
-<span class="sourceLineNo">1799</span>      final HashMap&lt;RegionInfo, ServerName&gt; retainMap, final List&lt;RegionInfo&gt; hris,<a name="line.1799"></a>
-<span class="sourceLineNo">1800</span>      final List&lt;ServerName&gt; servers) {<a name="line.1800"></a>
-<span class="sourceLineNo">1801</span>    boolean isTraceEnabled = LOG.isTraceEnabled();<a name="line.1801"></a>
-<span class="sourceLineNo">1802</span>    if (isTraceEnabled) {<a name="line.1802"></a>
-<span class="sourceLineNo">1803</span>      LOG.trace("Available servers count=" + servers.size() + ": " + servers);<a name="line.1803"></a>
-<span class="sourceLineNo">1804</span>    }<a name="line.1804"></a>
-<span class="sourceLineNo">1805</span><a name="line.1805"></a>
-<span class="sourceLineNo">1806</span>    final LoadBalancer balancer = getBalancer();<a name="line.1806"></a>
-<span class="sourceLineNo">1807</span>    // ask the balancer where to place regions<a name="line.1807"></a>
-<span class="sourceLineNo">1808</span>    if (retainMap != null &amp;&amp; !retainMap.isEmpty()) {<a name="line.1808"></a>
-<span class="sourceLineNo">1809</span>      if (isTraceEnabled) {<a name="line.1809"></a>
-<span class="sourceLineNo">1810</span>        LOG.trace("retain assign regions=" + retainMap);<a name="line.1810"></a>
-<span class="sourceLineNo">1811</span>      }<a name="line.1811"></a>
-<span class="sourceLineNo">1812</span>      try {<a name="line.1812"></a>
-<span class="sourceLineNo">1813</span>        acceptPlan(regions, balancer.retainAssignment(retainMap, servers));<a name="line.1813"></a>
-<span class="sourceLineNo">1814</span>      } catch (HBaseIOException e) {<a name="line.1814"></a>
-<span class="sourceLineNo">1815</span>        LOG.warn("unable to retain assignment", e);<a name="line.1815"></a>
-<span class="sourceLineNo">1816</span>        addToPendingAssignment(regions, retainMap.keySet());<a name="line.1816"></a>
+<span class="sourceLineNo">1742</span>  private void processAssignQueue() {<a name="line.1742"></a>
+<span class="sourceLineNo">1743</span>    final HashMap&lt;RegionInfo, RegionStateNode&gt; regions = waitOnAssignQueue();<a name="line.1743"></a>
+<span class="sourceLineNo">1744</span>    if (regions == null || regions.size() == 0 || !isRunning()) {<a name="line.1744"></a>
+<span class="sourceLineNo">1745</span>      return;<a name="line.1745"></a>
+<span class="sourceLineNo">1746</span>    }<a name="line.1746"></a>
+<span class="sourceLineNo">1747</span><a name="line.1747"></a>
+<span class="sourceLineNo">1748</span>    if (LOG.isTraceEnabled()) {<a name="line.1748"></a>
+<span class="sourceLineNo">1749</span>      LOG.trace("PROCESS ASSIGN QUEUE regionCount=" + regions.size());<a name="line.1749"></a>
+<span class="sourceLineNo">1750</span>    }<a name="line.1750"></a>
+<span class="sourceLineNo">1751</span><a name="line.1751"></a>
+<span class="sourceLineNo">1752</span>    // TODO: Optimize balancer. pass a RegionPlan?<a name="line.1752"></a>
+<span class="sourceLineNo">1753</span>    final HashMap&lt;RegionInfo, ServerName&gt; retainMap = new HashMap&lt;&gt;();<a name="line.1753"></a>
+<span class="sourceLineNo">1754</span>    final List&lt;RegionInfo&gt; userHRIs = new ArrayList&lt;&gt;(regions.size());<a name="line.1754"></a>
+<span class="sourceLineNo">1755</span>    // Regions for system tables requiring reassignment<a name="line.1755"></a>
+<span class="sourceLineNo">1756</span>    final List&lt;RegionInfo&gt; systemHRIs = new ArrayList&lt;&gt;();<a name="line.1756"></a>
+<span class="sourceLineNo">1757</span>    for (RegionStateNode regionStateNode: regions.values()) {<a name="line.1757"></a>
+<span class="sourceLineNo">1758</span>      boolean sysTable = regionStateNode.isSystemTable();<a name="line.1758"></a>
+<span class="sourceLineNo">1759</span>      final List&lt;RegionInfo&gt; hris = sysTable? systemHRIs: userHRIs;<a name="line.1759"></a>
+<span class="sourceLineNo">1760</span>      if (regionStateNode.getRegionLocation() != null) {<a name="line.1760"></a>
+<span class="sourceLineNo">1761</span>        retainMap.put(regionStateNode.getRegionInfo(), regionStateNode.getRegionLocation());<a name="line.1761"></a>
+<span class="sourceLineNo">1762</span>      } else {<a name="line.1762"></a>
+<span class="sourceLineNo">1763</span>        hris.add(regionStateNode.getRegionInfo());<a name="line.1763"></a>
+<span class="sourceLineNo">1764</span>      }<a name="line.1764"></a>
+<span class="sourceLineNo">1765</span>    }<a name="line.1765"></a>
+<span class="sourceLineNo">1766</span><a name="line.1766"></a>
+<span class="sourceLineNo">1767</span>    // TODO: connect with the listener to invalidate the cache<a name="line.1767"></a>
+<span class="sourceLineNo">1768</span><a name="line.1768"></a>
+<span class="sourceLineNo">1769</span>    // TODO use events<a name="line.1769"></a>
+<span class="sourceLineNo">1770</span>    List&lt;ServerName&gt; servers = master.getServerManager().createDestinationServersList();<a name="line.1770"></a>
+<span class="sourceLineNo">1771</span>    for (int i = 0; servers.size() &lt; 1; ++i) {<a name="line.1771"></a>
+<span class="sourceLineNo">1772</span>      // Report every fourth time around this loop; try not to flood log.<a name="line.1772"></a>
+<span class="sourceLineNo">1773</span>      if (i % 4 == 0) {<a name="line.1773"></a>
+<span class="sourceLineNo">1774</span>        LOG.warn("No servers available; cannot place " + regions.size() + " unassigned regions.");<a name="line.1774"></a>
+<span class="sourceLineNo">1775</span>      }<a name="line.1775"></a>
+<span class="sourceLineNo">1776</span><a name="line.1776"></a>
+<span class="sourceLineNo">1777</span>      if (!isRunning()) {<a name="line.1777"></a>
+<span class="sourceLineNo">1778</span>        LOG.debug("Stopped! Dropping assign of " + regions.size() + " queued regions.");<a name="line.1778"></a>
+<span class="sourceLineNo">1779</span>        return;<a name="line.1779"></a>
+<span class="sourceLineNo">1780</span>      }<a name="line.1780"></a>
+<span class="sourceLineNo">1781</span>      Threads.sleep(250);<a name="line.1781"></a>
+<span class="sourceLineNo">1782</span>      servers = master.getServerManager().createDestinationServersList();<a name="line.1782"></a>
+<span class="sourceLineNo">1783</span>    }<a name="line.1783"></a>
+<span class="sourceLineNo">1784</span><a name="line.1784"></a>
+<span class="sourceLineNo">1785</span>    if (!systemHRIs.isEmpty()) {<a name="line.1785"></a>
+<span class="sourceLineNo">1786</span>      // System table regions requiring reassignment are present, get region servers<a name="line.1786"></a>
+<span class="sourceLineNo">1787</span>      // not available for system table regions<a name="line.1787"></a>
+<span class="sourceLineNo">1788</span>      final List&lt;ServerName&gt; excludeServers = getExcludedServersForSystemTable();<a name="line.1788"></a>
+<span class="sourceLineNo">1789</span>      List&lt;ServerName&gt; serversForSysTables = servers.stream()<a name="line.1789"></a>
+<span class="sourceLineNo">1790</span>          .filter(s -&gt; !excludeServers.contains(s)).collect(Collectors.toList());<a name="line.1790"></a>
+<span class="sourceLineNo">1791</span>      if (serversForSysTables.isEmpty()) {<a name="line.1791"></a>
+<span class="sourceLineNo">1792</span>        LOG.warn("Filtering old server versions and the excluded produced an empty set; " +<a name="line.1792"></a>
+<span class="sourceLineNo">1793</span>            "instead considering all candidate servers!");<a name="line.1793"></a>
+<span class="sourceLineNo">1794</span>      }<a name="line.1794"></a>
+<span class="sourceLineNo">1795</span>      LOG.debug("Processing assignQueue; systemServersCount=" + serversForSysTables.size() +<a name="line.1795"></a>
+<span class="sourceLineNo">1796</span>          ", allServersCount=" + servers.size());<a name="line.1796"></a>
+<span class="sourceLineNo">1797</span>      processAssignmentPlans(regions, null, systemHRIs,<a name="line.1797"></a>
+<span class="sourceLineNo">1798</span>          serversForSysTables.isEmpty()? servers: serversForSysTables);<a name="line.1798"></a>
+<span class="sourceLineNo">1799</span>    }<a name="line.1799"></a>
+<span class="sourceLineNo">1800</span><a name="line.1800"></a>
+<span class="sourceLineNo">1801</span>    processAssignmentPlans(regions, retainMap, userHRIs, servers);<a name="line.1801"></a>
+<span class="sourceLineNo">1802</span>  }<a name="line.1802"></a>
+<span class="sourceLineNo">1803</span><a name="line.1803"></a>
+<span class="sourceLineNo">1804</span>  private void processAssignmentPlans(final HashMap&lt;RegionInfo, RegionStateNode&gt; regions,<a name="line.1804"></a>
+<span class="sourceLineNo">1805</span>      final HashMap&lt;RegionInfo, ServerName&gt; retainMap, final List&lt;RegionInfo&gt; hris,<a name="line.1805"></a>
+<span class="sourceLineNo">1806</span>      final List&lt;ServerName&gt; servers) {<a name="line.1806"></a>
+<span class="sourceLineNo">1807</span>    boolean isTraceEnabled = LOG.isTraceEnabled();<a name="line.1807"></a>
+<span class="sourceLineNo">1808</span>    if (isTraceEnabled) {<a name="line.1808"></a>
+<span class="sourceLineNo">1809</span>      LOG.trace("Available servers count=" + servers.size() + ": " + servers);<a name="line.1809"></a>
+<span class="sourceLineNo">1810</span>    }<a name="line.1810"></a>
+<span class="sourceLineNo">1811</span><a name="line.1811"></a>
+<span class="sourceLineNo">1812</span>    final LoadBalancer balancer = getBalancer();<a name="line.1812"></a>
+<span class="sourceLineNo">1813</span>    // ask the balancer where to place regions<a name="line.1813"></a>
+<span class="sourceLineNo">1814</span>    if (retainMap != null &amp;&amp; !retainMap.isEmpty()) {<a name="line.1814"></a>
+<span class="sourceLineNo">1815</span>      if (isTraceEnabled) {<a name="line.1815"></a>
+<span class="sourceLineNo">1816</span>        LOG.trace("retain assign regions=" + retainMap);<a name="line.1816"></a>
 <span class="sourceLineNo">1817</span>      }<a name="line.1817"></a>
-<span class="sourceLineNo">1818</span>    }<a name="line.1818"></a>
-<span class="sourceLineNo">1819</span><a name="line.1819"></a>
-<span class="sourceLineNo">1820</span>    // TODO: Do we need to split retain and round-robin?<a name="line.1820"></a>
-<span class="sourceLineNo">1821</span>    // the retain seems to fallback to round-robin/random if the region is not in the map.<a name="line.1821"></a>
-<span class="sourceLineNo">1822</span>    if (!hris.isEmpty()) {<a name="line.1822"></a>
-<span class="sourceLineNo">1823</span>      Collections.sort(hris, RegionInfo.COMPARATOR);<a name="line.1823"></a>
-<span class="sourceLineNo">1824</span>      if (isTraceEnabled) {<a name="line.1824"></a>
-<span class="sourceLineNo">1825</span>        LOG.trace("round robin regions=" + hris);<a name="line.1825"></a>
-<span class="sourceLineNo">1826</span>      }<a name="line.1826"></a>
-<span class="sourceLineNo">1827</span>      try {<a name="line.1827"></a>
-<span class="sourceLineNo">1828</span>        acceptPlan(regions, balancer.roundRobinAssignment(hris, servers));<a name="line.1828"></a>
-<span class="sourceLineNo">1829</span>      } catch (HBaseIOException e) {<a name="line.1829"></a>
-<span class="sourceLineNo">1830</span>        LOG.warn("unable to round-robin assignment", e);<a name="line.1830"></a>
-<span class="sourceLineNo">1831</span>        addToPendingAssignment(regions, hris);<a name="line.1831"></a>
+<span class="sourceLineNo">1818</span>      try {<a name="line.1818"></a>
+<span class="sourceLineNo">1819</span>        acceptPlan(regions, balancer.retainAssignment(retainMap, servers));<a name="line.1819"></a>
+<span class="sourceLineNo">1820</span>      } catch (HBaseIOException e) {<a name="line.1820"></a>
+<span class="sourceLineNo">1821</span>        LOG.warn("unable to retain assignment", e);<a name="line.1821"></a>
+<span class="sourceLineNo">1822</span>        addToPendingAssignment(regions, retainMap.keySet());<a name="line.1822"></a>
+<span class="sourceLineNo">1823</span>      }<a name="line.1823"></a>
+<span class="sourceLineNo">1824</span>    }<a name="line.1824"></a>
+<span class="sourceLineNo">1825</span><a name="line.1825"></a>
+<span class="sourceLineNo">1826</span>    // TODO: Do we need to split retain and round-robin?<a name="line.1826"></a>
+<span class="sourceLineNo">1827</span>    // the retain seems to fallback to round-robin/random if the region is not in the map.<a name="line.1827"></a>
+<span class="sourceLineNo">1828</span>    if (!hris.isEmpty()) {<a name="line.1828"></a>
+<span class="sourceLineNo">1829</span>      Collections.sort(hris, RegionInfo.COMPARATOR);<a name="line.1829"></a>
+<span class="sourceLineNo">1830</span>      if (isTraceEnabled) {<a name="line.1830"></a>
+<span class="sourceLineNo">1831</span>        LOG.trace("round robin regions=" + hris);<a name="line.1831"></a>
 <span class="sourceLineNo">1832</span>      }<a name="line.1832"></a>
-<span class="sourceLineNo">1833</span>    }<a name="line.1833"></a>
-<span class="sourceLineNo">1834</span>  }<a name="line.1834"></a>
-<span class="sourceLineNo">1835</span><a name="line.1835"></a>
-<span class="sourceLineNo">1836</span>  private void acceptPlan(final HashMap&lt;RegionInfo, RegionStateNode&gt; regions,<a name="line.1836"></a>
-<span class="sourceLineNo">1837</span>      final Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; plan) throws HBaseIOException {<a name="line.1837"></a>
-<span class="sourceLineNo">1838</span>    final ProcedureEvent&lt;?&gt;[] events = new ProcedureEvent[regions.size()];<a name="line.1838"></a>
-<span class="sourceLineNo">1839</span>    final long st = System.currentTimeMillis();<a name="line.1839"></a>
-<span class="sourceLineNo">1840</span><a name="line.1840"></a>
-<span class="sourceLineNo">1841</span>    if (plan == null) {<a name="line.1841"></a>
-<span class="sourceLineNo">1842</span>      throw new HBaseIOException("unable to compute plans for regions=" + regions.size());<a name="line.1842"></a>
-<span class="sourceLineNo">1843</span>    }<a name="line.1843"></a>
-<span class="sourceLineNo">1844</span><a name="line.1844"></a>
-<span class="sourceLineNo">1845</span>    if (plan.isEmpty()) return;<a name="line.1845"></a>
+<span class="sourceLineNo">1833</span>      try {<a name="line.1833"></a>
+<span class="sourceLineNo">1834</span>        acceptPlan(regions, balancer.roundRobinAssignment(hris, servers));<a name="line.1834"></a>
+<span class="sourceLineNo">1835</span>      } catch (HBaseIOException e) {<a name="line.1835"></a>
+<span class="sourceLineNo">1836</span>        LOG.warn("unable to round-robin assignment", e);<a name="line.1836"></a>
+<span class="sourceLineNo">1837</span>        addToPendingAssignment(regions, hris);<a name="line.1837"></a>
+<span class="sourceLineNo">1838</span>      }<a name="line.1838"></a>
+<span class="sourceLineNo">1839</span>    }<a name="line.1839"></a>
+<span class="sourceLineNo">1840</span>  }<a name="line.1840"></a>
+<span class="sourceLineNo">1841</span><a name="line.1841"></a>
+<span class="sourceLineNo">1842</span>  private void acceptPlan(final HashMap&lt;RegionInfo, RegionStateNode&gt; regions,<a name="line.1842"></a>
+<span class="sourceLineNo">1843</span>      final Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; plan) throws HBaseIOException {<a name="line.1843"></a>
+<span class="sourceLineNo">1844</span>    final ProcedureEvent&lt;?&gt;[] events = new ProcedureEvent[regions.size()];<a name="line.1844"></a>
+<span class="sourceLineNo">1845</span>    final long st = System.currentTimeMillis();<a name="line.1845"></a>
 <span class="sourceLineNo">1846</span><a name="line.1846"></a>
-<span class="sourceLineNo">1847</span>    int evcount = 0;<a name="line.1847"></a>
-<span class="sourceLineNo">1848</span>    for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; entry: plan.entrySet()) {<a name="line.1848"></a>
-<span class="sourceLineNo">1849</span>      final ServerName server = entry.getKey();<a name="line.1849"></a>
-<span class="sourceLineNo">1850</span>      for (RegionInfo hri: entry.getValue()) {<a name="line.1850"></a>
-<span class="sourceLineNo">1851</span>        final RegionStateNode regionNode = regions.get(hri);<a name="line.1851"></a>
-<span class="sourceLineNo">1852</span>        regionNode.setRegionLocation(server);<a name="line.1852"></a>
-<span class="sourceLineNo">1853</span>        events[evcount++] = regionNode.getProcedureEvent();<a name="line.1853"></a>
-<span class="sourceLineNo">1854</span>      }<a name="line.1854"></a>
-<span class="sourceLineNo">1855</span>    }<a name="line.1855"></a>
-<span class="sourceLineNo">1856</span>    ProcedureEvent.wakeEvents(getProcedureScheduler(), events);<a name="line.1856"></a>
-<span class="sourceLineNo">1857</span><a name="line.1857"></a>
-<span class="sourceLineNo">1858</span>    final long et = System.currentTimeMillis();<a name="line.1858"></a>
-<span class="sourceLineNo">1859</span>    if (LOG.isTraceEnabled()) {<a name="line.1859"></a>
-<span class="sourceLineNo">1860</span>      LOG.trace("ASSIGN ACCEPT " + events.length + " -&gt; " +<a name="line.1860"></a>
-<span class="sourceLineNo">1861</span>          StringUtils.humanTimeDiff(et - st));<a name="line.1861"></a>
-<span class="sourceLineNo">1862</span>    }<a name="line.1862"></a>
-<span class="sourceLineNo">1863</span>  }<a name="line.1863"></a>
-<span class="sourceLineNo">1864</span><a name="line.1864"></a>
-<span class="sourceLineNo">1865</span>  private void addToPendingAssignment(final HashMap&lt;RegionInfo, RegionStateNode&gt; regions,<a name="line.1865"></a>
-<span class="sourceLineNo">1866</span>      final Collection&lt;RegionInfo&gt; pendingRegions) {<a name="line.1866"></a>
-<span class="sourceLineNo">1867</span>    assignQueueLock.lock();<a name="line.1867"></a>
-<span class="sourceLineNo">1868</span>    try {<a name="line.1868"></a>
-<span class="sourceLineNo">1869</span>      for (RegionInfo hri: pendingRegions) {<a name="line.1869"></a>
-<span class="sourceLineNo">1870</span>        pendingAssignQueue.add(regions.get(hri));<a name="line.1870"></a>
-<span class="sourceLineNo">1871</span>      }<a name="line.1871"></a>
-<span class="sourceLineNo">1872</span>    } finally {<a name="line.1872"></a>
-<span class="sourceLineNo">1873</span>      assignQueueLock.unlock();<a name="line.1873"></a>
-<span class="sourceLineNo">1874</span>    }<a name="line.1874"></a>
-<span class="sourceLineNo">1875</span>  }<a name="line.1875"></a>
-<span class="sourceLineNo">1876</span><a name="line.1876"></a>
-<span class="sourceLineNo">1877</span>  /**<a name="line.1877"></a>
-<span class="sourceLineNo">1878</span>   * Get a list of servers that this region cannot be assigned to.<a name="line.1878"></a>
-<span class="sourceLineNo">1879</span>   * For system tables, we must assign them to a server with highest version.<a name="line.1879"></a>
-<span class="sourceLineNo">1880</span>   */<a name="line.1880"></a>
-<span class="sourceLineNo">1881</span>  public List&lt;ServerName&gt; getExcludedServersForSystemTable() {<a name="line.1881"></a>
-<span class="sourceLineNo">1882</span>    // TODO: This should be a cached list kept by the ServerManager rather than calculated on each<a name="line.1882"></a>
-<span class="sourceLineNo">1883</span>    // move or system region assign. The RegionServerTracker keeps list of online Servers with<a name="line.1883"></a>
-<span class="sourceLineNo">1884</span>    // RegionServerInfo that includes Version.<a name="line.1884"></a>
-<span class="sourceLineNo">1885</span>    List&lt;Pair&lt;ServerName, String&gt;&gt; serverList = master.getServerManager().getOnlineServersList()<a name="line.1885"></a>
-<span class="sourceLineNo">1886</span>        .stream()<a name="line.1886"></a>
-<span class="sourceLineNo">1887</span>        .map((s)-&gt;new Pair&lt;&gt;(s, master.getRegionServerVersion(s)))<a name="line.1887"></a>
-<span class="sourceLineNo">1888</span>        .collect(Collectors.toList());<a name="line.1888"></a>
-<span class="sourceLineNo">1889</span>    if (serverList.isEmpty()) {<a name="line.1889"></a>
-<span class="sourceLineNo">1890</span>      return Collections.emptyList();<a name="line.1890"></a>
-<span class="sourceLineNo">1891</span>    }<a name="line.1891"></a>
-<span class="sourceLineNo">1892</span>    String highestVersion = Collections.max(serverList,<a name="line.1892"></a>
-<span class="sourceLineNo">1893</span>        (o1, o2) -&gt; VersionInfo.compareVersion(o1.getSecond(), o2.getSecond())).getSecond();<a name="line.1893"></a>
-<span class="sourceLineNo">1894</span>    return serverList.stream()<a name="line.1894"></a>
-<span class="sourceLineNo">1895</span>        .filter((p)-&gt;!p.getSecond().equals(highestVersion))<a name="line.1895"></a>
-<span class="sourceLineNo">1896</span>        .map(Pair::getFirst)<a name="line.1896"></a>
-<span class="sourceLineNo">1897</span>        .collect(Collectors.toList());<a name="line.1897"></a>
-<span class="sourceLineNo">1898</span>  }<a name="line.1898"></a>
-<span class="sourceLineNo">1899</span><a name="line.1899"></a>
-<span class="sourceLineNo">1900</span>  @VisibleForTesting<a name="line.1900"></a>
-<span class="sourceLineNo">1901</span>  MasterServices getMaster() {<a name="line.1901"></a>
-<span class="sourceLineNo">1902</span>    return master;<a name="line.1902"></a>
-<span class="sourceLineNo">1903</span>  }<a name="line.1903"></a>
-<span class="sourceLineNo">1904</span>}<a name="line.1904"></a>
+<span class="sourceLineNo">1847</span>    if (plan == null) {<a name="line.1847"></a>
+<span class="sourceLineNo">1848</span>      throw new HBaseIOException("unable to compute plans for regions=" + regions.size());<a name="line.1848"></a>
+<span class="sourceLineNo">1849</span>    }<a name="line.1849"></a>
+<span class="sourceLineNo">1850</span><a name="line.1850"></a>
+<span class="sourceLineNo">1851</span>    if (plan.isEmpty()) return;<a name="line.1851"></a>
+<span class="sourceLineNo">1852</span><a name="line.1852"></a>
+<span class="sourceLineNo">1853</span>    int evcount = 0;<a name="line.1853"></a>
+<span class="sourceLineNo">1854</span>    for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; entry: plan.entrySet()) {<a name="line.1854"></a>
+<span class="sourceLineNo">1855</span>      final ServerName server = entry.getKey();<a name="line.1855"></a>
+<span class="sourceLineNo">1856</span>      for (RegionInfo hri: entry.getValue()) {<a name="line.1856"></a>
+<span class="sourceLineNo">1857</span>        final RegionStateNode regionNode = regions.get(hri);<a name="line.1857"></a>
+<span class="sourceLineNo">1858</span>        regionNode.setRegionLocation(server);<a name="line.1858"></a>
+<span class="sourceLineNo">1859</span>        events[evcount++] = regionNode.getProcedureEvent();<a name="line.1859"></a>
+<span class="sourceLineNo">1860</span>      }<a name="line.1860"></a>
+<span class="sourceLineNo">1861</span>    }<a name="line.1861"></a>
+<span class="sourceLineNo">1862</span>    ProcedureEvent.wakeEvents(getProcedureScheduler(), events);<a name="line.1862"></a>
+<span class="sourceLineNo">1863</span><a name="line.1863"></a>
+<span class="sourceLineNo">1864</span>    final long et = System.currentTimeMillis();<a name="line.1864"></a>
+<span class="sourceLineNo">1865</span>    if (LOG.isTraceEnabled()) {<a name="line.1865"></a>
+<span class="sourceLineNo">1866</span>      LOG.trace("ASSIGN ACCEPT " + events.length + " -&gt; " +<a name="line.1866"></a>
+<span class="sourceLineNo">1867</span>          StringUtils.humanTimeDiff(et - st));<a name="line.1867"></a>
+<span class="sourceLineNo">1868</span>    }<a name="line.1868"></a>
+<span class="sourceLineNo">1869</span>  }<a name="line.1869"></a>
+<span class="sourceLineNo">1870</span><a name="line.1870"></a>
+<span class="sourceLineNo">1871</span>  private void addToPendingAssignment(final HashMap&lt;RegionInfo, RegionStateNode&gt; regions,<a name="line.1871"></a>
+<span class="sourceLineNo">1872</span>      final Collection&lt;RegionInfo&gt; pendingRegions) {<a name="line.1872"></a>
+<span class="sourceLineNo">1873</span>    assignQueueLock.lock();<a name="line.1873"></a>
+<span class="sourceLineNo">1874</span>    try {<a name="line.1874"></a>
+<span class="sourceLineNo">1875</span>      for (RegionInfo hri: pendingRegions) {<a name="line.1875"></a>
+<span class="sourceLineNo">1876</span>        pendingAssignQueue.add(regions.get(hri));<a name="line.1876"></a>
+<span class="sourceLineNo">1877</span>      }<a name="line.1877"></a>
+<span class="sourceLineNo">1878</span>    } finally {<a name="line.1878"></a>
+<span class="sourceLineNo">1879</span>      assignQueueLock.unlock();<a name="line.1879"></a>
+<span class="sourceLineNo">1880</span>    }<a name="line.1880"></a>
+<span class="sourceLineNo">1881</span>  }<a name="line.1881"></a>
+<span class="sourceLineNo">1882</span><a name="line.1882"></a>
+<span class="sourceLineNo">1883</span>  /**<a name="line.1883"></a>
+<span class="sourceLineNo">1884</span>   * Get a list of servers that this region cannot be assigned to.<a name="line.1884"></a>
+<span class="sourceLineNo">1885</span>   * For system tables, we must assign them to a server with highest version.<a name="line.1885"></a>
+<span class="sourceLineNo">1886</span>   */<a name="line.1886"></a>
+<span class="sourceLineNo">1887</span>  public List&lt;ServerName&gt; getExcludedServersForSystemTable() {<a name="line.1887"></a>
+<span class="sourceLineNo">1888</span>    // TODO: This should be a cached list kept by the ServerManager rather than calculated on each<a name="line.1888"></a>
+<span class="sourceLineNo">1889</span>    // move or system region assign. The RegionServerTracker keeps list of online Servers with<a name="line.1889"></a>
+<span class="sourceLineNo">1890</span>    // RegionServerInfo that includes Version.<a name="line.1890"></a>
+<span class="sourceLineNo">1891</span>    List&lt;Pair&lt;ServerName, String&gt;&gt; serverList = master.getServerManager().getOnlineServersList()<a name="line.1891"></a>
+<span class="sourceLineNo">1892</span>        .stream()<a name="line.1892"></a>
+<span class="sourceLineNo">1893</span>        .map((s)-&gt;new Pair&lt;&gt;(s, master.getRegionServerVersion(s)))<a name="line.1893"></a>
+<span class="sourceLineNo">1894</span>        .collect(Collectors.toList());<a name="line.1894"></a>
+<span class="sourceLineNo">1895</span>    if (serverList.isEmpty()) {<a name="line.1895"></a>
+<span class="sourceLineNo">1896</span>      return Collections.emptyList();<a name="line.1896"></a>
+<span class="sourceLineNo">1897</span>    }<a name="line.1897"></a>
+<span class="sourceLineNo">1898</span>    String highestVersion = Collections.max(serverList,<a name="line.1898"></a>
+<span class="sourceLineNo">1899</span>        (o1, o2) -&gt; VersionInfo.compareVersion(o1.getSecond(), o2.getSecond())).getSecond();<a name="line.1899"></a>
+<span class="sourceLineNo">1900</span>    return serverList.stream()<a name="line.1900"></a>
+<span class="sourceLineNo">1901</span>        .filter((p)-&gt;!p.getSecond().equals(highestVersion))<a name="line.1901"></a>
+<span class="sourceLineNo">1902</span>        .map(Pair::getFirst)<a name="line.1902"></a>
+<span class="sourceLineNo">1903</span>        .collect(Collectors.toList());<a name="line.1903"></a>
+<span class="sourceLineNo">1904</span>  }<a name="line.1904"></a>
+<span class="sourceLineNo">1905</span><a name="line.1905"></a>
+<span class="sourceLineNo">1906</span>  @VisibleForTesting<a name="line.1906"></a>
+<span class="sourceLineNo">1907</span>  MasterServices getMaster() {<a name="line.1907"></a>
+<span class="sourceLineNo">1908</span>    return master;<a name="line.1908"></a>
+<span class="sourceLineNo">1909</span>  }<a name="line.1909"></a>
+<span class="sourceLineNo">1910</span>}<a name="line.1910"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html
index 48ff447..7237a8a 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html
@@ -1203,713 +1203,719 @@
 <span class="sourceLineNo">1195</span>    private void update(final Collection&lt;RegionState&gt; regions, final long currentTime) {<a name="line.1195"></a>
 <span class="sourceLineNo">1196</span>      for (RegionState state: regions) {<a name="line.1196"></a>
 <span class="sourceLineNo">1197</span>        totalRITs++;<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>        final long ritTime = currentTime - state.getStamp();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>        if (ritTime &gt; ritThreshold) {<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>          if (ritsOverThreshold == null) {<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>            ritsOverThreshold = new HashMap&lt;String, RegionState&gt;();<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          }<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>          ritsOverThreshold.put(state.getRegion().getEncodedName(), state);<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>          totalRITsTwiceThreshold += (ritTime &gt; (ritThreshold * 2)) ? 1 : 0;<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>        }<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>        if (oldestRITTime &lt; ritTime) {<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>          oldestRITTime = ritTime;<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>        }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>      }<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>    }<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>  }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span><a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>  private void updateRegionsInTransitionMetrics(final RegionInTransitionStat ritStat) {<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>    metrics.updateRITOldestAge(ritStat.getOldestRITTime());<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    metrics.updateRITCount(ritStat.getTotalRITs());<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>    metrics.updateRITCountOverThreshold(ritStat.getTotalRITsOverThreshold());<a name="line.1216"></a>
+<span class="sourceLineNo">1198</span>        final long ritStartedMs = state.getStamp();<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>        if (ritStartedMs == 0) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>          // Don't output bogus values to metrics if they accidentally make it here.<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>          LOG.warn("The RIT {} has no start time", state.getRegion());<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>          continue;<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>        }<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>        final long ritTime = currentTime - ritStartedMs;<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>        if (ritTime &gt; ritThreshold) {<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>          if (ritsOverThreshold == null) {<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>            ritsOverThreshold = new HashMap&lt;String, RegionState&gt;();<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>          }<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>          ritsOverThreshold.put(state.getRegion().getEncodedName(), state);<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>          totalRITsTwiceThreshold += (ritTime &gt; (ritThreshold * 2)) ? 1 : 0;<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>        }<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>        if (oldestRITTime &lt; ritTime) {<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>          oldestRITTime = ritTime;<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>        }<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>      }<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>    }<a name="line.1216"></a>
 <span class="sourceLineNo">1217</span>  }<a name="line.1217"></a>
 <span class="sourceLineNo">1218</span><a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>  private void handleRegionOverStuckWarningThreshold(final RegionInfo regionInfo) {<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    final RegionStateNode regionNode = regionStates.getRegionStateNode(regionInfo);<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>    //if (regionNode.isStuck()) {<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>    LOG.warn("STUCK Region-In-Transition {}", regionNode);<a name="line.1222"></a>
+<span class="sourceLineNo">1219</span>  private void updateRegionsInTransitionMetrics(final RegionInTransitionStat ritStat) {<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>    metrics.updateRITOldestAge(ritStat.getOldestRITTime());<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>    metrics.updateRITCount(ritStat.getTotalRITs());<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>    metrics.updateRITCountOverThreshold(ritStat.getTotalRITsOverThreshold());<a name="line.1222"></a>
 <span class="sourceLineNo">1223</span>  }<a name="line.1223"></a>
 <span class="sourceLineNo">1224</span><a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>  // ============================================================================================<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>  //  TODO: Master load/bootstrap<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>  // ============================================================================================<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>  public void joinCluster() throws IOException {<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    long startTime = System.nanoTime();<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>    LOG.debug("Joining cluster...");<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span><a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    // Scan hbase:meta to build list of existing regions, servers, and assignment.<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    // hbase:meta is online now or will be. Inside loadMeta, we keep trying. Can't make progress<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    // w/o  meta.<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    loadMeta();<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span><a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>    while (master.getServerManager().countOfRegionServers() &lt; 1) {<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      LOG.info("Waiting for RegionServers to join; current count={}",<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>        master.getServerManager().countOfRegionServers());<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>      Threads.sleep(250);<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    }<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>    LOG.info("Number of RegionServers={}", master.getServerManager().countOfRegionServers());<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span><a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    // Start the RIT chore<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    master.getMasterProcedureExecutor().addChore(this.ritChore);<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span><a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    long costMs = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startTime);<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>    LOG.info("Joined the cluster in {}", StringUtils.humanTimeDiff(costMs));<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>  }<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span><a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>  /**<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>   * Create assign procedure for offline regions.<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>   * Just follow the old processofflineServersWithOnlineRegions method. Since now we do not need to<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>   * deal with dead server any more, we only deal with the regions in OFFLINE state in this method.<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>   * And this is a bit strange, that for new regions, we will add it in CLOSED state instead of<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>   * OFFLINE state, and usually there will be a procedure to track them. The<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>   * processofflineServersWithOnlineRegions is a legacy from long ago, as things are going really<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>   * different now, maybe we do not need this method any more. Need to revisit later.<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>   */<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>  // Public so can be run by the Master as part of the startup. Needs hbase:meta to be online.<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>  // Needs to be done after the table state manager has been started.<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>  public void processOfflineRegions() {<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    List&lt;RegionInfo&gt; offlineRegions = regionStates.getRegionStates().stream()<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>      .filter(RegionState::isOffline).filter(s -&gt; isTableEnabled(s.getRegion().getTable()))<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>      .map(RegionState::getRegion).collect(Collectors.toList());<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    if (!offlineRegions.isEmpty()) {<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>      master.getMasterProcedureExecutor().submitProcedures(<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>        master.getAssignmentManager().createRoundRobinAssignProcedures(offlineRegions));<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    }<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>  }<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span><a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>  private void loadMeta() throws IOException {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    // TODO: use a thread pool<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>    regionStateStore.visitMeta(new RegionStateStore.RegionStateVisitor() {<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>      @Override<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      public void visitRegionState(Result result, final RegionInfo regionInfo, final State state,<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>          final ServerName regionLocation, final ServerName lastHost, final long openSeqNum) {<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>        if (state == null &amp;&amp; regionLocation == null &amp;&amp; lastHost == null &amp;&amp;<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>            openSeqNum == SequenceId.NO_SEQUENCE_ID) {<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>          // This is a row with nothing in it.<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>          LOG.warn("Skipping empty row={}", result);<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>          return;<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>        }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>        State localState = state;<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>        if (localState == null) {<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>          // No region state column data in hbase:meta table! Are I doing a rolling upgrade from<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>          // hbase1 to hbase2? Am I restoring a SNAPSHOT or otherwise adding a region to hbase:meta?<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>          // In any of these cases, state is empty. For now, presume OFFLINE but there are probably<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>          // cases where we need to probe more to be sure this correct; TODO informed by experience.<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>          LOG.info(regionInfo.getEncodedName() + " regionState=null; presuming " + State.OFFLINE);<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span><a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>          localState = State.OFFLINE;<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>        }<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>        RegionStateNode regionNode = regionStates.getOrCreateRegionStateNode(regionInfo);<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>        // Do not need to lock on regionNode, as we can make sure that before we finish loading<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>        // meta, all the related procedures can not be executed. The only exception is for meta<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>        // region related operations, but here we do not load the informations for meta region.<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>        regionNode.setState(localState);<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>        regionNode.setLastHost(lastHost);<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>        regionNode.setRegionLocation(regionLocation);<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>        regionNode.setOpenSeqNum(openSeqNum);<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span><a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>        // Note: keep consistent with other methods, see region(Opening|Opened|Closing)<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>        //       RIT/ServerCrash handling should take care of the transiting regions.<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>        if (localState.matches(State.OPEN, State.OPENING, State.CLOSING, State.SPLITTING,<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>          State.MERGING)) {<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>          assert regionLocation != null : "found null region location for " + regionNode;<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>          regionStates.addRegionToServer(regionNode);<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>        } else if (localState == State.OFFLINE || regionInfo.isOffline()) {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>          regionStates.addToOfflineRegions(regionNode);<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>        }<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>      }<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    });<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span><a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>    // every assignment is blocked until meta is loaded.<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    wakeMetaLoadedEvent();<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>  }<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span><a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>  /**<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>   * Used to check if the meta loading is done.<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>   * &lt;p/&gt;<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>   * if not we throw PleaseHoldException since we are rebuilding the RegionStates<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>   * @param hri region to check if it is already rebuild<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>   * @throws PleaseHoldException if meta has not been loaded yet<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>   */<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>  private void checkMetaLoaded(RegionInfo hri) throws PleaseHoldException {<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>    if (!isRunning()) {<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>      throw new PleaseHoldException("AssignmentManager not running");<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    }<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>    boolean meta = isMetaRegion(hri);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>    boolean metaLoaded = isMetaLoaded();<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>    if (!meta &amp;&amp; !metaLoaded) {<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>      throw new PleaseHoldException(<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>        "Master not fully online; hbase:meta=" + meta + ", metaLoaded=" + metaLoaded);<a name="line.1334"></a>
+<span class="sourceLineNo">1225</span>  private void handleRegionOverStuckWarningThreshold(final RegionInfo regionInfo) {<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>    final RegionStateNode regionNode = regionStates.getRegionStateNode(regionInfo);<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>    //if (regionNode.isStuck()) {<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    LOG.warn("STUCK Region-In-Transition {}", regionNode);<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>  }<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span><a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>  // ============================================================================================<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>  //  TODO: Master load/bootstrap<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>  // ============================================================================================<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>  public void joinCluster() throws IOException {<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>    long startTime = System.nanoTime();<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>    LOG.debug("Joining cluster...");<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span><a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>    // Scan hbase:meta to build list of existing regions, servers, and assignment.<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>    // hbase:meta is online now or will be. Inside loadMeta, we keep trying. Can't make progress<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>    // w/o  meta.<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>    loadMeta();<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span><a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>    while (master.getServerManager().countOfRegionServers() &lt; 1) {<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>      LOG.info("Waiting for RegionServers to join; current count={}",<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>        master.getServerManager().countOfRegionServers());<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>      Threads.sleep(250);<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    }<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>    LOG.info("Number of RegionServers={}", master.getServerManager().countOfRegionServers());<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span><a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>    // Start the RIT chore<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>    master.getMasterProcedureExecutor().addChore(this.ritChore);<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span><a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>    long costMs = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startTime);<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>    LOG.info("Joined the cluster in {}", StringUtils.humanTimeDiff(costMs));<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>  }<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span><a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>  /**<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>   * Create assign procedure for offline regions.<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>   * Just follow the old processofflineServersWithOnlineRegions method. Since now we do not need to<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>   * deal with dead server any more, we only deal with the regions in OFFLINE state in this method.<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>   * And this is a bit strange, that for new regions, we will add it in CLOSED state instead of<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>   * OFFLINE state, and usually there will be a procedure to track them. The<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>   * processofflineServersWithOnlineRegions is a legacy from long ago, as things are going really<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>   * different now, maybe we do not need this method any more. Need to revisit later.<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>   */<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>  // Public so can be run by the Master as part of the startup. Needs hbase:meta to be online.<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>  // Needs to be done after the table state manager has been started.<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>  public void processOfflineRegions() {<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>    List&lt;RegionInfo&gt; offlineRegions = regionStates.getRegionStates().stream()<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>      .filter(RegionState::isOffline).filter(s -&gt; isTableEnabled(s.getRegion().getTable()))<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>      .map(RegionState::getRegion).collect(Collectors.toList());<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    if (!offlineRegions.isEmpty()) {<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>      master.getMasterProcedureExecutor().submitProcedures(<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>        master.getAssignmentManager().createRoundRobinAssignProcedures(offlineRegions));<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>    }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>  }<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span><a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>  private void loadMeta() throws IOException {<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>    // TODO: use a thread pool<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>    regionStateStore.visitMeta(new RegionStateStore.RegionStateVisitor() {<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>      @Override<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>      public void visitRegionState(Result result, final RegionInfo regionInfo, final State state,<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>          final ServerName regionLocation, final ServerName lastHost, final long openSeqNum) {<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>        if (state == null &amp;&amp; regionLocation == null &amp;&amp; lastHost == null &amp;&amp;<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>            openSeqNum == SequenceId.NO_SEQUENCE_ID) {<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>          // This is a row with nothing in it.<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>          LOG.warn("Skipping empty row={}", result);<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>          return;<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>        }<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>        State localState = state;<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>        if (localState == null) {<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>          // No region state column data in hbase:meta table! Are I doing a rolling upgrade from<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>          // hbase1 to hbase2? Am I restoring a SNAPSHOT or otherwise adding a region to hbase:meta?<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>          // In any of these cases, state is empty. For now, presume OFFLINE but there are probably<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>          // cases where we need to probe more to be sure this correct; TODO informed by experience.<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>          LOG.info(regionInfo.getEncodedName() + " regionState=null; presuming " + State.OFFLINE);<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>          localState = State.OFFLINE;<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>        }<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>        RegionStateNode regionNode = regionStates.getOrCreateRegionStateNode(regionInfo);<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>        // Do not need to lock on regionNode, as we can make sure that before we finish loading<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>        // meta, all the related procedures can not be executed. The only exception is for meta<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>        // region related operations, but here we do not load the informations for meta region.<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>        regionNode.setState(localState);<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>        regionNode.setLastHost(lastHost);<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>        regionNode.setRegionLocation(regionLocation);<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>        regionNode.setOpenSeqNum(openSeqNum);<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span><a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>        // Note: keep consistent with other methods, see region(Opening|Opened|Closing)<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>        //       RIT/ServerCrash handling should take care of the transiting regions.<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>        if (localState.matches(State.OPEN, State.OPENING, State.CLOSING, State.SPLITTING,<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>          State.MERGING)) {<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>          assert regionLocation != null : "found null region location for " + regionNode;<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>          regionStates.addRegionToServer(regionNode);<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>        } else if (localState == State.OFFLINE || regionInfo.isOffline()) {<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>          regionStates.addToOfflineRegions(regionNode);<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>        }<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>      }<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>    });<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span><a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    // every assignment is blocked until meta is loaded.<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>    wakeMetaLoadedEvent();<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>  }<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span><a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>  /**<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>   * Used to check if the meta loading is done.<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>   * &lt;p/&gt;<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>   * if not we throw PleaseHoldException since we are rebuilding the RegionStates<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>   * @param hri region to check if it is already rebuild<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>   * @throws PleaseHoldException if meta has not been loaded yet<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>   */<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>  private void checkMetaLoaded(RegionInfo hri) throws PleaseHoldException {<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>    if (!isRunning()) {<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>      throw new PleaseHoldException("AssignmentManager not running");<a name="line.1334"></a>
 <span class="sourceLineNo">1335</span>    }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>  }<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span><a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>  // ============================================================================================<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>  //  TODO: Metrics<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>  // ============================================================================================<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>  public int getNumRegionsOpened() {<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>    // TODO: Used by TestRegionPlacement.java and assume monotonically increasing value<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>    return 0;<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>  }<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span><a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>  public long submitServerCrash(ServerName serverName, boolean shouldSplitWal) {<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>    boolean carryingMeta;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>    long pid;<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>    ServerStateNode serverNode = regionStates.getServerNode(serverName);<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>    if(serverNode == null){<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      LOG.info("Skip to add SCP for {} since this server should be OFFLINE already", serverName);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>      return -1;<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>    }<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>    // we hold the write lock here for fencing on reportRegionStateTransition. Once we set the<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>    // server state to CRASHED, we will no longer accept the reportRegionStateTransition call from<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>    // this server. This is used to simplify the implementation for TRSP and SCP, where we can make<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    // sure that, the region list fetched by SCP will not be changed any more.<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>    serverNode.writeLock().lock();<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>    try {<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>      ProcedureExecutor&lt;MasterProcedureEnv&gt; procExec = this.master.getMasterProcedureExecutor();<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>      carryingMeta = isCarryingMeta(serverName);<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>      if (!serverNode.isInState(ServerState.ONLINE)) {<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>        LOG.info(<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>          "Skip to add SCP for {} with meta= {}, " +<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>              "since there should be a SCP is processing or already done for this server node",<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>          serverName, carryingMeta);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>        return -1;<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>      } else {<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>        serverNode.setState(ServerState.CRASHED);<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>        pid = procExec.submitProcedure(new ServerCrashProcedure(procExec.getEnvironment(),<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>            serverName, shouldSplitWal, carryingMeta));<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>        LOG.info(<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>          "Added {} to dead servers which carryingMeta={}, submitted ServerCrashProcedure pid={}",<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>          serverName, carryingMeta, pid);<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>      }<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>    } finally {<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>      serverNode.writeLock().unlock();<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>    }<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>    return pid;<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>  }<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span><a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>  public void offlineRegion(final RegionInfo regionInfo) {<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    // TODO used by MasterRpcServices<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    RegionStateNode node = regionStates.getRegionStateNode(regionInfo);<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>    if (node != null) {<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>      node.offline();<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>    }<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>  }<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span><a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>  public void onlineRegion(final RegionInfo regionInfo, final ServerName serverName) {<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>    // TODO used by TestSplitTransactionOnCluster.java<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>  }<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span><a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; getSnapShotOfAssignment(<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>      final Collection&lt;RegionInfo&gt; regions) {<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>    return regionStates.getSnapShotOfAssignment(regions);<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>  }<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span><a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>  // ============================================================================================<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>  //  TODO: UTILS/HELPERS?<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>  // ============================================================================================<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>  /**<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>   * Used by the client (via master) to identify if all regions have the schema updates<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>   *<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>   * @param tableName<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>   * @return Pair indicating the status of the alter command (pending/total)<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>   * @throws IOException<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>   */<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>  public Pair&lt;Integer, Integer&gt; getReopenStatus(TableName tableName) {<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>    if (isTableDisabled(tableName)) return new Pair&lt;Integer, Integer&gt;(0, 0);<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span><a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>    final List&lt;RegionState&gt; states = regionStates.getTableRegionStates(tableName);<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>    int ritCount = 0;<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>    for (RegionState regionState: states) {<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>      if (!regionState.isOpened() &amp;&amp; !regionState.isSplit()) {<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>        ritCount++;<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>      }<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    }<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>    return new Pair&lt;Integer, Integer&gt;(ritCount, states.size());<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>  }<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span><a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>  // ============================================================================================<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>  //  TODO: Region State In Transition<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>  // ============================================================================================<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>  public boolean hasRegionsInTransition() {<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>    return regionStates.hasRegionsInTransition();<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>  }<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span><a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>  public List&lt;RegionStateNode&gt; getRegionsInTransition() {<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>    return regionStates.getRegionsInTransition();<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>  }<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span><a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>  public List&lt;RegionInfo&gt; getAssignedRegions() {<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>    return regionStates.getAssignedRegions();<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>  }<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span><a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>  public RegionInfo getRegionInfo(final byte[] regionName) {<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    final RegionStateNode regionState = regionStates.getRegionStateNodeFromName(regionName);<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    return regionState != null ? regionState.getRegionInfo() : null;<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>  }<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span><a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>  // ============================================================================================<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>  //  Expected states on region state transition.<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>  //  Notice that there is expected states for transiting to OPENING state, this is because SCP.<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>  //  See the comments in regionOpening method for more details.<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>  // ============================================================================================<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>  private static final State[] STATES_EXPECTED_ON_OPEN = {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>    State.OPENING, // Normal case<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>    State.OPEN // Retrying<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>  };<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span><a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>  private static final State[] STATES_EXPECTED_ON_CLOSING = {<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    State.OPEN, // Normal case<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    State.CLOSING, // Retrying<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>    State.SPLITTING, // Offline the split parent<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>    State.MERGING // Offline the merge parents<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>  };<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span><a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>  private static final State[] STATES_EXPECTED_ON_CLOSED = {<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>    State.CLOSING, // Normal case<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>    State.CLOSED // Retrying<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>  };<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span><a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>  // This is for manually scheduled region assign, can add other states later if we find out other<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>  // usages<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>  private static final State[] STATES_EXPECTED_ON_ASSIGN = { State.CLOSED, State.OFFLINE };<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span><a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>  // We only allow unassign or move a region which is in OPEN state.<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>  private static final State[] STATES_EXPECTED_ON_UNASSIGN_OR_MOVE = { State.OPEN };<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span><a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>  // ============================================================================================<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>  //  Region Status update<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>  //  Should only be called in TransitRegionStateProcedure<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>  // ============================================================================================<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>  private void transitStateAndUpdate(RegionStateNode regionNode, RegionState.State newState,<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>      RegionState.State... expectedStates) throws IOException {<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>    RegionState.State state = regionNode.getState();<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>    regionNode.transitionState(newState, expectedStates);<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>    boolean succ = false;<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>    try {<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>      regionStateStore.updateRegionLocation(regionNode);<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>      succ = true;<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>    } finally {<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>      if (!succ) {<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>        // revert<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>        regionNode.setState(state);<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>      }<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>    }<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>  }<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span><a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>  // should be called within the synchronized block of RegionStateNode<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>  void regionOpening(RegionStateNode regionNode) throws IOException {<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>    // As in SCP, for performance reason, there is no TRSP attached with this region, we will not<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>    // update the region state, which means that the region could be in any state when we want to<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>    // assign it after a RS crash. So here we do not pass the expectedStates parameter.<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>    transitStateAndUpdate(regionNode, State.OPENING);<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>    regionStates.addRegionToServer(regionNode);<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>    // update the operation count metrics<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>    metrics.incrementOperationCounter();<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>  }<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span><a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>  // should be called within the synchronized block of RegionStateNode.<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>  // The parameter 'giveUp' means whether we will try to open the region again, if it is true, then<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span>  // we will persist the FAILED_OPEN state into hbase:meta.<a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>  void regionFailedOpen(RegionStateNode regionNode, boolean giveUp) throws IOException {<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>    RegionState.State state = regionNode.getState();<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>    ServerName regionLocation = regionNode.getRegionLocation();<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>    if (giveUp) {<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>      regionNode.setState(State.FAILED_OPEN);<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span>      regionNode.setRegionLocation(null);<a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>      boolean succ = false;<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>      try {<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>        regionStateStore.updateRegionLocation(regionNode);<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>        succ = true;<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>      } finally {<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>        if (!succ) {<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>          // revert<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>          regionNode.setState(state);<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>          regionNode.setRegionLocation(regionLocation);<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span>        }<a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>      }<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span>    }<a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>    if (regionLocation != null) {<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>      regionStates.removeRegionFromServer(regionLocation, regionNode);<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>    }<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>  }<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span><a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>  // should be called within the synchronized block of RegionStateNode<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>  void regionOpened(RegionStateNode regionNode) throws IOException {<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>    // TODO: OPENING Updates hbase:meta too... we need to do both here and there?<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span>    // That is a lot of hbase:meta writing.<a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>    transitStateAndUpdate(regionNode, State.OPEN, STATES_EXPECTED_ON_OPEN);<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>    RegionInfo hri = regionNode.getRegionInfo();<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>    if (isMetaRegion(hri)) {<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span>      // Usually we'd set a table ENABLED at this stage but hbase:meta is ALWAYs enabled, it<a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>      // can't be disabled -- so skip the RPC (besides... enabled is managed by TableStateManager<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>      // which is backed by hbase:meta... Avoid setting ENABLED to avoid having to update state<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>      // on table that contains state.<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>      setMetaAssigned(hri, true);<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>    }<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>    regionStates.addRegionToServer(regionNode);<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>    regionStates.removeFromFailedOpen(hri);<a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>  }<a name="line.1543"></a>
-<span class="sourceLineNo">1544</span><a name="line.1544"></a>
-<span class="sourceLineNo">1545</span>  // should be called within the synchronized block of RegionStateNode<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span>  void regionClosing(RegionStateNode regionNode) throws IOException {<a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>    transitStateAndUpdate(regionNode, State.CLOSING, STATES_EXPECTED_ON_CLOSING);<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span><a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>    RegionInfo hri = regionNode.getRegionInfo();<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>    // Set meta has not initialized early. so people trying to create/edit tables will wait<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>    if (isMetaRegion(hri)) {<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>      setMetaAssigned(hri, false);<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>    }<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>    regionStates.addRegionToServer(regionNode);<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>    // update the operation count metrics<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>    metrics.incrementOperationCounter();<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>  }<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span><a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>  // should be called within the synchronized block of RegionStateNode<a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>  // The parameter 'normally' means whether we are closed cleanly, if it is true, then it means that<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>  // we are closed due to a RS crash.<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>  void regionClosed(RegionStateNode regionNode, boolean normally) throws IOException {<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span>    RegionState.State state = regionNode.getState();<a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>    ServerName regionLocation = regionNode.getRegionLocation();<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>    if (normally) {<a name="line.1565"></a>
-<span class="sourceLineNo">1566</span>      regionNode.transitionState(State.CLOSED, STATES_EXPECTED_ON_CLOSED);<a name="line.1566"></a>
-<span class="sourceLineNo">1567</span>    } else {<a name="line.1567"></a>
-<span class="sourceLineNo">1568</span>      // For SCP<a name="line.1568"></a>
-<span class="sourceLineNo">1569</span>      regionNode.transitionState(State.ABNORMALLY_CLOSED);<a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>    }<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>    regionNode.setRegionLocation(null);<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>    boolean succ = false;<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>    try {<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span>      regionStateStore.updateRegionLocation(regionNode);<a name="line.1574"></a>
-<span class="sourceLineNo">1575</span>      succ = true;<a name="line.1575"></a>
-<span class="sourceLineNo">1576</span>    } finally {<a name="line.1576"></a>
-<span class="sourceLineNo">1577</span>      if (!succ) {<a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>        // revert<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>        regionNode.setState(state);<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>        regionNode.setRegionLocation(regionLocation);<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span>      }<a name="line.1581"></a>
-<span class="sourceLineNo">1582</span>    }<a name="line.1582"></a>
-<span class="sourceLineNo">1583</span>    if (regionLocation != null) {<a name="line.1583"></a>
-<span class="sourceLineNo">1584</span>      regionNode.setLastHost(regionLocation);<a name="line.1584"></a>
-<span class="sourceLineNo">1585</span>      regionStates.removeRegionFromServer(regionLocation, regionNode);<a name="line.1585"></a>
-<span class="sourceLineNo">1586</span>    }<a name="line.1586"></a>
-<span class="sourceLineNo">1587</span>  }<a name="line.1587"></a>
-<span class="sourceLineNo">1588</span><a name="line.1588"></a>
-<span class="sourceLineNo">1589</span>  public void markRegionAsSplit(final RegionInfo parent, final ServerName serverName,<a name="line.1589"></a>
-<span class="sourceLineNo">1590</span>      final RegionInfo daughterA, final RegionInfo daughterB) throws IOException {<a name="line.1590"></a>
-<span class="sourceLineNo">1591</span>    // Update hbase:meta. Parent will be marked offline and split up in hbase:meta.<a name="line.1591"></a>
-<span class="sourceLineNo">1592</span>    // The parent stays in regionStates until cleared when removed by CatalogJanitor.<a name="line.1592"></a>
-<span class="sourceLineNo">1593</span>    // Update its state in regionStates to it shows as offline and split when read<a name="line.1593"></a>
-<span class="sourceLineNo">1594</span>    // later figuring what regions are in a table and what are not: see<a name="line.1594"></a>
-<span class="sourceLineNo">1595</span>    // regionStates#getRegionsOfTable<a name="line.1595"></a>
-<span class="sourceLineNo">1596</span>    final RegionStateNode node = regionStates.getOrCreateRegionStateNode(parent);<a name="line.1596"></a>
-<span class="sourceLineNo">1597</span>    node.setState(State.SPLIT);<a name="line.1597"></a>
-<span class="sourceLineNo">1598</span>    final RegionStateNode nodeA = regionStates.getOrCreateRegionStateNode(daughterA);<a name="line.1598"></a>
-<span class="sourceLineNo">1599</span>    nodeA.setState(State.SPLITTING_NEW);<a name="line.1599"></a>
-<span class="sourceLineNo">1600</span>    final RegionStateNode nodeB = regionStates.getOrCreateRegionStateNode(daughterB);<a name="line.1600"></a>
-<span class="sourceLineNo">1601</span>    nodeB.setState(State.SPLITTING_NEW);<a name="line.1601"></a>
-<span class="sourceLineNo">1602</span><a name="line.1602"></a>
-<span class="sourceLineNo">1603</span>    regionStateStore.splitRegion(parent, daughterA, daughterB, serverName);<a name="line.1603"></a>
-<span class="sourceLineNo">1604</span>    if (shouldAssignFavoredNodes(parent)) {<a name="line.1604"></a>
-<span class="sourceLineNo">1605</span>      List&lt;ServerName&gt; onlineServers = this.master.getServerManager().getOnlineServersList();<a name="line.1605"></a>
-<span class="sourceLineNo">1606</span>      ((FavoredNodesPromoter)getBalancer()).<a name="line.1606"></a>
-<span class="sourceLineNo">1607</span>          generateFavoredNodesForDaughter(onlineServers, parent, daughterA, daughterB);<a name="line.1607"></a>
-<span class="sourceLineNo">1608</span>    }<a name="line.1608"></a>
-<span class="sourceLineNo">1609</span>  }<a name="line.1609"></a>
-<span class="sourceLineNo">1610</span><a name="line.1610"></a>
-<span class="sourceLineNo">1611</span>  /**<a name="line.1611"></a>
-<span class="sourceLineNo">1612</span>   * When called here, the merge has happened. The two merged regions have been<a name="line.1612"></a>
-<span class="sourceLineNo">1613</span>   * unassigned and the above markRegionClosed has been called on each so they have been<a name="line.1613"></a>
-<span class="sourceLineNo">1614</span>   * disassociated from a hosting Server. The merged region will be open after this call. The<a name="line.1614"></a>
-<span class="sourceLineNo">1615</span>   * merged regions are removed from hbase:meta below&gt; Later they are deleted from the filesystem<a name="line.1615"></a>
-<span class="sourceLineNo">1616</span>   * by the catalog janitor running against hbase:meta. It notices when the merged region no<a name="line.1616"></a>
-<span class="sourceLineNo">1617</span>   * longer holds references to the old regions.<a name="line.1617"></a>
-<span class="sourceLineNo">1618</span>   */<a name="line.1618"></a>
-<span class="sourceLineNo">1619</span>  public void markRegionAsMerged(final RegionInfo child, final ServerName serverName,<a name="line.1619"></a>
-<span class="sourceLineNo">1620</span>      final RegionInfo mother, final RegionInfo father) throws IOException {<a name="line.1620"></a>
-<span class="sourceLineNo">1621</span>    final RegionStateNode node = regionStates.getOrCreateRegionStateNode(child);<a name="line.1621"></a>
-<span class="sourceLineNo">1622</span>    node.setState(State.MERGED);<a name="line.1622"></a>
-<span class="sourceLineNo">1623</span>    regionStates.deleteRegion(mother);<a name="line.1623"></a>
-<span class="sourceLineNo">1624</span>    regionStates.deleteRegion(father);<a name="line.1624"></a>
-<span class="sourceLineNo">1625</span>    regionStateStore.mergeRegions(child, mother, father, serverName);<a name="line.1625"></a>
-<span class="sourceLineNo">1626</span>    if (shouldAssignFavoredNodes(child)) {<a name="line.1626"></a>
-<span class="sourceLineNo">1627</span>      ((FavoredNodesPromoter)getBalancer()).<a name="line.1627"></a>
-<span class="sourceLineNo">1628</span>        generateFavoredNodesForMergedRegion(child, mother, father);<a name="line.1628"></a>
-<span class="sourceLineNo">1629</span>    }<a name="line.1629"></a>
-<span class="sourceLineNo">1630</span>  }<a name="line.1630"></a>
-<span class="sourceLineNo">1631</span><a name="line.1631"></a>
-<span class="sourceLineNo">1632</span>  /*<a name="line.1632"></a>
-<span class="sourceLineNo">1633</span>   * Favored nodes should be applied only when FavoredNodes balancer is configured and the region<a name="line.1633"></a>
-<span class="sourceLineNo">1634</span>   * belongs to a non-system table.<a name="line.1634"></a>
-<span class="sourceLineNo">1635</span>   */<a name="line.1635"></a>
-<span class="sourceLineNo">1636</span>  private boolean shouldAssignFavoredNodes(RegionInfo region) {<a name="line.1636"></a>
-<span class="sourceLineNo">1637</span>    return this.shouldAssignRegionsWithFavoredNodes &amp;&amp;<a name="line.1637"></a>
-<span class="sourceLineNo">1638</span>        FavoredNodesManager.isFavoredNodeApplicable(region);<a name="line.1638"></a>
-<span class="sourceLineNo">1639</span>  }<a name="line.1639"></a>
-<span class="sourceLineNo">1640</span><a name="line.1640"></a>
-<span class="sourceLineNo">1641</span>  // ============================================================================================<a name="line.1641"></a>
-<span class="sourceLineNo">1642</span>  //  Assign Queue (Assign/Balance)<a name="line.1642"></a>
-<span class="sourceLineNo">1643</span>  // ============================================================================================<a name="line.1643"></a>
-<span class="sourceLineNo">1644</span>  private final ArrayList&lt;RegionStateNode&gt; pendingAssignQueue = new ArrayList&lt;RegionStateNode&gt;();<a name="line.1644"></a>
-<span class="sourceLineNo">1645</span>  private final ReentrantLock assignQueueLock = new ReentrantLock();<a name="line.1645"></a>
-<span class="sourceLineNo">1646</span>  private final Condition assignQueueFullCond = assignQueueLock.newCondition();<a name="line.1646"></a>
-<span class="sourceLineNo">1647</span><a name="line.1647"></a>
-<span class="sourceLineNo">1648</span>  /**<a name="line.1648"></a>
-<span class="sourceLineNo">1649</span>   * Add the assign operation to the assignment queue.<a name="line.1649"></a>
-<span class="sourceLineNo">1650</span>   * The pending assignment operation will be processed,<a name="line.1650"></a>
-<span class="sourceLineNo">1651</span>   * and each region will be assigned by a server using the balancer.<a name="line.1651"></a>
-<span class="sourceLineNo">1652</span>   */<a name="line.1652"></a>
-<span class="sourceLineNo">1653</span>  protected void queueAssign(final RegionStateNode regionNode) {<a name="line.1653"></a>
-<span class="sourceLineNo">1654</span>    regionNode.getProcedureEvent().suspend();<a name="line.1654"></a>
-<span class="sourceLineNo">1655</span><a name="line.1655"></a>
-<span class="sourceLineNo">1656</span>    // TODO: quick-start for meta and the other sys-tables?<a name="line.1656"></a>
-<span class="sourceLineNo">1657</span>    assignQueueLock.lock();<a name="line.1657"></a>
-<span class="sourceLineNo">1658</span>    try {<a name="line.1658"></a>
-<span class="sourceLineNo">1659</span>      pendingAssignQueue.add(regionNode);<a name="line.1659"></a>
-<span class="sourceLineNo">1660</span>      if (regionNode.isSystemTable() ||<a name="line.1660"></a>
-<span class="sourceLineNo">1661</span>          pendingAssignQueue.size() == 1 ||<a name="line.1661"></a>
-<span class="sourceLineNo">1662</span>          pendingAssignQueue.size() &gt;= assignDispatchWaitQueueMaxSize) {<a name="line.1662"></a>
-<span class="sourceLineNo">1663</span>        assignQueueFullCond.signal();<a name="line.1663"></a>
-<span class="sourceLineNo">1664</span>      }<a name="line.1664"></a>
-<span class="sourceLineNo">1665</span>    } finally {<a name="line.1665"></a>
-<span class="sourceLineNo">1666</span>      assignQueueLock.unlock();<a name="line.1666"></a>
-<span class="sourceLineNo">1667</span>    }<a name="line.1667"></a>
-<span class="sourceLineNo">1668</span>  }<a name="line.1668"></a>
-<span class="sourceLineNo">1669</span><a name="line.1669"></a>
-<span class="sourceLineNo">1670</span>  private void startAssignmentThread() {<a name="line.1670"></a>
-<span class="sourceLineNo">1671</span>    // Get Server Thread name. Sometimes the Server is mocked so may not implement HasThread.<a name="line.1671"></a>
-<span class="sourceLineNo">1672</span>    // For example, in tests.<a name="line.1672"></a>
-<span class="sourceLineNo">1673</span>    String name = master instanceof HasThread? ((HasThread)master).getName():<a name="line.1673"></a>
-<span class="sourceLineNo">1674</span>        master.getServerName().toShortString();<a name="line.1674"></a>
-<span class="sourceLineNo">1675</span>    assignThread = new Thread(name) {<a name="line.1675"></a>
-<span class="sourceLineNo">1676</span>      @Override<a name="line.1676"></a>
-<span class="sourceLineNo">1677</span>      public void run() {<a name="line.1677"></a>
-<span class="sourceLineNo">1678</span>        while (isRunning()) {<a name="line.1678"></a>
-<span class="sourceLineNo">1679</span>          processAssignQueue();<a name="line.1679"></a>
-<span class="sourceLineNo">1680</span>        }<a name="line.1680"></a>
-<span class="sourceLineNo">1681</span>        pendingAssignQueue.clear();<a name="line.1681"></a>
-<span class="sourceLineNo">1682</span>      }<a name="line.1682"></a>
-<span class="sourceLineNo">1683</span>    };<a name="line.1683"></a>
-<span class="sourceLineNo">1684</span>    assignThread.setDaemon(true);<a name="line.1684"></a>
-<span class="sourceLineNo">1685</span>    assignThread.start();<a name="line.1685"></a>
-<span class="sourceLineNo">1686</span>  }<a name="line.1686"></a>
-<span class="sourceLineNo">1687</span><a name="line.1687"></a>
-<span class="sourceLineNo">1688</span>  private void stopAssignmentThread() {<a name="line.1688"></a>
-<span class="sourceLineNo">1689</span>    assignQueueSignal();<a name="line.1689"></a>
-<span class="sourceLineNo">1690</span>    try {<a name="line.1690"></a>
-<span class="sourceLineNo">1691</span>      while (assignThread.isAlive()) {<a name="line.1691"></a>
-<span class="sourceLineNo">1692</span>        assignQueueSignal();<a name="line.1692"></a>
-<span class="sourceLineNo">1693</span>        assignThread.join(250);<a name="line.1693"></a>
-<span class="sourceLineNo">1694</span>      }<a name="line.1694"></a>
-<span class="sourceLineNo">1695</span>    } catch (InterruptedException e) {<a name="line.1695"></a>
-<span class="sourceLineNo">1696</span>      LOG.warn("join interrupted", e);<a name="line.1696"></a>
-<span class="sourceLineNo">1697</span>      Thread.currentThread().interrupt();<a name="line.1697"></a>
-<span class="sourceLineNo">1698</span>    }<a name="line.1698"></a>
-<span class="sourceLineNo">1699</span>  }<a name="line.1699"></a>
-<span class="sourceLineNo">1700</span><a name="line.1700"></a>
-<span class="sourceLineNo">1701</span>  private void assignQueueSignal() {<a name="line.1701"></a>
-<span class="sourceLineNo">1702</span>    assignQueueLock.lock();<a name="line.1702"></a>
-<span class="sourceLineNo">1703</span>    try {<a name="line.1703"></a>
-<span class="sourceLineNo">1704</span>      assignQueueFullCond.signal();<a name="line.1704"></a>
-<span class="sourceLineNo">1705</span>    } finally {<a name="line.1705"></a>
-<span class="sourceLineNo">1706</span>      assignQueueLock.unlock();<a name="line.1706"></a>
-<span class="sourceLineNo">1707</span>    }<a name="line.1707"></a>
-<span class="sourceLineNo">1708</span>  }<a name="line.1708"></a>
-<span class="sourceLineNo">1709</span><a name="line.1709"></a>
-<span class="sourceLineNo">1710</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings("WA_AWAIT_NOT_IN_LOOP")<a name="line.1710"></a>
-<span class="sourceLineNo">1711</span>  private HashMap&lt;RegionInfo, RegionStateNode&gt; waitOnAssignQueue() {<a name="line.1711"></a>
-<span class="sourceLineNo">1712</span>    HashMap&lt;RegionInfo, RegionStateNode&gt; regions = null;<a name="line.1712"></a>
-<span class="sourceLineNo">1713</span><a name="line.1713"></a>
-<span class="sourceLineNo">1714</span>    assignQueueLock.lock();<a name="line.1714"></a>
-<span class="sourceLineNo">1715</span>    try {<a name="line.1715"></a>
-<span class="sourceLineNo">1716</span>      if (pendingAssignQueue.isEmpty() &amp;&amp; isRunning()) {<a name="line.1716"></a>
-<span class="sourceLineNo">1717</span>        assignQueueFullCond.await();<a name="line.1717"></a>
-<span class="sourceLineNo">1718</span>      }<a name="line.1718"></a>
+<span class="sourceLineNo">1336</span>    boolean meta = isMetaRegion(hri);<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    boolean metaLoaded = isMetaLoaded();<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>    if (!meta &amp;&amp; !metaLoaded) {<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>      throw new PleaseHoldException(<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>        "Master not fully online; hbase:meta=" + meta + ", metaLoaded=" + metaLoaded);<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>    }<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>  }<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span><a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>  // ============================================================================================<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>  //  TODO: Metrics<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>  // ============================================================================================<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>  public int getNumRegionsOpened() {<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    // TODO: Used by TestRegionPlacement.java and assume monotonically increasing value<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>    return 0;<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>  }<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span><a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>  public long submitServerCrash(ServerName serverName, boolean shouldSplitWal) {<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>    boolean carryingMeta;<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>    long pid;<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    ServerStateNode serverNode = regionStates.getServerNode(serverName);<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>    if(serverNode == null){<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>      LOG.info("Skip to add SCP for {} since this server should be OFFLINE already", serverName);<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>      return -1;<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    }<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    // we hold the write lock here for fencing on reportRegionStateTransition. Once we set the<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>    // server state to CRASHED, we will no longer accept the reportRegionStateTransition call from<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>    // this server. This is used to simplify the implementation for TRSP and SCP, where we can make<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>    // sure that, the region list fetched by SCP will not be changed any more.<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>    serverNode.writeLock().lock();<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    try {<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>      ProcedureExecutor&lt;MasterProcedureEnv&gt; procExec = this.master.getMasterProcedureExecutor();<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>      carryingMeta = isCarryingMeta(serverName);<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>      if (!serverNode.isInState(ServerState.ONLINE)) {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>        LOG.info(<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>          "Skip to add SCP for {} with meta= {}, " +<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>              "since there should be a SCP is processing or already done for this server node",<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>          serverName, carryingMeta);<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>        return -1;<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>      } else {<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>        serverNode.setState(ServerState.CRASHED);<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>        pid = procExec.submitProcedure(new ServerCrashProcedure(procExec.getEnvironment(),<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>            serverName, shouldSplitWal, carryingMeta));<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>        LOG.info(<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>          "Added {} to dead servers which carryingMeta={}, submitted ServerCrashProcedure pid={}",<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>          serverName, carryingMeta, pid);<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>      }<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>    } finally {<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>      serverNode.writeLock().unlock();<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>    }<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>    return pid;<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>  }<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span><a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>  public void offlineRegion(final RegionInfo regionInfo) {<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>    // TODO used by MasterRpcServices<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>    RegionStateNode node = regionStates.getRegionStateNode(regionInfo);<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>    if (node != null) {<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>      node.offline();<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>    }<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>  }<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span><a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>  public void onlineRegion(final RegionInfo regionInfo, final ServerName serverName) {<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>    // TODO used by TestSplitTransactionOnCluster.java<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span>  }<a name="line.1398"></a>
+<span class="sourceLineNo">1399</span><a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; getSnapShotOfAssignment(<a name="line.1400"></a>
+<span class="sourceLineNo">1401</span>      final Collection&lt;RegionInfo&gt; regions) {<a name="line.1401"></a>
+<span class="sourceLineNo">1402</span>    return regionStates.getSnapShotOfAssignment(regions);<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>  }<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span><a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>  // ============================================================================================<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>  //  TODO: UTILS/HELPERS?<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>  // ============================================================================================<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>  /**<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>   * Used by the client (via master) to identify if all regions have the schema updates<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>   *<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>   * @param tableName<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>   * @return Pair indicating the status of the alter command (pending/total)<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>   * @throws IOException<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>   */<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>  public Pair&lt;Integer, Integer&gt; getReopenStatus(TableName tableName) {<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>    if (isTableDisabled(tableName)) return new Pair&lt;Integer, Integer&gt;(0, 0);<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span><a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>    final List&lt;RegionState&gt; states = regionStates.getTableRegionStates(tableName);<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>    int ritCount = 0;<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span>    for (RegionState regionState: states) {<a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>      if (!regionState.isOpened() &amp;&amp; !regionState.isSplit()) {<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>        ritCount++;<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>      }<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span>    }<a name="line.1424"></a>
+<span class="sourceLineNo">1425</span>    return new Pair&lt;Integer, Integer&gt;(ritCount, states.size());<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>  }<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span><a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>  // ============================================================================================<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>  //  TODO: Region State In Transition<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span>  // ============================================================================================<a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>  public boolean hasRegionsInTransition() {<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>    return regionStates.hasRegionsInTransition();<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span>  }<a name="line.1433"></a>
+<span class="sourceLineNo">1434</span><a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>  public List&lt;RegionStateNode&gt; getRegionsInTransition() {<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span>    return regionStates.getRegionsInTransition();<a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>  }<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span><a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>  public List&lt;RegionInfo&gt; getAssignedRegions() {<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>    return regionStates.getAssignedRegions();<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>  }<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span><a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>  public RegionInfo getRegionInfo(final byte[] regionName) {<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>    final RegionStateNode regionState = regionStates.getRegionStateNodeFromName(regionName);<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>    return regionState != null ? regionState.getRegionInfo() : null;<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span>  }<a name="line.1446"></a>
+<span class="sourceLineNo">1447</span><a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>  // ============================================================================================<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>  //  Expected states on region state transition.<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span>  //  Notice that there is expected states for transiting to OPENING state, this is because SCP.<a name="line.1450"></a>
+<span class="sourceLineNo">1451</span>  //  See the comments in regionOpening method for more details.<a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>  // ============================================================================================<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>  private static final State[] STATES_EXPECTED_ON_OPEN = {<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>    State.OPENING, // Normal case<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>    State.OPEN // Retrying<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>  };<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span><a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>  private static final State[] STATES_EXPECTED_ON_CLOSING = {<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>    State.OPEN, // Normal case<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>    State.CLOSING, // Retrying<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>    State.SPLITTING, // Offline the split parent<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>    State.MERGING // Offline the merge parents<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>  };<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span><a name="line.1464"></a>
+<span class="sourceLineNo">1465</span>  private static final State[] STATES_EXPECTED_ON_CLOSED = {<a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>    State.CLOSING, // Normal case<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>    State.CLOSED // Retrying<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>  };<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span><a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>  // This is for manually scheduled region assign, can add other states later if we find out other<a name="line.1470"></a>
+<span class="sourceLineNo">1471</span>  // usages<a name="line.1471"></a>
+<span class="sourceLineNo">1472</span>  private static final State[] STATES_EXPECTED_ON_ASSIGN = { State.CLOSED, State.OFFLINE };<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span><a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>  // We only allow unassign or move a region which is in OPEN state.<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span>  private static final State[] STATES_EXPECTED_ON_UNASSIGN_OR_MOVE = { State.OPEN };<a name="line.1475"></a>
+<span class="sourceLineNo">1476</span><a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>  // ============================================================================================<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>  //  Region Status update<a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>  //  Should only be called in TransitRegionStateProcedure<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span>  // ============================================================================================<a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>  private void transitStateAndUpdate(RegionStateNode regionNode, RegionState.State newState,<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>      RegionState.State... expectedStates) throws IOException {<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>    RegionState.State state = regionNode.getState();<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>    regionNode.transitionState(newState, expectedStates);<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>    boolean succ = false;<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span>    try {<a name="line.1486"></a>
+<span class="sourceLineNo">1487</span>      regionStateStore.updateRegionLocation(regionNode);<a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>      succ = true;<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>    } finally {<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>      if (!succ) {<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>        // revert<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span>        regionNode.setState(state);<a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>      }<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>    }<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>  }<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span><a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>  // should be called within the synchronized block of RegionStateNode<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>  void regionOpening(RegionStateNode regionNode) throws IOException {<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>    // As in SCP, for performance reason, there is no TRSP attached with this region, we will not<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>    // update the region state, which means that the region could be in any state when we want to<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span>    // assign it after a RS crash. So here we do not pass the expectedStates parameter.<a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>    transitStateAndUpdate(regionNode, State.OPENING);<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span>    regionStates.addRegionToServer(regionNode);<a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>    // update the operation count metrics<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>    metrics.incrementOperationCounter();<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span>  }<a name="line.1506"></a>
+<span class="sourceLineNo">1507</span><a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>  // should be called within the synchronized block of RegionStateNode.<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span>  // The parameter 'giveUp' means whether we will try to open the region again, if it is true, then<a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>  // we will persist the FAILED_OPEN state into hbase:meta.<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>  void regionFailedOpen(RegionStateNode regionNode, boolean giveUp) throws IOException {<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>    RegionState.State state = regionNode.getState();<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span>    ServerName regionLocation = regionNode.getRegionLocation();<a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>    if (giveUp) {<a name="line.1514"></a>
+<span class="sourceLineNo">1515</span>      regionNode.setState(State.FAILED_OPEN);<a name="line.1515"></a>
+<span class="sourceLineNo">1516</span>      regionNode.setRegionLocation(null);<a name="line.1516"></a>
+<span class="sourceLineNo">1517</span>      boolean succ = false;<a name="line.1517"></a>
+<span class="sourceLineNo">1518</span>      try {<a name="line.1518"></a>
+<span class="sourceLineNo">1519</span>        regionStateStore.updateRegionLocation(regionNode);<a name="line.1519"></a>
+<span class="sourceLineNo">1520</span>        succ = true;<a name="line.1520"></a>
+<span class="sourceLineNo">1521</span>      } finally {<a name="line.1521"></a>
+<span class="sourceLineNo">1522</span>        if (!succ) {<a name="line.1522"></a>
+<span class="sourceLineNo">1523</span>          // revert<a name="line.1523"></a>
+<span class="sourceLineNo">1524</span>          regionNode.setState(state);<a name="line.1524"></a>
+<span class="sourceLineNo">1525</span>          regionNode.setRegionLocation(regionLocation);<a name="line.1525"></a>
+<span class="sourceLineNo">1526</span>        }<a name="line.1526"></a>
+<span class="sourceLineNo">1527</span>      }<a name="line.1527"></a>
+<span class="sourceLineNo">1528</span>    }<a name="line.1528"></a>
+<span class="sourceLineNo">1529</span>    if (regionLocation != null) {<a name="line.1529"></a>
+<span class="sourceLineNo">1530</span>      regionStates.removeRegionFromServer(regionLocation, regionNode);<a name="line.1530"></a>
+<span class="sourceLineNo">1531</span>    }<a name="line.1531"></a>
+<span class="sourceLineNo">1532</span>  }<a name="line.1532"></a>
+<span class="sourceLineNo">1533</span><a name="line.1533"></a>
+<span class="sourceLineNo">1534</span>  // should be called within the synchronized block of RegionStateNode<a name="line.1534"></a>
+<span class="sourceLineNo">1535</span>  void regionOpened(RegionStateNode regionNode) throws IOException {<a name="line.1535"></a>
+<span class="sourceLineNo">1536</span>    // TODO: OPENING Updates hbase:meta too... we need to do both here and there?<a name="line.1536"></a>
+<span class="sourceLineNo">1537</span>    // That is a lot of hbase:meta writing.<a name="line.1537"></a>
+<span class="sourceLineNo">1538</span>    transitStateAndUpdate(regionNode, State.OPEN, STATES_EXPECTED_ON_OPEN);<a name="line.1538"></a>
+<span class="sourceLineNo">1539</span>    RegionInfo hri = regionNode.getRegionInfo();<a name="line.1539"></a>
+<span class="sourceLineNo">1540</span>    if (isMetaRegion(hri)) {<a name="line.1540"></a>
+<span class="sourceLineNo">1541</span>      // Usually we'd set a table ENABLED at this stage but hbase:meta is ALWAYs enabled, it<a name="line.1541"></a>
+<span class="sourceLineNo">1542</span>      // can't be disabled -- so skip the RPC (besides... enabled is managed by TableStateManager<a name="line.1542"></a>
+<span class="sourceLineNo">1543</span>      // which is backed by hbase:meta... Avoid setting ENABLED to avoid having to update state<a name="line.1543"></a>
+<span class="sourceLineNo">1544</span>      // on table that contains state.<a name="line.1544"></a>
+<span class="sourceLineNo">1545</span>      setMetaAssigned(hri, true);<a name="line.1545"></a>
+<span class="sourceLineNo">1546</span>    }<a name="line.1546"></a>
+<span class="sourceLineNo">1547</span>    regionStates.addRegionToServer(regionNode);<a name="line.1547"></a>
+<span class="sourceLineNo">1548</span>    regionStates.removeFromFailedOpen(hri);<a name="line.1548"></a>
+<span class="sourceLineNo">1549</span>  }<a name="line.1549"></a>
+<span class="sourceLineNo">1550</span><a name="line.1550"></a>
+<span class="sourceLineNo">1551</span>  // should be called within the synchronized block of RegionStateNode<a name="line.1551"></a>
+<span class="sourceLineNo">1552</span>  void regionClosing(RegionStateNode regionNode) throws IOException {<a name="line.1552"></a>
+<span class="sourceLineNo">1553</span>    transitStateAndUpdate(regionNode, State.CLOSING, STATES_EXPECTED_ON_CLOSING);<a name="line.1553"></a>
+<span class="sourceLineNo">1554</span><a name="line.1554"></a>
+<span class="sourceLineNo">1555</span>    RegionInfo hri = regionNode.getRegionInfo();<a name="line.1555"></a>
+<span class="sourceLineNo">1556</span>    // Set meta has not initialized early. so people trying to create/edit tables will wait<a name="line.1556"></a>
+<span class="sourceLineNo">1557</span>    if (isMetaRegion(hri)) {<a name="line.1557"></a>
+<span class="sourceLineNo">1558</span>      setMetaAssigned(hri, false);<a name="line.1558"></a>
+<span class="sourceLineNo">1559</span>    }<a name="line.1559"></a>
+<span class="sourceLineNo">1560</span>    regionStates.addRegionToServer(regionNode);<a name="line.1560"></a>
+<span class="sourceLineNo">1561</span>    // update the operation count metrics<a name="line.1561"></a>
+<span class="sourceLineNo">1562</span>    metrics.incrementOperationCounter();<a name="line.1562"></a>
+<span class="sourceLineNo">1563</span>  }<a name="line.1563"></a>
+<span class="sourceLineNo">1564</span><a name="line.1564"></a>
+<span class="sourceLineNo">1565</span>  // should be called within the synchronized block of RegionStateNode<a name="line.1565"></a>
+<span class="sourceLineNo">1566</span>  // The parameter 'normally' means whether we are closed cleanly, if it is true, then it means that<a name="line.1566"></a>
+<span class="sourceLineNo">1567</span>  // we are closed due to a RS crash.<a name="line.1567"></a>
+<span class="sourceLineNo">1568</span>  void regionClosed(RegionStateNode regionNode, boolean normally) throws IOException {<a name="line.1568"></a>
+<span class="sourceLineNo">1569</span>    RegionState.State state = regionNode.getState();<a name="line.1569"></a>
+<span class="sourceLineNo">1570</span>    ServerName regionLocation = regionNode.getRegionLocation();<a name="line.1570"></a>
+<span class="sourceLineNo">1571</span>    if (normally) {<a name="line.1571"></a>
+<span class="sourceLineNo">1572</span>      regionNode.transitionState(State.CLOSED, STATES_EXPECTED_ON_CLOSED);<a name="line.1572"></a>
+<span class="sourceLineNo">1573</span>    } else {<a name="line.1573"></a>
+<span class="sourceLineNo">1574</span>      // For SCP<a name="line.1574"></a>
+<span class="sourceLineNo">1575</span>      regionNode.transitionState(State.ABNORMALLY_CLOSED);<a name="line.1575"></a>
+<span class="sourceLineNo">1576</span>    }<a name="line.1576"></a>
+<span class="sourceLineNo">1577</span>    regionNode.setRegionLocation(null);<a name="line.1577"></a>
+<span class="sourceLineNo">1578</span>    boolean succ = false;<a name="line.1578"></a>
+<span class="sourceLineNo">1579</span>    try {<a name="line.1579"></a>
+<span class="sourceLineNo">1580</span>      regionStateStore.updateRegionLocation(regionNode);<a name="line.1580"></a>
+<span class="sourceLineNo">1581</span>      succ = true;<a name="line.1581"></a>
+<span class="sourceLineNo">1582</span>    } finally {<a name="line.1582"></a>
+<span class="sourceLineNo">1583</span>      if (!succ) {<a name="line.1583"></a>
+<span class="sourceLineNo">1584</span>        // revert<a name="line.1584"></a>
+<span class="sourceLineNo">1585</span>        regionNode.setState(state);<a name="line.1585"></a>
+<span class="sourceLineNo">1586</span>        regionNode.setRegionLocation(regionLocation);<a name="line.1586"></a>
+<span class="sourceLineNo">1587</span>      }<a name="line.1587"></a>
+<span class="sourceLineNo">1588</span>    }<a name="line.1588"></a>
+<span class="sourceLineNo">1589</span>    if (regionLocation != null) {<a name="line.1589"></a>
+<span class="sourceLineNo">1590</span>      regionNode.setLastHost(regionLocation);<a name="line.1590"></a>
+<span class="sourceLineNo">1591</span>      regionStates.removeRegionFromServer(regionLocation, regionNode);<a name="line.1591"></a>
+<span class="sourceLineNo">1592</span>    }<a name="line.1592"></a>
+<span class="sourceLineNo">1593</span>  }<a name="line.1593"></a>
+<span class="sourceLineNo">1594</span><a name="line.1594"></a>
+<span class="sourceLineNo">1595</span>  public void markRegionAsSplit(final RegionInfo parent, final ServerName serverName,<a name="line.1595"></a>
+<span class="sourceLineNo">1596</span>      final RegionInfo daughterA, final RegionInfo daughterB) throws IOException {<a name="line.1596"></a>
+<span class="sourceLineNo">1597</span>    // Update hbase:meta. Parent will be marked offline and split up in hbase:meta.<a name="line.1597"></a>
+<span class="sourceLineNo">1598</span>    // The parent stays in regionStates until cleared when removed by CatalogJanitor.<a name="line.1598"></a>
+<span class="sourceLineNo">1599</span>    // Update its state in regionStates to it shows as offline and split when read<a name="line.1599"></a>
+<span class="sourceLineNo">1600</span>    // later figuring what regions are in a table and what are not: see<a name="line.1600"></a>
+<span class="sourceLineNo">1601</span>    // regionStates#getRegionsOfTable<a name="line.1601"></a>
+<span class="sourceLineNo">1602</span>    final RegionStateNode node = regionStates.getOrCreateRegionStateNode(parent);<a name="line.1602"></a>
+<span class="sourceLineNo">1603</span>    node.setState(State.SPLIT);<a name="line.1603"></a>
+<span class="sourceLineNo">1604</span>    final RegionStateNode nodeA = regionStates.getOrCreateRegionStateNode(daughterA);<a name="line.1604"></a>
+<span class="sourceLineNo">1605</span>    nodeA.setState(State.SPLITTING_NEW);<a name="line.1605"></a>
+<span class="sourceLineNo">1606</span>    final RegionStateNode nodeB = regionStates.getOrCreateRegionStateNode(daughterB);<a name="line.1606"></a>
+<span class="sourceLineNo">1607</span>    nodeB.setState(State.SPLITTING_NEW);<a name="line.1607"></a>
+<span class="sourceLineNo">1608</span><a name="line.1608"></a>
+<span class="sourceLineNo">1609</span>    regionStateStore.splitRegion(parent, daughterA, daughterB, serverName);<a name="line.1609"></a>
+<span class="sourceLineNo">1610</span>    if (shouldAssignFavoredNodes(parent)) {<a name="line.1610"></a>
+<span class="sourceLineNo">1611</span>      List&lt;ServerName&gt; onlineServers = this.master.getServerManager().getOnlineServersList();<a name="line.1611"></a>
+<span class="sourceLineNo">1612</span>      ((FavoredNodesPromoter)getBalancer()).<a name="line.1612"></a>
+<span class="sourceLineNo">1613</span>          generateFavoredNodesForDaughter(onlineServers, parent, daughterA, daughterB);<a name="line.1613"></a>
+<span class="sourceLineNo">1614</span>    }<a name="line.1614"></a>
+<span class="sourceLineNo">1615</span>  }<a name="line.1615"></a>
+<span class="sourceLineNo">1616</span><a name="line.1616"></a>
+<span class="sourceLineNo">1617</span>  /**<a name="line.1617"></a>
+<span class="sourceLineNo">1618</span>   * When called here, the merge has happened. The two merged regions have been<a name="line.1618"></a>
+<span class="sourceLineNo">1619</span>   * unassigned and the above markRegionClosed has been called on each so they have been<a name="line.1619"></a>
+<span class="sourceLineNo">1620</span>   * disassociated from a hosting Server. The merged region will be open after this call. The<a name="line.1620"></a>
+<span class="sourceLineNo">1621</span>   * merged regions are removed from hbase:meta below&gt; Later they are deleted from the filesystem<a name="line.1621"></a>
+<span class="sourceLineNo">1622</span>   * by the catalog janitor running against hbase:meta. It notices when the merged region no<a name="line.1622"></a>
+<span class="sourceLineNo">1623</span>   * longer holds references to the old regions.<a name="line.1623"></a>
+<span class="sourceLineNo">1624</span>   */<a name="line.1624"></a>
+<span class="sourceLineNo">1625</span>  public void markRegionAsMerged(final RegionInfo child, final ServerName serverName,<a name="line.1625"></a>
+<span class="sourceLineNo">1626</span>      final RegionInfo mother, final RegionInfo father) throws IOException {<a name="line.1626"></a>
+<span class="sourceLineNo">1627</span>    final RegionStateNode node = regionStates.getOrCreateRegionStateNode(child);<a name="line.1627"></a>
+<span class="sourceLineNo">1628</span>    node.setState(State.MERGED);<a name="line.1628"></a>
+<span class="sourceLineNo">1629</span>    regionStates.deleteRegion(mother);<a name="line.1629"></a>
+<span class="sourceLineNo">1630</span>    regionStates.deleteRegion(father);<a name="line.1630"></a>
+<span class="sourceLineNo">1631</span>    regionStateStore.mergeRegions(child, mother, father, serverName);<a name="line.1631"></a>
+<span class="sourceLineNo">1632</span>    if (shouldAssignFavoredNodes(child)) {<a name="line.1632"></a>
+<span class="sourceLineNo">1633</span>      ((FavoredNodesPromoter)getBalancer()).<a name="line.1633"></a>
+<span class="sourceLineNo">1634</span>        generateFavoredNodesForMergedRegion(child, mother, father);<a name="line.1634"></a>
+<span class="sourceLineNo">1635</span>    }<a name="line.1635"></a>
+<span class="sourceLineNo">1636</span>  }<a name="line.1636"></a>
+<span class="sourceLineNo">1637</span><a name="line.1637"></a>
+<span class="sourceLineNo">1638</span>  /*<a name="line.1638"></a>
+<span class="sourceLineNo">1639</span>   * Favored nodes should be applied only when FavoredNodes balancer is configured and the region<a name="line.1639"></a>
+<span class="sourceLineNo">1640</span>   * belongs to a non-system table.<a name="line.1640"></a>
+<span class="sourceLineNo">1641</span>   */<a name="line.1641"></a>
+<span class="sourceLineNo">1642</span>  private boolean shouldAssignFavoredNodes(RegionInfo region) {<a name="line.1642"></a>
+<span class="sourceLineNo">1643</span>    return this.shouldAssignRegionsWithFavoredNodes &amp;&amp;<a name="line.1643"></a>
+<span class="sourceLineNo">1644</span>        FavoredNodesManager.isFavoredNodeApplicable(region);<a name="line.1644"></a>
+<span class="sourceLineNo">1645</span>  }<a name="line.1645"></a>
+<span class="sourceLineNo">1646</span><a name="line.1646"></a>
+<span class="sourceLineNo">1647</span>  // ============================================================================================<a name="line.1647"></a>
+<span class="sourceLineNo">1648</span>  //  Assign Queue (Assign/Balance)<a name="line.1648"></a>
+<span class="sourceLineNo">1649</span>  // ============================================================================================<a name="line.1649"></a>
+<span class="sourceLineNo">1650</span>  private final ArrayList&lt;RegionStateNode&gt; pendingAssignQueue = new ArrayList&lt;RegionStateNode&gt;();<a name="line.1650"></a>
+<span class="sourceLineNo">1651</span>  private final ReentrantLock assignQueueLock = new ReentrantLock();<a name="line.1651"></a>
+<span class="sourceLineNo">1652</span>  private final Condition assignQueueFullCond = assignQueueLock.newCondition();<a name="line.1652"></a>
+<span class="sourceLineNo">1653</span><a name="line.1653"></a>
+<span class="sourceLineNo">1654</span>  /**<a name="line.1654"></a>
+<span class="sourceLineNo">1655</span>   * Add the assign operation to the assignment queue.<a name="line.1655"></a>
+<span class="sourceLineNo">1656</span>   * The pending assignment operation will be processed,<a name="line.1656"></a>
+<span class="sourceLineNo">1657</span>   * and each region will be assigned by a server using the balancer.<a name="line.1657"></a>
+<span class="sourceLineNo">1658</span>   */<a name="line.1658"></a>
+<span class="sourceLineNo">1659</span>  protected void queueAssign(final RegionStateNode regionNode) {<a name="line.1659"></a>
+<span class="sourceLineNo">1660</span>    regionNode.getProcedureEvent().suspend();<a name="line.1660"></a>
+<span class="sourceLineNo">1661</span><a name="line.1661"></a>
+<span class="sourceLineNo">1662</span>    // TODO: quick-start for meta and the other sys-tables?<a name="line.1662"></a>
+<span class="sourceLineNo">1663</span>    assignQueueLock.lock();<a name="line.1663"></a>
+<span class="sourceLineNo">1664</span>    try {<a name="line.1664"></a>
+<span class="sourceLineNo">1665</span>      pendingAssignQueue.add(regionNode);<a name="line.1665"></a>
+<span class="sourceLineNo">1666</span>      if (regionNode.isSystemTable() ||<a name="line.1666"></a>
+<span class="sourceLineNo">1667</span>          pendingAssignQueue.size() == 1 ||<a name="line.1667"></a>
+<span class="sourceLineNo">1668</span>          pendingAssignQueue.size() &gt;= assignDispatchWaitQueueMaxSize) {<a name="line.1668"></a>
+<span class="sourceLineNo">1669</span>        assignQueueFullCond.signal();<a name="line.1669"></a>
+<span class="sourceLineNo">1670</span>      }<a name="line.1670"></a>
+<span class="sourceLineNo">1671</span>    } finally {<a name="line.1671"></a>
+<span class="sourceLineNo">1672</span>      assignQueueLock.unlock();<a name="line.1672"></a>
+<span class="sourceLineNo">1673</span>    }<a name="line.1673"></a>
+<span class="sourceLineNo">1674</span>  }<a name="line.1674"></a>
+<span class="sourceLineNo">1675</span><a name="line.1675"></a>
+<span class="sourceLineNo">1676</span>  private void startAssignmentThread() {<a name="line.1676"></a>
+<span class="sourceLineNo">1677</span>    // Get Server Thread name. Sometimes the Server is mocked so may not implement HasThread.<a name="line.1677"></a>
+<span class="sourceLineNo">1678</span>    // For example, in tests.<a name="line.1678"></a>
+<span class="sourceLineNo">1679</span>    String name = master instanceof HasThread? ((HasThread)master).getName():<a name="line.1679"></a>
+<span class="sourceLineNo">1680</span>        master.getServerName().toShortString();<a name="line.1680"></a>
+<span class="sourceLineNo">1681</span>    assignThread = new Thread(name) {<a name="line.1681"></a>
+<span class="sourceLineNo">1682</span>      @Override<a name="line.1682"></a>
+<span class="sourceLineNo">1683</span>      public void run() {<a name="line.1683"></a>
+<span class="sourceLineNo">1684</span>        while (isRunning()) {<a name="line.1684"></a>
+<span class="sourceLineNo">1685</span>          processAssignQueue();<a name="line.1685"></a>
+<span class="sourceLineNo">1686</span>        }<a name="line.1686"></a>
+<span class="sourceLineNo">1687</span>        pendingAssignQueue.clear();<a name="line.1687"></a>
+<span class="sourceLineNo">1688</span>      }<a name="line.1688"></a>
+<span class="sourceLineNo">1689</span>    };<a name="line.1689"></a>
+<span class="sourceLineNo">1690</span>    assignThread.setDaemon(true);<a name="line.1690"></a>
+<span class="sourceLineNo">1691</span>    assignThread.start();<a name="line.1691"></a>
+<span class="sourceLineNo">1692</span>  }<a name="line.1692"></a>
+<span class="sourceLineNo">1693</span><a name="line.1693"></a>
+<span class="sourceLineNo">1694</span>  private void stopAssignmentThread() {<a name="line.1694"></a>
+<span class="sourceLineNo">1695</span>    assignQueueSignal();<a name="line.1695"></a>
+<span class="sourceLineNo">1696</span>    try {<a name="line.1696"></a>
+<span class="sourceLineNo">1697</span>      while (assignThread.isAlive()) {<a name="line.1697"></a>
+<span class="sourceLineNo">1698</span>        assignQueueSignal();<a name="line.1698"></a>
+<span class="sourceLineNo">1699</span>        assignThread.join(250);<a name="line.1699"></a>
+<span class="sourceLineNo">1700</span>      }<a name="line.1700"></a>
+<span class="sourceLineNo">1701</span>    } catch (InterruptedException e) {<a name="line.1701"></a>
+<span class="sourceLineNo">1702</span>      LOG.warn("join interrupted", e);<a name="line.1702"></a>
+<span class="sourceLineNo">1703</span>      Thread.currentThread().interrupt();<a name="line.1703"></a>
+<span class="sourceLineNo">1704</span>    }<a name="line.1704"></a>
+<span class="sourceLineNo">1705</span>  }<a name="line.1705"></a>
+<span class="sourceLineNo">1706</span><a name="line.1706"></a>
+<span class="sourceLineNo">1707</span>  private void assignQueueSignal() {<a name="line.1707"></a>
+<span class="sourceLineNo">1708</span>    assignQueueLock.lock();<a name="line.1708"></a>
+<span class="sourceLineNo">1709</span>    try {<a name="line.1709"></a>
+<span class="sourceLineNo">1710</span>      assignQueueFullCond.signal();<a name="line.1710"></a>
+<span class="sourceLineNo">1711</span>    } finally {<a name="line.1711"></a>
+<span class="sourceLineNo">1712</span>      assignQueueLock.unlock();<a name="line.1712"></a>
+<span class="sourceLineNo">1713</span>    }<a name="line.1713"></a>
+<span class="sourceLineNo">1714</span>  }<a name="line.1714"></a>
+<span class="sourceLineNo">1715</span><a name="line.1715"></a>
+<span class="sourceLineNo">1716</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings("WA_AWAIT_NOT_IN_LOOP")<a name="line.1716"></a>
+<span class="sourceLineNo">1717</span>  private HashMap&lt;RegionInfo, RegionStateNode&gt; waitOnAssignQueue() {<a name="line.1717"></a>
+<span class="sourceLineNo">1718</span>    HashMap&lt;RegionInfo, RegionStateNode&gt; regions = null;<a name="line.1718"></a>
 <span class="sourceLineNo">1719</span><a name="line.1719"></a>
-<span class="sourceLineNo">1720</span>      if (!isRunning()) return null;<a name="line.1720"></a>
-<span class="sourceLineNo">1721</span>      assignQueueFullCond.await(assignDispatchWaitMillis, TimeUnit.MILLISECONDS);<a name="line.1721"></a>
-<span class="sourceLineNo">1722</span>      regions = new HashMap&lt;RegionInfo, RegionStateNode&gt;(pendingAssignQueue.size());<a name="line.1722"></a>
-<span class="sourceLineNo">1723</span>      for (RegionStateNode regionNode: pendingAssignQueue) {<a name="line.1723"></a>
-<span class="sourceLineNo">1724</span>        regions.put(regionNode.getRegionInfo(), regionNode);<a name="line.1724"></a>
-<span class="sourceLineNo">1725</span>      }<a name="line.1725"></a>
-<span class="sourceLineNo">1726</span>      pendingAssignQueue.clear();<a name="line.1726"></a>
-<span class="sourceLineNo">1727</span>    } catch (InterruptedException e) {<a name="line.1727"></a>
-<span class="sourceLineNo">1728</span>      LOG.warn("got interrupted ", e);<a name="line.1728"></a>
-<span class="sourceLineNo">1729</span>      Thread.currentThread().interrupt();<a name="line.1729"></a>
-<span class="sourceLineNo">1730</span>    } finally {<a name="line.1730"></a>
-<span class="sourceLineNo">1731</span>      assignQueueLock.unlock();<a name="line.1731"></a>
-<span class="sourceLineNo">1732</span>    }<a name="line.1732"></a>
-<span class="sourceLineNo">1733</span>    return regions;<a name="line.1733"></a>
-<span class="sourceLineNo">1734</span>  }<a name="line.1734"></a>
-<span class="sourceLineNo">1735</span><a name="line.1735"></a>
-<span class="sourceLineNo">1736</span>  private void processAssignQueue() {<a name="line.1736"></a>
-<span class="sourceLineNo">1737</span>    final HashMap&lt;RegionInfo, RegionStateNode&gt; regions = waitOnAssignQueue();<a name="line.1737"></a>
-<span class="sourceLineNo">1738</span>    if (regions == null || regions.size() == 0 || !isRunning()) {<a name="line.1738"></a>
-<span class="sourceLineNo">1739</span>      return;<a name="line.1739"></a>
-<span class="sourceLineNo">1740</span>    }<a name="line.1740"></a>
+<span class="sourceLineNo">1720</span>    assignQueueLock.lock();<a name="line.1720"></a>
+<span class="sourceLineNo">1721</span>    try {<a name="line.1721"></a>
+<span class="sourceLineNo">1722</span>      if (pendingAssignQueue.isEmpty() &amp;&amp; isRunning()) {<a name="line.1722"></a>
+<span class="sourceLineNo">1723</span>        assignQueueFullCond.await();<a name="line.1723"></a>
+<span class="sourceLineNo">1724</span>      }<a name="line.1724"></a>
+<span class="sourceLineNo">1725</span><a name="line.1725"></a>
+<span class="sourceLineNo">1726</span>      if (!isRunning()) return null;<a name="line.1726"></a>
+<span class="sourceLineNo">1727</span>      assignQueueFullCond.await(assignDispatchWaitMillis, TimeUnit.MILLISECONDS);<a name="line.1727"></a>
+<span class="sourceLineNo">1728</span>      regions = new HashMap&lt;RegionInfo, RegionStateNode&gt;(pendingAssignQueue.size());<a name="line.1728"></a>
+<span class="sourceLineNo">1729</span>      for (RegionStateNode regionNode: pendingAssignQueue) {<a name="line.1729"></a>
+<span class="sourceLineNo">1730</span>        regions.put(regionNode.getRegionInfo(), regionNode);<a name="line.1730"></a>
+<span class="sourceLineNo">1731</span>      }<a name="line.1731"></a>
+<span class="sourceLineNo">1732</span>      pendingAssignQueue.clear();<a name="line.1732"></a>
+<span class="sourceLineNo">1733</span>    } catch (InterruptedException e) {<a name="line.1733"></a>
+<span class="sourceLineNo">1734</span>      LOG.warn("got interrupted ", e);<a name="line.1734"></a>
+<span class="sourceLineNo">1735</span>      Thread.currentThread().interrupt();<a name="line.1735"></a>
+<span class="sourceLineNo">1736</span>    } finally {<a name="line.1736"></a>
+<span class="sourceLineNo">1737</span>      assignQueueLock.unlock();<a name="line.1737"></a>
+<span class="sourceLineNo">1738</span>    }<a name="line.1738"></a>
+<span class="sourceLineNo">1739</span>    return regions;<a name="line.1739"></a>
+<span class="sourceLineNo">1740</span>  }<a name="line.1740"></a>
 <span class="sourceLineNo">1741</span><a name="line.1741"></a>
-<span class="sourceLineNo">1742</span>    if (LOG.isTraceEnabled()) {<a name="line.1742"></a>
-<span class="sourceLineNo">1743</span>      LOG.trace("PROCESS ASSIGN QUEUE regionCount=" + regions.size());<a name="line.1743"></a>
-<span class="sourceLineNo">1744</span>    }<a name="line.1744"></a>
-<span class="sourceLineNo">1745</span><a name="line.1745"></a>
-<span class="sourceLineNo">1746</span>    // TODO: Optimize balancer. pass a RegionPlan?<a name="line.1746"></a>
-<span class="sourceLineNo">1747</span>    final HashMap&lt;RegionInfo, ServerName&gt; retainMap = new HashMap&lt;&gt;();<a name="line.1747"></a>
-<span class="sourceLineNo">1748</span>    final List&lt;RegionInfo&gt; userHRIs = new ArrayList&lt;&gt;(regions.size());<a name="line.1748"></a>
-<span class="sourceLineNo">1749</span>    // Regions for system tables requiring reassignment<a name="line.1749"></a>
-<span class="sourceLineNo">1750</span>    final List&lt;RegionInfo&gt; systemHRIs = new ArrayList&lt;&gt;();<a name="line.1750"></a>
-<span class="sourceLineNo">1751</span>    for (RegionStateNode regionStateNode: regions.values()) {<a name="line.1751"></a>
-<span class="sourceLineNo">1752</span>      boolean sysTable = regionStateNode.isSystemTable();<a name="line.1752"></a>
-<span class="sourceLineNo">1753</span>      final List&lt;RegionInfo&gt; hris = sysTable? systemHRIs: userHRIs;<a name="line.1753"></a>
-<span class="sourceLineNo">1754</span>      if (regionStateNode.getRegionLocation() != null) {<a name="line.1754"></a>
-<span class="sourceLineNo">1755</span>        retainMap.put(regionStateNode.getRegionInfo(), regionStateNode.getRegionLocation());<a name="line.1755"></a>
-<span class="sourceLineNo">1756</span>      } else {<a name="line.1756"></a>
-<span class="sourceLineNo">1757</span>        hris.add(regionStateNode.getRegionInfo());<a name="line.1757"></a>
-<span class="sourceLineNo">1758</span>      }<a name="line.1758"></a>
-<span class="sourceLineNo">1759</span>    }<a name="line.1759"></a>
-<span class="sourceLineNo">1760</span><a name="line.1760"></a>
-<span class="sourceLineNo">1761</span>    // TODO: connect with the listener to invalidate the cache<a name="line.1761"></a>
-<span class="sourceLineNo">1762</span><a name="line.1762"></a>
-<span class="sourceLineNo">1763</span>    // TODO use events<a name="line.1763"></a>
-<span class="sourceLineNo">1764</span>    List&lt;ServerName&gt; servers = master.getServerManager().createDestinationServersList();<a name="line.1764"></a>
-<span class="sourceLineNo">1765</span>    for (int i = 0; servers.size() &lt; 1; ++i) {<a name="line.1765"></a>
-<span class="sourceLineNo">1766</span>      // Report every fourth time around this loop; try not to flood log.<a name="line.1766"></a>
-<span class="sourceLineNo">1767</span>      if (i % 4 == 0) {<a name="line.1767"></a>
-<span class="sourceLineNo">1768</span>        LOG.warn("No servers available; cannot place " + regions.size() + " unassigned regions.");<a name="line.1768"></a>
-<span class="sourceLineNo">1769</span>      }<a name="line.1769"></a>
-<span class="sourceLineNo">1770</span><a name="line.1770"></a>
-<span class="sourceLineNo">1771</span>      if (!isRunning()) {<a name="line.1771"></a>
-<span class="sourceLineNo">1772</span>        LOG.debug("Stopped! Dropping assign of " + regions.size() + " queued regions.");<a name="line.1772"></a>
-<span class="sourceLineNo">1773</span>        return;<a name="line.1773"></a>
-<span class="sourceLineNo">1774</span>      }<a name="line.1774"></a>
-<span class="sourceLineNo">1775</span>      Threads.sleep(250);<a name="line.1775"></a>
-<span class="sourceLineNo">1776</span>      servers = master.getServerManager().createDestinationServersList();<a name="line.1776"></a>
-<span class="sourceLineNo">1777</span>    }<a name="line.1777"></a>
-<span class="sourceLineNo">1778</span><a name="line.1778"></a>
-<span class="sourceLineNo">1779</span>    if (!systemHRIs.isEmpty()) {<a name="line.1779"></a>
-<span class="sourceLineNo">1780</span>      // System table regions requiring reassignment are present, get region servers<a name="line.1780"></a>
-<span class="sourceLineNo">1781</span>      // not available for system table regions<a name="line.1781"></a>
-<span class="sourceLineNo">1782</span>      final List&lt;ServerName&gt; excludeServers = getExcludedServersForSystemTable();<a name="line.1782"></a>
-<span class="sourceLineNo">1783</span>      List&lt;ServerName&gt; serversForSysTables = servers.stream()<a name="line.1783"></a>
-<span class="sourceLineNo">1784</span>          .filter(s -&gt; !excludeServers.contains(s)).collect(Collectors.toList());<a name="line.1784"></a>
-<span class="sourceLineNo">1785</span>      if (serversForSysTables.isEmpty()) {<a name="line.1785"></a>
-<span class="sourceLineNo">1786</span>        LOG.warn("Filtering old server versions and the excluded produced an empty set; " +<a name="line.1786"></a>
-<span class="sourceLineNo">1787</span>            "instead considering all candidate servers!");<a name="line.1787"></a>
-<span class="sourceLineNo">1788</span>      }<a name="line.1788"></a>
-<span class="sourceLineNo">1789</span>      LOG.debug("Processing assignQueue; systemServersCount=" + serversForSysTables.size() +<a name="line.1789"></a>
-<span class="sourceLineNo">1790</span>          ", allServersCount=" + servers.size());<a name="line.1790"></a>
-<span class="sourceLineNo">1791</span>      processAssignmentPlans(regions, null, systemHRIs,<a name="line.1791"></a>
-<span class="sourceLineNo">1792</span>          serversForSysTables.isEmpty()? servers: serversForSysTables);<a name="line.1792"></a>
-<span class="sourceLineNo">1793</span>    }<a name="line.1793"></a>
-<span class="sourceLineNo">1794</span><a name="line.1794"></a>
-<span class="sourceLineNo">1795</span>    processAssignmentPlans(regions, retainMap, userHRIs, servers);<a name="line.1795"></a>
-<span class="sourceLineNo">1796</span>  }<a name="line.1796"></a>
-<span class="sourceLineNo">1797</span><a name="line.1797"></a>
-<span class="sourceLineNo">1798</span>  private void processAssignmentPlans(final HashMap&lt;RegionInfo, RegionStateNode&gt; regions,<a name="line.1798"></a>
-<span class="sourceLineNo">1799</span>      final HashMap&lt;RegionInfo, ServerName&gt; retainMap, final List&lt;RegionInfo&gt; hris,<a name="line.1799"></a>
-<span class="sourceLineNo">1800</span>      final List&lt;ServerName&gt; servers) {<a name="line.1800"></a>
-<span class="sourceLineNo">1801</span>    boolean isTraceEnabled = LOG.isTraceEnabled();<a name="line.1801"></a>
-<span class="sourceLineNo">1802</span>    if (isTraceEnabled) {<a name="line.1802"></a>
-<span class="sourceLineNo">1803</span>      LOG.trace("Available servers count=" + servers.size() + ": " + servers);<a name="line.1803"></a>
-<span class="sourceLineNo">1804</span>    }<a name="line.1804"></a>
-<span class="sourceLineNo">1805</span><a name="line.1805"></a>
-<span class="sourceLineNo">1806</span>    final LoadBalancer balancer = getBalancer();<a name="line.1806"></a>
-<span class="sourceLineNo">1807</span>    // ask the balancer where to place regions<a name="line.1807"></a>
-<span class="sourceLineNo">1808</span>    if (retainMap != null &amp;&amp; !retainMap.isEmpty()) {<a name="line.1808"></a>
-<span class="sourceLineNo">1809</span>      if (isTraceEnabled) {<a name="line.1809"></a>
-<span class="sourceLineNo">1810</span>        LOG.trace("retain assign regions=" + retainMap);<a name="line.1810"></a>
-<span class="sourceLineNo">1811</span>      }<a name="line.1811"></a>
-<span class="sourceLineNo">1812</span>      try {<a name="line.1812"></a>
-<span class="sourceLineNo">1813</span>        acceptPlan(regions, balancer.retainAssignment(retainMap, servers));<a name="line.1813"></a>
-<span class="sourceLineNo">1814</span>      } catch (HBaseIOException e) {<a name="line.1814"></a>
-<span class="sourceLineNo">1815</span>        LOG.warn("unable to retain assignment", e);<a name="line.1815"></a>
-<span class="sourceLineNo">1816</span>        addToPendingAssignment(regions, retainMap.keySet());<a name="line.1816"></a>
+<span class="sourceLineNo">1742</span>  private void processAssignQueue() {<a name="line.1742"></a>
+<span class="sourceLineNo">1743</span>    final HashMap&lt;RegionInfo, RegionStateNode&gt; regions = waitOnAssignQueue();<a name="line.1743"></a>
+<span class="sourceLineNo">1744</span>    if (regions == null || regions.size() == 0 || !isRunning()) {<a name="line.1744"></a>
+<span class="sourceLineNo">1745</span>      return;<a name="line.1745"></a>
+<span class="sourceLineNo">1746</span>    }<a name="line.1746"></a>
+<span class="sourceLineNo">1747</span><a name="line.1747"></a>
+<span class="sourceLineNo">1748</span>    if (LOG.isTraceEnabled()) {<a name="line.1748"></a>
+<span class="sourceLineNo">1749</span>      LOG.trace("PROCESS ASSIGN QUEUE regionCount=" + regions.size());<a name="line.1749"></a>
+<span class="sourceLineNo">1750</span>    }<a name="line.1750"></a>
+<span class="sourceLineNo">1751</span><a name="line.1751"></a>
+<span class="sourceLineNo">1752</span>    // TODO: Optimize balancer. pass a RegionPlan?<a name="line.1752"></a>
+<span class="sourceLineNo">1753</span>    final HashMap&lt;RegionInfo, ServerName&gt; retainMap = new HashMap&lt;&gt;();<a name="line.1753"></a>
+<span class="sourceLineNo">1754</span>    final List&lt;RegionInfo&gt; userHRIs = new ArrayList&lt;&gt;(regions.size());<a name="line.1754"></a>
+<span class="sourceLineNo">1755</span>    // Regions for system tables requiring reassignment<a name="line.1755"></a>
+<span class="sourceLineNo">1756</span>    final List&lt;RegionInfo&gt; systemHRIs = new ArrayList&lt;&gt;();<a name="line.1756"></a>
+<span class="sourceLineNo">1757</span>    for (RegionStateNode regionStateNode: regions.values()) {<a name="line.1757"></a>
+<span class="sourceLineNo">1758</span>      boolean sysTable = regionStateNode.isSystemTable();<a name="line.1758"></a>
+<span class="sourceLineNo">1759</span>      final List&lt;RegionInfo&gt; hris = sysTable? systemHRIs: userHRIs;<a name="line.1759"></a>
+<span class="sourceLineNo">1760</span>      if (regionStateNode.getRegionLocation() != null) {<a name="line.1760"></a>
+<span class="sourceLineNo">1761</span>        retainMap.put(regionStateNode.getRegionInfo(), regionStateNode.getRegionLocation());<a name="line.1761"></a>
+<span class="sourceLineNo">1762</span>      } else {<a name="line.1762"></a>
+<span class="sourceLineNo">1763</span>        hris.add(regionStateNode.getRegionInfo());<a name="line.1763"></a>
+<span class="sourceLineNo">1764</span>      }<a name="line.1764"></a>
+<span class="sourceLineNo">1765</span>    }<a name="line.1765"></a>
+<span class="sourceLineNo">1766</span><a name="line.1766"></a>
+<span class="sourceLineNo">1767</span>    // TODO: connect with the listener to invalidate the cache<a name="line.1767"></a>
+<span class="sourceLineNo">1768</span><a name="line.1768"></a>
+<span class="sourceLineNo">1769</span>    // TODO use events<a name="line.1769"></a>
+<span class="sourceLineNo">1770</span>    List&lt;ServerName&gt; servers = master.getServerManager().createDestinationServersList();<a name="line.1770"></a>
+<span class="sourceLineNo">1771</span>    for (int i = 0; servers.size() &lt; 1; ++i) {<a name="line.1771"></a>
+<span class="sourceLineNo">1772</span>      // Report every fourth time around this loop; try not to flood log.<a name="line.1772"></a>
+<span class="sourceLineNo">1773</span>      if (i % 4 == 0) {<a name="line.1773"></a>
+<span class="sourceLineNo">1774</span>        LOG.warn("No servers available; cannot place " + regions.size() + " unassigned regions.");<a name="line.1774"></a>
+<span class="sourceLineNo">1775</span>      }<a name="line.1775"></a>
+<span class="sourceLineNo">1776</span><a name="line.1776"></a>
+<span class="sourceLineNo">1777</span>      if (!isRunning()) {<a name="line.1777"></a>
+<span class="sourceLineNo">1778</span>        LOG.debug("Stopped! Dropping assign of " + regions.size() + " queued regions.");<a name="line.1778"></a>
+<span class="sourceLineNo">1779</span>        return;<a name="line.1779"></a>
+<span class="sourceLineNo">1780</span>      }<a name="line.1780"></a>
+<span class="sourceLineNo">1781</span>      Threads.sleep(250);<a name="line.1781"></a>
+<span class="sourceLineNo">1782</span>      servers = master.getServerManager().createDestinationServersList();<a name="line.1782"></a>
+<span class="sourceLineNo">1783</span>    }<a name="line.1783"></a>
+<span class="sourceLineNo">1784</span><a name="line.1784"></a>
+<span class="sourceLineNo">1785</span>    if (!systemHRIs.isEmpty()) {<a name="line.1785"></a>
+<span class="sourceLineNo">1786</span>      // System table regions requiring reassignment are present, get region servers<a name="line.1786"></a>
+<span class="sourceLineNo">1787</span>      // not available for system table regions<a name="line.1787"></a>
+<span class="sourceLineNo">1788</span>      final List&lt;ServerName&gt; excludeServers = getExcludedServersForSystemTable();<a name="line.1788"></a>
+<span class="sourceLineNo">1789</span>      List&lt;ServerName&gt; serversForSysTables = servers.stream()<a name="line.1789"></a>
+<span class="sourceLineNo">1790</span>          .filter(s -&gt; !excludeServers.contains(s)).collect(Collectors.toList());<a name="line.1790"></a>
+<span class="sourceLineNo">1791</span>      if (serversForSysTables.isEmpty()) {<a name="line.1791"></a>
+<span class="sourceLineNo">1792</span>        LOG.warn("Filtering old server versions and the excluded produced an empty set; " +<a name="line.1792"></a>
+<span class="sourceLineNo">1793</span>            "instead considering all candidate servers!");<a name="line.1793"></a>
+<span class="sourceLineNo">1794</span>      }<a name="line.1794"></a>
+<span class="sourceLineNo">1795</span>      LOG.debug("Processing assignQueue; systemServersCount=" + serversForSysTables.size() +<a name="line.1795"></a>
+<span class="sourceLineNo">1796</span>          ", allServersCount=" + servers.size());<a name="line.1796"></a>
+<span class="sourceLineNo">1797</span>      processAssignmentPlans(regions, null, systemHRIs,<a name="line.1797"></a>
+<span class="sourceLineNo">1798</span>          serversForSysTables.isEmpty()? servers: serversForSysTables);<a name="line.1798"></a>
+<span class="sourceLineNo">1799</span>    }<a name="line.1799"></a>
+<span class="sourceLineNo">1800</span><a name="line.1800"></a>
+<span class="sourceLineNo">1801</span>    processAssignmentPlans(regions, retainMap, userHRIs, servers);<a name="line.1801"></a>
+<span class="sourceLineNo">1802</span>  }<a name="line.1802"></a>
+<span class="sourceLineNo">1803</span><a name="line.1803"></a>
+<span class="sourceLineNo">1804</span>  private void processAssignmentPlans(final HashMap&lt;RegionInfo, RegionStateNode&gt; regions,<a name="line.1804"></a>
+<span class="sourceLineNo">1805</span>      final HashMap&lt;RegionInfo, ServerName&gt; retainMap, final List&lt;RegionInfo&gt; hris,<a name="line.1805"></a>
+<span class="sourceLineNo">1806</span>      final List&lt;ServerName&gt; servers) {<a name="line.1806"></a>
+<span class="sourceLineNo">1807</span>    boolean isTraceEnabled = LOG.isTraceEnabled();<a name="line.1807"></a>
+<span class="sourceLineNo">1808</span>    if (isTraceEnabled) {<a name="line.1808"></a>
+<span class="sourceLineNo">1809</span>      LOG.trace("Available servers count=" + servers.size() + ": " + servers);<a name="line.1809"></a>
+<span class="sourceLineNo">1810</span>    }<a name="line.1810"></a>
+<span class="sourceLineNo">1811</span><a name="line.1811"></a>
+<span class="sourceLineNo">1812</span>    final LoadBalancer balancer = getBalancer();<a name="line.1812"></a>
+<span class="sourceLineNo">1813</span>    // ask the balancer where to place regions<a name="line.1813"></a>
+<span class="sourceLineNo">1814</span>    if (retainMap != null &amp;&amp; !retainMap.isEmpty()) {<a name="line.1814"></a>
+<span class="sourceLineNo">1815</span>      if (isTraceEnabled) {<a name="line.1815"></a>
+<span class="sourceLineNo">1816</span>        LOG.trace("retain assign regions=" + retainMap);<a name="line.1816"></a>
 <span class="sourceLineNo">1817</span>      }<a name="line.1817"></a>
-<span class="sourceLineNo">1818</span>    }<a name="line.1818"></a>
-<span class="sourceLineNo">1819</span><a name="line.1819"></a>
-<span class="sourceLineNo">1820</span>    // TODO: Do we need to split retain and round-robin?<a name="line.1820"></a>
-<span class="sourceLineNo">1821</span>    // the retain seems to fallback to round-robin/random if the region is not in the map.<a name="line.1821"></a>
-<span class="sourceLineNo">1822</span>    if (!hris.isEmpty()) {<a name="line.1822"></a>
-<span class="sourceLineNo">1823</span>      Collections.sort(hris, RegionInfo.COMPARATOR);<a name="line.1823"></a>
-<span class="sourceLineNo">1824</span>      if (isTraceEnabled) {<a name="line.1824"></a>
-<span class="sourceLineNo">1825</span>        LOG.trace("round robin regions=" + hris);<a name="line.1825"></a>
-<span class="sourceLineNo">1826</span>      }<a name="line.1826"></a>
-<span class="sourceLineNo">1827</span>      try {<a name="line.1827"></a>
-<span class="sourceLineNo">1828</span>        acceptPlan(regions, balancer.roundRobinAssignment(hris, servers));<a name="line.1828"></a>
-<span class="sourceLineNo">1829</span>      } catch (HBaseIOException e) {<a name="line.1829"></a>
-<span class="sourceLineNo">1830</span>        LOG.warn("unable to round-robin assignment", e);<a name="line.1830"></a>
-<span class="sourceLineNo">1831</span>        addToPendingAssignment(regions, hris);<a name="line.1831"></a>
+<span class="sourceLineNo">1818</span>      try {<a name="line.1818"></a>
+<span class="sourceLineNo">1819</span>        acceptPlan(regions, balancer.retainAssignment(retainMap, servers));<a name="line.1819"></a>
+<span class="sourceLineNo">1820</span>      } catch (HBaseIOException e) {<a name="line.1820"></a>
+<span class="sourceLineNo">1821</span>        LOG.warn("unable to retain assignment", e);<a name="line.1821"></a>
+<span class="sourceLineNo">1822</span>        addToPendingAssignment(regions, retainMap.keySet());<a name="line.1822"></a>
+<span class="sourceLineNo">1823</span>      }<a name="line.1823"></a>
+<span class="sourceLineNo">1824</span>    }<a name="line.1824"></a>
+<span class="sourceLineNo">1825</span><a name="line.1825"></a>
+<span class="sourceLineNo">1826</span>    // TODO: Do we need to split retain and round-robin?<a name="line.1826"></a>
+<span class="sourceLineNo">1827</span>    // the retain seems to fallback to round-robin/random if the region is not in the map.<a name="line.1827"></a>
+<span class="sourceLineNo">1828</span>    if (!hris.isEmpty()) {<a name="line.1828"></a>
+<span class="sourceLineNo">1829</span>      Collections.sort(hris, RegionInfo.COMPARATOR);<a name="line.1829"></a>
+<span class="sourceLineNo">1830</span>      if (isTraceEnabled) {<a name="line.1830"></a>
+<span class="sourceLineNo">1831</span>        LOG.trace("round robin regions=" + hris);<a name="line.1831"></a>
 <span class="sourceLineNo">1832</span>      }<a name="line.1832"></a>
-<span class="sourceLineNo">1833</span>    }<a name="line.1833"></a>
-<span class="sourceLineNo">1834</span>  }<a name="line.1834"></a>
-<span class="sourceLineNo">1835</span><a name="line.1835"></a>
-<span class="sourceLineNo">1836</span>  private void acceptPlan(final HashMap&lt;RegionInfo, RegionStateNode&gt; regions,<a name="line.1836"></a>
-<span class="sourceLineNo">1837</span>      final Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; plan) throws HBaseIOException {<a name="line.1837"></a>
-<span class="sourceLineNo">1838</span>    final ProcedureEvent&lt;?&gt;[] events = new ProcedureEvent[regions.size()];<a name="line.1838"></a>
-<span class="sourceLineNo">1839</span>    final long st = System.currentTimeMillis();<a name="line.1839"></a>
-<span class="sourceLineNo">1840</span><a name="line.1840"></a>
-<span class="sourceLineNo">1841</span>    if (plan == null) {<a name="line.1841"></a>
-<span class="sourceLineNo">1842</span>      throw new HBaseIOException("unable to compute plans for regions=" + regions.size());<a name="line.1842"></a>
-<span class="sourceLineNo">1843</span>    }<a name="line.1843"></a>
-<span class="sourceLineNo">1844</span><a name="line.1844"></a>
-<span class="sourceLineNo">1845</span>    if (plan.isEmpty()) return;<a name="line.1845"></a>
+<span class="sourceLineNo">1833</span>      try {<a name="line.1833"></a>
+<span class="sourceLineNo">1834</span>        acceptPlan(regions, balancer.roundRobinAssignment(hris, servers));<a name="line.1834"></a>
+<span class="sourceLineNo">1835</span>      } catch (HBaseIOException e) {<a name="line.1835"></a>
+<span class="sourceLineNo">1836</span>        LOG.warn("unable to round-robin assignment", e);<a name="line.1836"></a>
+<span class="sourceLineNo">1837</span>        addToPendingAssignment(regions, hris);<a name="line.1837"></a>
+<span class="sourceLineNo">1838</span>      }<a name="line.1838"></a>
+<span class="sourceLineNo">1839</span>    }<a name="line.1839"></a>
+<span class="sourceLineNo">1840</span>  }<a name="line.1840"></a>
+<span class="sourceLineNo">1841</span><a name="line.1841"></a>
+<span class="sourceLineNo">1842</span>  private void acceptPlan(final HashMap&lt;RegionInfo, RegionStateNode&gt; regions,<a name="line.1842"></a>
+<span class="sourceLineNo">1843</span>      final Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; plan) throws HBaseIOException {<a name="line.1843"></a>
+<span class="sourceLineNo">1844</span>    final ProcedureEvent&lt;?&gt;[] events = new ProcedureEvent[regions.size()];<a name="line.1844"></a>
+<span class="sourceLineNo">1845</span>    final long st = System.currentTimeMillis();<a name="line.1845"></a>
 <span class="sourceLineNo">1846</span><a name="line.1846"></a>
-<span class="sourceLineNo">1847</span>    int evcount = 0;<a name="line.1847"></a>
-<span class="sourceLineNo">1848</span>    for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; entry: plan.entrySet()) {<a name="line.1848"></a>
-<span class="sourceLineNo">1849</span>      final ServerName server = entry.getKey();<a name="line.1849"></a>
-<span class="sourceLineNo">1850</span>      for (RegionInfo hri: entry.getValue()) {<a name="line.1850"></a>
-<span class="sourceLineNo">1851</span>        final RegionStateNode regionNode = regions.get(hri);<a name="line.1851"></a>
-<span class="sourceLineNo">1852</span>        regionNode.setRegionLocation(server);<a name="line.1852"></a>
-<span class="sourceLineNo">1853</span>        events[evcount++] = regionNode.getProcedureEvent();<a name="line.1853"></a>
-<span class="sourceLineNo">1854</span>      }<a name="line.1854"></a>
-<span class="sourceLineNo">1855</span>    }<a name="line.1855"></a>
-<span class="sourceLineNo">1856</span>    ProcedureEvent.wakeEvents(getProcedureScheduler(), events);<a name="line.1856"></a>
-<span class="sourceLineNo">1857</span><a name="line.1857"></a>
-<span class="sourceLineNo">1858</span>    final long et = System.currentTimeMillis();<a name="line.1858"></a>
-<span class="sourceLineNo">1859</span>    if (LOG.isTraceEnabled()) {<a name="line.1859"></a>
-<span class="sourceLineNo">1860</span>      LOG.trace("ASSIGN ACCEPT " + events.length + " -&gt; " +<a name="line.1860"></a>
-<span class="sourceLineNo">1861</span>          StringUtils.humanTimeDiff(et - st));<a name="line.1861"></a>
-<span class="sourceLineNo">1862</span>    }<a name="line.1862"></a>
-<span class="sourceLineNo">1863</span>  }<a name="line.1863"></a>
-<span class="sourceLineNo">1864</span><a name="line.1864"></a>
-<span class="sourceLineNo">1865</span>  private void addToPendingAssignment(final HashMap&lt;RegionInfo, RegionStateNode&gt; regions,<a name="line.1865"></a>
-<span class="sourceLineNo">1866</span>      final Collection&lt;RegionInfo&gt; pendingRegions) {<a name="line.1866"></a>
-<span class="sourceLineNo">1867</span>    assignQueueLock.lock();<a name="line.1867"></a>
-<span class="sourceLineNo">1868</span>    try {<a name="line.1868"></a>
-<span class="sourceLineNo">1869</span>      for (RegionInfo hri: pendingRegions) {<a name="line.1869"></a>
-<span class="sourceLineNo">1870</span>        pendingAssignQueue.add(regions.get(hri));<a name="line.1870"></a>
-<span class="sourceLineNo">1871</span>      }<a name="line.1871"></a>
-<span class="sourceLineNo">1872</span>    } finally {<a name="line.1872"></a>
-<span class="sourceLineNo">1873</span>      assignQueueLock.unlock();<a name="line.1873"></a>
-<span class="sourceLineNo">1874</span>    }<a name="line.1874"></a>
-<span class="sourceLineNo">1875</span>  }<a name="line.1875"></a>
-<span class="sourceLineNo">1876</span><a name="line.1876"></a>
-<span class="sourceLineNo">1877</span>  /**<a name="line.1877"></a>
-<span class="sourceLineNo">1878</span>   * Get a list of servers that this region cannot be assigned to.<a name="line.1878"></a>
-<span class="sourceLineNo">1879</span>   * For system tables, we must assign them to a server with highest version.<a name="line.1879"></a>
-<span class="sourceLineNo">1880</span>   */<a name="line.1880"></a>
-<span class="sourceLineNo">1881</span>  public List&lt;ServerName&gt; getExcludedServersForSystemTable() {<a name="line.1881"></a>
-<span class="sourceLineNo">1882</span>    // TODO: This should be a cached list kept by the ServerManager rather than calculated on each<a name="line.1882"></a>
-<span class="sourceLineNo">1883</span>    // move or system region assign. The RegionServerTracker keeps list of online Servers with<a name="line.1883"></a>
-<span class="sourceLineNo">1884</span>    // RegionServerInfo that includes Version.<a name="line.1884"></a>
-<span class="sourceLineNo">1885</span>    List&lt;Pair&lt;ServerName, String&gt;&gt; serverList = master.getServerManager().getOnlineServersList()<a name="line.1885"></a>
-<span class="sourceLineNo">1886</span>        .stream()<a name="line.1886"></a>
-<span class="sourceLineNo">1887</span>        .map((s)-&gt;new Pair&lt;&gt;(s, master.getRegionServerVersion(s)))<a name="line.1887"></a>
-<span class="sourceLineNo">1888</span>        .collect(Collectors.toList());<a name="line.1888"></a>
-<span class="sourceLineNo">1889</span>    if (serverList.isEmpty()) {<a name="line.1889"></a>
-<span class="sourceLineNo">1890</span>      return Collections.emptyList();<a name="line.1890"></a>
-<span class="sourceLineNo">1891</span>    }<a name="line.1891"></a>
-<span class="sourceLineNo">1892</span>    String highestVersion = Collections.max(serverList,<a name="line.1892"></a>
-<span class="sourceLineNo">1893</span>        (o1, o2) -&gt; VersionInfo.compareVersion(o1.getSecond(), o2.getSecond())).getSecond();<a name="line.1893"></a>
-<span class="sourceLineNo">1894</span>    return serverList.stream()<a name="line.1894"></a>
-<span class="sourceLineNo">1895</span>        .filter((p)-&gt;!p.getSecond().equals(highestVersion))<a name="line.1895"></a>
-<span class="sourceLineNo">1896</span>        .map(Pair::getFirst)<a name="line.1896"></a>
-<span class="sourceLineNo">1897</span>        .collect(Collectors.toList());<a name="line.1897"></a>
-<span class="sourceLineNo">1898</span>  }<a name="line.1898"></a>
-<span class="sourceLineNo">1899</span><a name="line.1899"></a>
-<span class="sourceLineNo">1900</span>  @VisibleForTesting<a name="line.1900"></a>
-<span class="sourceLineNo">1901</span>  MasterServices getMaster() {<a name="line.1901"></a>
-<span class="sourceLineNo">1902</span>    return master;<a name="line.1902"></a>
-<span class="sourceLineNo">1903</span>  }<a name="line.1903"></a>
-<span class="sourceLineNo">1904</span>}<a name="line.1904"></a>
+<span class="sourceLineNo">1847</span>    if (plan == null) {<a name="line.1847"></a>
+<span class="sourceLineNo">1848</span>      throw new HBaseIOException("unable to compute plans for regions=" + regions.size());<a name="line.1848"></a>
+<span class="sourceLineNo">1849</span>    }<a name="line.1849"></a>
+<span class="sourceLineNo">1850</span><a name="line.1850"></a>
+<span class="sourceLineNo">1851</span>    if (plan.isEmpty()) return;<a name="line.1851"></a>
+<span class="sourceLineNo">1852</span><a name="line.1852"></a>
+<span class="sourceLineNo">1853</span>    int evcount = 0;<a name="line.1853"></a>
+<span class="sourceLineNo">1854</span>    for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; entry: plan.entrySet()) {<a name="line.1854"></a>
+<span class="sourceLineNo">1855</span>      final ServerName server = entry.getKey();<a name="line.1855"></a>
+<span class="sourceLineNo">1856</span>      for (RegionInfo hri: entry.getValue()) {<a name="line.1856"></a>
+<span class="sourceLineNo">1857</span>        final RegionStateNode regionNode = regions.get(hri);<a name="line.1857"></a>
+<span class="sourceLineNo">1858</span>        regionNode.setRegionLocation(server);<a name="line.1858"></a>
+<span class="sourceLineNo">1859</span>        events[evcount++] = regionNode.getProcedureEvent();<a name="line.1859"></a>
+<span class="sourceLineNo">1860</span>      }<a name="line.1860"></a>
+<span class="sourceLineNo">1861</span>    }<a name="line.1861"></a>
+<span class="sourceLineNo">1862</span>    ProcedureEvent.wakeEvents(getProcedureScheduler(), events);<a name="line.1862"></a>
+<span class="sourceLineNo">1863</span><a name="line.1863"></a>
+<span class="sourceLineNo">1864</span>    final long et = System.currentTimeMillis();<a name="line.1864"></a>
+<span class="sourceLineNo">1865</span>    if (LOG.isTraceEnabled()) {<a name="line.1865"></a>
+<span class="sourceLineNo">1866</span>      LOG.trace("ASSIGN ACCEPT " + events.length + " -&gt; " +<a name="line.1866"></a>
+<span class="sourceLineNo">1867</span>          StringUtils.humanTimeDiff(et - st));<a name="line.1867"></a>
+<span class="sourceLineNo">1868</span>    }<a name="line.1868"></a>
+<span class="sourceLineNo">1869</span>  }<a name="line.1869"></a>
+<span class="sourceLineNo">1870</span><a name="line.1870"></a>
+<span class="sourceLineNo">1871</span>  private void addToPendingAssignment(final HashMap&lt;RegionInfo, RegionStateNode&gt; regions,<a name="line.1871"></a>
+<span class="sourceLineNo">1872</span>      final Collection&lt;RegionInfo&gt; pendingRegions) {<a name="line.1872"></a>
+<span class="sourceLineNo">1873</span>    assignQueueLock.lock();<a name="line.1873"></a>
+<span class="sourceLineNo">1874</span>    try {<a name="line.1874"></a>
+<span class="sourceLineNo">1875</span>      for (RegionInfo hri: pendingRegions) {<a name="line.1875"></a>
+<span class="sourceLineNo">1876</span>        pendingAssignQueue.add(regions.get(hri));<a name="line.1876"></a>
+<span class="sourceLineNo">1877</span>      }<a name="line.1877"></a>
+<span class="sourceLineNo">1878</span>    } finally {<a name="line.1878"></a>
+<span class="sourceLineNo">1879</span>      assignQueueLock.unlock();<a name="line.1879"></a>
+<span class="sourceLineNo">1880</span>    }<a name="line.1880"></a>
+<span class="sourceLineNo">1881</span>  }<a name="line.1881"></a>
+<span class="sourceLineNo">1882</span><a name="line.1882"></a>
+<span class="sourceLineNo">1883</span>  /**<a name="line.1883"></a>
+<span class="sourceLineNo">1884</span>   * Get a list of servers that this region cannot be assigned to.<a name="line.1884"></a>
+<span class="sourceLineNo">1885</span>   * For system tables, we must assign them to a server with highest version.<a name="line.1885"></a>
+<span class="sourceLineNo">1886</span>   */<a name="line.1886"></a>
+<span class="sourceLineNo">1887</span>  public List&lt;ServerName&gt; getExcludedServersForSystemTable() {<a name="line.1887"></a>
+<span class="sourceLineNo">1888</span>    // TODO: This should be a cached list kept by the ServerManager rather than calculated on each<a name="line.1888"></a>
+<span class="sourceLineNo">1889</span>    // move or system region assign. The RegionServerTracker keeps list of online Servers with<a name="line.1889"></a>
+<span class="sourceLineNo">1890</span>    // RegionServerInfo that includes Version.<a name="line.1890"></a>
+<span class="sourceLineNo">1891</span>    List&lt;Pair&lt;ServerName, String&gt;&gt; serverList = master.getServerManager().getOnlineServersList()<a name="line.1891"></a>
+<span class="sourceLineNo">1892</span>        .stream()<a name="line.1892"></a>
+<span class="sourceLineNo">1893</span>        .map((s)-&gt;new Pair&lt;&gt;(s, master.getRegionServerVersion(s)))<a name="line.1893"></a>
+<span class="sourceLineNo">1894</span>        .collect(Collectors.toList());<a name="line.1894"></a>
+<span class="sourceLineNo">1895</span>    if (serverList.isEmpty()) {<a name="line.1895"></a>
+<span class="sourceLineNo">1896</span>      return Collections.emptyList();<a name="line.1896"></a>
+<span class="sourceLineNo">1897</span>    }<a name="line.1897"></a>
+<span class="sourceLineNo">1898</span>    String highestVersion = Collections.max(serverList,<a name="line.1898"></a>
+<span class="sourceLineNo">1899</span>        (o1, o2) -&gt; VersionInfo.compareVersion(o1.getSecond(), o2.getSecond())).getSecond();<a name="line.1899"></a>
+<span class="sourceLineNo">1900</span>    return serverList.stream()<a name="line.1900"></a>
+<span class="sourceLineNo">1901</span>        .filter((p)-&gt;!p.getSecond().equals(highestVersion))<a name="line.1901"></a>
+<span class="sourceLineNo">1902</span>        .map(Pair::getFirst)<a name="line.1902"></a>
+<span class="sourceLineNo">1903</span>        .collect(Collectors.toList());<a name="line.1903"></a>
+<span class="sourceLineNo">1904</span>  }<a name="line.1904"></a>
+<span class="sourceLineNo">1905</span><a name="line.1905"></a>
+<span class="sourceLineNo">1906</span>  @VisibleForTesting<a name="line.1906"></a>
+<span class="sourceLineNo">1907</span>  MasterServices getMaster() {<a name="line.1907"></a>
+<span class="sourceLineNo">1908</span>    return master;<a name="line.1908"></a>
+<span class="sourceLineNo">1909</span>  }<a name="line.1909"></a>
+<span class="sourceLineNo">1910</span>}<a name="line.1910"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html
index 48ff447..7237a8a 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html
@@ -1203,713 +1203,719 @@
 <span class="sourceLineNo">1195</span>    private void update(final Collection&lt;RegionState&gt; regions, final long currentTime) {<a name="line.1195"></a>
 <span class="sourceLineNo">1196</span>      for (RegionState state: regions) {<a name="line.1196"></a>
 <span class="sourceLineNo">1197</span>        totalRITs++;<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>        final long ritTime = currentTime - state.getStamp();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>        if (ritTime &gt; ritThreshold) {<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>          if (ritsOverThreshold == null) {<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>            ritsOverThreshold = new HashMap&lt;String, RegionState&gt;();<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          }<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>          ritsOverThreshold.put(state.getRegion().getEncodedName(), state);<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>          totalRITsTwiceThreshold += (ritTime &gt; (ritThreshold * 2)) ? 1 : 0;<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>        }<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>        if (oldestRITTime &lt; ritTime) {<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>          oldestRITTime = ritTime;<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>        }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>      }<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>    }<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>  }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span><a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>  private void updateRegionsInTransitionMetrics(final RegionInTransitionStat ritStat) {<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>    metrics.updateRITOldestAge(ritStat.getOldestRITTime());<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    metrics.updateRITCount(ritStat.getTotalRITs());<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>    metrics.updateRITCountOverThreshold(ritStat.getTotalRITsOverThreshold());<a name="line.1216"></a>
+<span class="sourceLineNo">1198</span>        final long ritStartedMs = state.getStamp();<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>        if (ritStartedMs == 0) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>          // Don't output bogus values to metrics if they accidentally make it here.<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>          LOG.warn("The RIT {} has no start time", state.getRegion());<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>          continue;<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>        }<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>        final long ritTime = currentTime - ritStartedMs;<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>        if (ritTime &gt; ritThreshold) {<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>          if (ritsOverThreshold == null) {<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>            ritsOverThreshold = new HashMap&lt;String, RegionState&gt;();<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>          }<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>          ritsOverThreshold.put(state.getRegion().getEncodedName(), state);<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>          totalRITsTwiceThreshold += (ritTime &gt; (ritThreshold * 2)) ? 1 : 0;<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>        }<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>        if (oldestRITTime &lt; ritTime) {<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>          oldestRITTime = ritTime;<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>        }<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>      }<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>    }<a name="line.1216"></a>
 <span class="sourceLineNo">1217</span>  }<a name="line.1217"></a>
 <span class="sourceLineNo">1218</span><a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>  private void handleRegionOverStuckWarningThreshold(final RegionInfo regionInfo) {<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    final RegionStateNode regionNode = regionStates.getRegionStateNode(regionInfo);<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>    //if (regionNode.isStuck()) {<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>    LOG.warn("STUCK Region-In-Transition {}", regionNode);<a name="line.1222"></a>
+<span class="sourceLineNo">1219</span>  private void updateRegionsInTransitionMetrics(final RegionInTransitionStat ritStat) {<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>    metrics.updateRITOldestAge(ritStat.getOldestRITTime());<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>    metrics.updateRITCount(ritStat.getTotalRITs());<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>    metrics.updateRITCountOverThreshold(ritStat.getTotalRITsOverThreshold());<a name="line.1222"></a>
 <span class="sourceLineNo">1223</span>  }<a name="line.1223"></a>
 <span class="sourceLineNo">1224</span><a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>  // ============================================================================================<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>  //  TODO: Master load/bootstrap<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>  // ============================================================================================<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>  public void joinCluster() throws IOException {<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    long startTime = System.nanoTime();<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>    LOG.debug("Joining cluster...");<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span><a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    // Scan hbase:meta to build list of existing regions, servers, and assignment.<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    // hbase:meta is online now or will be. Inside loadMeta, we keep trying. Can't make progress<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    // w/o  meta.<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    loadMeta();<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span><a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>    while (master.getServerManager().countOfRegionServers() &lt; 1) {<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      LOG.info("Waiting for RegionServers to join; current count={}",<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>        master.getServerManager().countOfRegionServers());<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>      Threads.sleep(250);<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    }<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>    LOG.info("Number of RegionServers={}", master.getServerManager().countOfRegionServers());<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span><a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    // Start the RIT chore<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    master.getMasterProcedureExecutor().addChore(this.ritChore);<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span><a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    long costMs = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startTime);<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>    LOG.info("Joined the cluster in {}", StringUtils.humanTimeDiff(costMs));<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>  }<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span><a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>  /**<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>   * Create assign procedure for offline regions.<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>   * Just follow the old processofflineServersWithOnlineRegions method. Since now we do not need to<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>   * deal with dead server any more, we only deal with the regions in OFFLINE state in this method.<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>   * And this is a bit strange, that for new regions, we will add it in CLOSED state instead of<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>   * OFFLINE state, and usually there will be a procedure to track them. The<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>   * processofflineServersWithOnlineRegions is a legacy from long ago, as things are going really<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>   * different now, maybe we do not need this method any more. Need to revisit later.<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>   */<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>  // Public so can be run by the Master as part of the startup. Needs hbase:meta to be online.<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>  // Needs to be done after the table state manager has been started.<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>  public void processOfflineRegions() {<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    List&lt;RegionInfo&gt; offlineRegions = regionStates.getRegionStates().stream()<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>      .filter(RegionState::isOffline).filter(s -&gt; isTableEnabled(s.getRegion().getTable()))<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>      .map(RegionState::getRegion).collect(Collectors.toList());<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    if (!offlineRegions.isEmpty()) {<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>      master.getMasterProcedureExecutor().submitProcedures(<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>        master.getAssignmentManager().createRoundRobinAssignProcedures(offlineRegions));<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    }<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>  }<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span><a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>  private void loadMeta() throws IOException {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    // TODO: use a thread pool<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>    regionStateStore.visitMeta(new RegionStateStore.RegionStateVisitor() {<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>      @Override<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      public void visitRegionState(Result result, final RegionInfo regionInfo, final State state,<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>          final ServerName regionLocation, final ServerName lastHost, final long openSeqNum) {<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>        if (state == null &amp;&amp; regionLocation == null &amp;&amp; lastHost == null &amp;&amp;<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>            openSeqNum == SequenceId.NO_SEQUENCE_ID) {<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>          // This is a row with nothing in it.<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>          LOG.warn("Skipping empty row={}", result);<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>          return;<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>        }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>        State localState = state;<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>        if (localState == null) {<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>          // No region state column data in hbase:meta table! Are I doing a rolling upgrade from<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>          // hbase1 to hbase2? Am I restoring a SNAPSHOT or otherwise adding a region to hbase:meta?<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>          // In any of these cases, state is empty. For now, presume OFFLINE but there are probably<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>          // cases where we need to probe more to be sure this correct; TODO informed by experience.<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>          LOG.info(regionInfo.getEncodedName() + " regionState=null; presuming " + State.OFFLINE);<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span><a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>          localState = State.OFFLINE;<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>        }<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>        RegionStateNode regionNode = regionStates.getOrCreateRegionStateNode(regionInfo);<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>        // Do not need to lock on regionNode, as we can make sure that before we finish loading<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>        // meta, all the related procedures can not be executed. The only exception is for meta<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>        // region related operations, but here we do not load the informations for meta region.<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>        regionNode.setState(localState);<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>        regionNode.setLastHost(lastHost);<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>        regionNode.setRegionLocation(regionLocation);<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>        regionNode.setOpenSeqNum(openSeqNum);<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span><a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>        // Note: keep consistent with other methods, see region(Opening|Opened|Closing)<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>        //       RIT/ServerCrash handling should take care of the transiting regions.<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>        if (localState.matches(State.OPEN, State.OPENING, State.CLOSING, State.SPLITTING,<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>          State.MERGING)) {<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>          assert regionLocation != null : "found null region location for " + regionNode;<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>          regionStates.addRegionToServer(regionNode);<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>        } else if (localState == State.OFFLINE || regionInfo.isOffline()) {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>          regionStates.addToOfflineRegions(regionNode);<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>        }<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>      }<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    });<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span><a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>    // every assignment is blocked until meta is loaded.<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    wakeMetaLoadedEvent();<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>  }<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span><a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>  /**<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>   * Used to check if the meta loading is done.<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>   * &lt;p/&gt;<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>   * if not we throw PleaseHoldException since we are rebuilding the RegionStates<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>   * @param hri region to check if it is already rebuild<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>   * @throws PleaseHoldException if meta has not been loaded yet<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>   */<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>  private void checkMetaLoaded(RegionInfo hri) throws PleaseHoldException {<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>    if (!isRunning()) {<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>      throw new PleaseHoldException("AssignmentManager not running");<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    }<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>    boolean meta = isMetaRegion(hri);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>    boolean metaLoaded = isMetaLoaded();<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>    if (!meta &amp;&amp; !metaLoaded) {<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>      throw new PleaseHoldException(<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>        "Master not fully online; hbase:meta=" + meta + ", metaLoaded=" + metaLoaded);<a name="line.1334"></a>
+<span class="sourceLineNo">1225</span>  private void handleRegionOverStuckWarningThreshold(final RegionInfo regionInfo) {<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>    final RegionStateNode regionNode = regionStates.getRegionStateNode(regionInfo);<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>    //if (regionNode.isStuck()) {<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    LOG.warn("STUCK Region-In-Transition {}", regionNode);<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>  }<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span><a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>  // ============================================================================================<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>  //  TODO: Master load/bootstrap<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>  // ============================================================================================<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>  public void joinCluster() throws IOException {<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>    long startTime = System.nanoTime();<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>    LOG.debug("Joining cluster...");<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span><a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>    // Scan hbase:meta to build list of existing regions, servers, and assignment.<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>    // hbase:meta is online now or will be. Inside loadMeta, we keep trying. Can't make progress<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>    // w/o  meta.<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>    loadMeta();<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span><a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>    while (master.getServerManager().countOfRegionServers() &lt; 1) {<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>      LOG.info("Waiting for RegionServers to join; current count={}",<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>        master.getServerManager().countOfRegionServers());<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>      Threads.sleep(250);<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    }<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>    LOG.info("Number of RegionServers={}", master.getServerManager().countOfRegionServers());<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span><a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>    // Start the RIT chore<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>    master.getMasterProcedureExecutor().addChore(this.ritChore);<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span><a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>    long costMs = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startTime);<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>    LOG.info("Joined the cluster in {}", StringUtils.humanTimeDiff(costMs));<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>  }<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span><a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>  /**<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>   * Create assign procedure for offline regions.<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>   * Just follow the old processofflineServersWithOnlineRegions method. Since now we do not need to<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>   * deal with dead server any more, we only deal with the regions in OFFLINE state in this method.<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>   * And this is a bit strange, that for new regions, we will add it in CLOSED state instead of<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>   * OFFLINE state, and usually there will be a procedure to track them. The<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>   * processofflineServersWithOnlineRegions is a legacy from long ago, as things are going really<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>   * different now, maybe we do not need this method any more. Need to revisit later.<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>   */<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>  // Public so can be run by the Master as part of the startup. Needs hbase:meta to be online.<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>  // Needs to be done after the table state manager has been started.<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>  public void processOfflineRegions() {<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>    List&lt;RegionInfo&gt; offlineRegions = regionStates.getRegionStates().stream()<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>      .filter(RegionState::isOffline).filter(s -&gt; isTableEnabled(s.getRegion().getTable()))<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>      .map(RegionState::getRegion).collect(Collectors.toList());<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    if (!offlineRegions.isEmpty()) {<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>      master.getMasterProcedureExecutor().submitProcedures(<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>        master.getAssignmentManager().createRoundRobinAssignProcedures(offlineRegions));<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>    }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>  }<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span><a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>  private void loadMeta() throws IOException {<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>    // TODO: use a thread pool<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>    regionStateStore.visitMeta(new RegionStateStore.RegionStateVisitor() {<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>      @Override<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>      public void visitRegionState(Result result, final RegionInfo regionInfo, final State state,<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>          final ServerName regionLocation, final ServerName lastHost, final long openSeqNum) {<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>        if (state == null &amp;&amp; regionLocation == null &amp;&amp; lastHost == null &amp;&amp;<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>            openSeqNum == SequenceId.NO_SEQUENCE_ID) {<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>          // This is a row with nothing in it.<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>          LOG.warn("Skipping empty row={}", result);<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>          return;<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>        }<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>        State localState = state;<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>        if (localState == null) {<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>          // No region state column data in hbase:meta table! Are I doing a rolling upgrade from<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>          // hbase1 to hbase2? Am I restoring a SNAPSHOT or otherwise adding a region to hbase:meta?<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>          // In any of these cases, state is empty. For now, presume OFFLINE but there are probably<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>          // cases where we need to probe more to be sure this correct; TODO informed by experience.<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>          LOG.info(regionInfo.getEncodedName() + " regionState=null; presuming " + State.OFFLINE);<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>          localState = State.OFFLINE;<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>        }<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>        RegionStateNode regionNode = regionStates.getOrCreateRegionStateNode(regionInfo);<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>        // Do not need to lock on regionNode, as we can make sure that before we finish loading<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>        // meta, all the related procedures can not be executed. The only exception is for meta<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>        // region related operations, but here we do not load the informations for meta region.<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>        regionNode.setState(localState);<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>        regionNode.setLastHost(lastHost);<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>        regionNode.setRegionLocation(regionLocation);<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>        regionNode.setOpenSeqNum(openSeqNum);<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span><a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>        // Note: keep consistent with other methods, see region(Opening|Opened|Closing)<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>        //       RIT/ServerCrash handling should take care of the transiting regions.<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>        if (localState.matches(State.OPEN, State.OPENING, State.CLOSING, State.SPLITTING,<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>          State.MERGING)) {<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>          assert regionLocation != null : "found null region location for " + regionNode;<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>          regionStates.addRegionToServer(regionNode);<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>        } else if (localState == State.OFFLINE || regionInfo.isOffline()) {<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>          regionStates.addToOfflineRegions(regionNode);<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>        }<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>      }<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>    });<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span><a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    // every assignment is blocked until meta is loaded.<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>    wakeMetaLoadedEvent();<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>  }<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span><a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>  /**<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>   * Used to check if the meta loading is done.<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>   * &lt;p/&gt;<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>   * if not we throw PleaseHoldException since we are rebuilding the RegionStates<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>   * @param hri region to check if it is already rebuild<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>   * @throws PleaseHoldException if meta has not been loaded yet<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>   */<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>  private void checkMetaLoaded(RegionInfo hri) throws PleaseHoldException {<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>    if (!isRunning()) {<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>      throw new PleaseHoldException("AssignmentManager not running");<a name="line.1334"></a>
 <span class="sourceLineNo">1335</span>    }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>  }<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span><a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>  // ============================================================================================<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>  //  TODO: Metrics<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>  // ============================================================================================<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>  public int getNumRegionsOpened() {<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>    // TODO: Used by TestRegionPlacement.java and assume monotonically increasing value<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>    return 0;<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>  }<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span><a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>  public long submitServerCrash(ServerName serverName, boolean shouldSplitWal) {<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>    boolean carryingMeta;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>    long pid;<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>    ServerStateNode serverNode = regionStates.getServerNode(serverName);<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>    if(serverNode == null){<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      LOG.info("Skip to add SCP for {} since this server should be OFFLINE already", serverName);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>      return -1;<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>    }<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>    // we hold the write lock here for fencing on reportRegionStateTransition. Once we set the<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>    // server state to CRASHED, we will no longer accept the reportRegionStateTransition call from<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>    // this server. This is used to simplify the implementation for TRSP and SCP, where we can make<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    // sure that, the region list fetched by SCP will not be changed any more.<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>    serverNode.writeLock().lock();<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>    try {<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>      ProcedureExecutor&lt;MasterProcedureEnv&gt; procExec = this.master.getMasterProcedureExecutor();<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>      carryingMeta = isCarryingMeta(serverName);<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>      if (!serverNode.isInState(ServerState.ONLINE)) {<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>        LOG.info(<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>          "Skip to add SCP for {} with meta= {}, " +<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>              "since there should be a SCP is processing or already done for this server node",<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>          serverName, carryingMeta);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>        return -1;<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>      } else {<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>        serverNode.setState(ServerState.CRASHED);<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>        pid = procExec.submitProcedure(new ServerCrashProcedure(procExec.getEnvironment(),<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>            serverName, shouldSplitWal, carryingMeta));<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>        LOG.info(<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>          "Added {} to dead servers which carryingMeta={}, submitted ServerCrashProcedure pid={}",<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>          serverName, carryingMeta, pid);<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>      }<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>    } finally {<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>      serverNode.writeLock().unlock();<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>    }<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>    return pid;<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>  }<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span><a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>  public void offlineRegion(final RegionInfo regionInfo) {<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    // TODO used by MasterRpcServices<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    RegionStateNode node = regionStates.getRegionStateNode(regionInfo);<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>    if (node != null) {<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>      node.offline();<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>    }<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>  }<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span><a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>  public void onlineRegion(final RegionInfo regionInfo, final ServerName serverName) {<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>    // TODO used by TestSplitTransactionOnCluster.java<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>  }<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span><a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; getSnapShotOfAssignment(<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>      final Collection&lt;RegionInfo&gt; regions) {<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>    return regionStates.getSnapShotOfAssignment(regions);<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>  }<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span><a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>  // ============================================================================================<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>  //  TODO: UTILS/HELPERS?<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>  // ============================================================================================<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>  /**<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>   * Used by the client (via master) to identify if all regions have the schema updates<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>   *<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>   * @param tableName<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>   * @return Pair indicating the status of the alter command (pending/total)<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>   * @throws IOException<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>   */<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>  public Pair&lt;Integer, Integer&gt; getReopenStatus(TableName tableName) {<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>    if (isTableDisabled(tableName)) return new Pair&lt;Integer, Integer&gt;(0, 0);<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span><a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>    final List&lt;RegionState&gt; states = regionStates.getTableRegionStates(tableName);<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>    int ritCount = 0;<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>    for (RegionState regionState: states) {<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>      if (!regionState.isOpened() &amp;&amp; !regionState.isSplit()) {<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>        ritCount++;<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>      }<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    }<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>    return new Pair&lt;Integer, Integer&gt;(ritCount, states.size());<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>  }<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span><a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>  // ============================================================================================<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>  //  TODO: Region State In Transition<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>  // ============================================================================================<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>  public boolean hasRegionsInTransition() {<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>    return regionStates.hasRegionsInTransition();<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>  }<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span><a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>  public List&lt;RegionStateNode&gt; getRegionsInTransition() {<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>    return regionStates.getRegionsInTransition();<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>  }<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span><a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>  public List&lt;RegionInfo&gt; getAssignedRegions() {<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>    return regionStates.getAssignedRegions();<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>  }<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span><a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>  public RegionInfo getRegionInfo(final byte[] regionName) {<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    final RegionStateNode regionState = regionStates.getRegionStateNodeFromName(regionName);<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    return regionState != null ? regionState.getRegionInfo() : null;<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>  }<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span><a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>  // ============================================================================================<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>  //  Expected states on region state transition.<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>  //  Notice that there is expected states for transiting to OPENING state, this is because SCP.<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>  //  See the comments in regionOpening method for more details.<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>  // ============================================================================================<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>  private static final State[] STATES_EXPECTED_ON_OPEN = {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>    State.OPENING, // Normal case<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>    State.OPEN // Retrying<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>  };<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span><a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>  private static final State[] STATES_EXPECTED_ON_CLOSING = {<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    State.OPEN, // Normal case<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    State.CLOSING, // Retrying<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>    State.SPLITTING, // Offline the split parent<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>    State.MERGING // Offline the merge parents<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>  };<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span><a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>  private static final State[] STATES_EXPECTED_ON_CLOSED = {<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>    State.CLOSING, // Normal case<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>    State.CLOSED // Retrying<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>  };<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span><a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>  // This is for manually scheduled region assign, can add other states later if we find out other<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>  // usages<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>  private static final State[] STATES_EXPECTED_ON_ASSIGN = { State.CLOSED, State.OFFLINE };<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span><a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>  // We only allow unassign or move a region which is in OPEN state.<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>  private static final State[] STATES_EXPECTED_ON_UNASSIGN_OR_MOVE = { State.OPEN };<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span><a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>  // ============================================================================================<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>  //  Region Status update<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>  //  Should only be called in TransitRegionStateProcedure<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>  // ============================================================================================<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>  private void transitStateAndUpdate(RegionStateNode regionNode, RegionState.State newState,<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>      RegionState.State... expectedStates) throws IOException {<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>    RegionState.State state = regionNode.getState();<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>    regionNode.transitionState(newState, expectedStates);<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>    boolean succ = false;<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>    try {<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>      regionStateStore.updateRegionLocation(regionNode);<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>      succ = true;<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>    } finally {<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>      if (!succ) {<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>        // revert<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>        regionNode.setState(state);<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>      }<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>    }<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>  }<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span><a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>  // should be called within the synchronized block of RegionStateNode<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>  void regionOpening(RegionStateNode regionNode) throws IOException {<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>    // As in SCP, for performance reason, there is no TRSP attached with this region, we will not<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>    // update the region state, which means that the region could be in any state when we want to<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>    // assign it after a RS crash. So here we do not pass the expectedStates parameter.<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>    transitStateAndUpdate(regionNode, State.OPENING);<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>    regionStates.addRegionToServer(regionNode);<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>    // update the operation count metrics<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>    metrics.incrementOperationCounter();<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>  }<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span><a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>  // should be called within the synchronized block of RegionStateNode.<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>  // The parameter 'giveUp' means whether we will try to open the region again, if it is true, then<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span>  // we will persist the FAILED_OPEN state into hbase:meta.<a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>  void regionFailedOpen(RegionStateNode regionNode, boolean giveUp) throws IOException {<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>    RegionState.State state = regionNode.getState();<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>    ServerName regionLocation = regionNode.getRegionLocation();<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>    if (giveUp) {<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>      regionNode.setState(State.FAILED_OPEN);<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span>      regionNode.setRegionLocation(null);<a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>      boolean succ = false;<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>      try {<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>        regionStateStore.updateRegionLocation(regionNode);<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>        succ = true;<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>      } finally {<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>        if (!succ) {<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>          // revert<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>          regionNode.setState(state);<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>          regionNode.setRegionLocation(regionLocation);<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span>        }<a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>      }<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span>    }<a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>    if (regionLocation != null) {<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>      regionStates.removeRegionFromServer(regionLocation, regionNode);<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>    }<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>  }<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span><a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>  // should be called within the synchronized block of RegionStateNode<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>  void regionOpened(RegionStateNode regionNode) throws IOException {<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>    // TODO: OPENING Updates hbase:meta too... we need to do both here and there?<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span>    // That is a lot of hbase:meta writing.<a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>    transitStateAndUpdate(regionNode, State.OPEN, STATES_EXPECTED_ON_OPEN);<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>    RegionInfo hri = regionNode.getRegionInfo();<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>    if (isMetaRegion(hri)) {<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span>      // Usually we'd set a table ENABLED at this stage but hbase:meta is ALWAYs enabled, it<a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>      // can't be disabled -- so skip the RPC (besides... enabled is managed by TableStateManager<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>      // which is backed by hbase:meta... Avoid setting ENABLED to avoid having to update state<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>      // on table that contains state.<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>      setMetaAssigned(hri, true);<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>    }<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>    regionStates.addRegionToServer(regionNode);<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>    regionStates.removeFromFailedOpen(hri);<a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>  }<a name="line.1543"></a>
-<span class="sourceLineNo">1544</span><a name="line.1544"></a>
-<span class="sourceLineNo">1545</span>  // should be called within the synchronized block of RegionStateNode<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span>  void regionClosing(RegionStateNode regionNode) throws IOException {<a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>    transitStateAndUpdate(regionNode, State.CLOSING, STATES_EXPECTED_ON_CLOSING);<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span><a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>    RegionInfo hri = regionNode.getRegionInfo();<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>    // Set meta has not initialized early. so people trying to create/edit tables will wait<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>    if (isMetaRegion(hri)) {<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>      setMetaAssigned(hri, false);<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>    }<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>    regionStates.addRegionToServer(regionNode);<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>    // update the operation count metrics<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>    metrics.incrementOperationCounter();<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>  }<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span><a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>  // should be called within the synchronized block of RegionStateNode<a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>  // The parameter 'normally' means whether we are closed cleanly, if it is true, then it means that<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>  // we are closed due to a RS crash.<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>  void regionClosed(RegionStateNode regionNode, boolean normally) throws IOException {<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span>    RegionState.State state = regionNode.getState();<a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>    ServerName regionLocation = regionNode.getRegionLocation();<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>    if (normally) {<a name="line.1565"></a>
-<span class="sourceLineNo">1566</span>      regionNode.transitionState(State.CLOSED, STATES_EXPECTED_ON_CLOSED);<a name="line.1566"></a>
-<span class="sourceLineNo">1567</span>    } else {<a name="line.1567"></a>
-<span class="sourceLineNo">1568</span>      // For SCP<a name="line.1568"></a>
-<span class="sourceLineNo">1569</span>      regionNode.transitionState(State.ABNORMALLY_CLOSED);<a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>    }<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>    regionNode.setRegionLocation(null);<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>    boolean succ = false;<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>    try {<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span>      regionStateStore.updateRegionLocation(regionNode);<a name="line.1574"></a>
-<span class="sourceLineNo">1575</span>      succ = true;<a name="line.1575"></a>
-<span class="sourceLineNo">1576</span>    } finally {<a name="line.1576"></a>
-<span class="sourceLineNo">1577</span>      if (!succ) {<a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>        // revert<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>        regionNode.setState(state);<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>        regionNode.setRegionLocation(regionLocation);<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span>      }<a name="line.1581"></a>
-<span class="sourceLineNo">1582</span>    }<a name="line.1582"></a>
-<span class="sourceLineNo">1583</span>    if (regionLocation != null) {<a name="line.1583"></a>
-<span class="sourceLineNo">1584</span>      regionNode.setLastHost(regionLocation);<a name="line.1584"></a>
-<span class="sourceLineNo">1585</span>      regionStates.removeRegionFromServer(regionLocation, regionNode);<a name="line.1585"></a>
-<span class="sourceLineNo">1586</span>    }<a name="line.1586"></a>
-<span class="sourceLineNo">1587</span>  }<a name="line.1587"></a>
-<span class="sourceLineNo">1588</span><a name="line.1588"></a>
-<span class="sourceLineNo">1589</span>  public void markRegionAsSplit(final RegionInfo parent, final ServerName serverName,<a name="line.1589"></a>
-<span class="sourceLineNo">1590</span>      final RegionInfo daughterA, final RegionInfo daughterB) throws IOException {<a name="line.1590"></a>
-<span class="sourceLineNo">1591</span>    // Update hbase:meta. Parent will be marked offline and split up in hbase:meta.<a name="line.1591"></a>
-<span class="sourceLineNo">1592</span>    // The parent stays in regionStates until cleared when removed by CatalogJanitor.<a name="line.1592"></a>
-<span class="sourceLineNo">1593</span>    // Update its state in regionStates to it shows as offline and split when read<a name="line.1593"></a>
-<span class="sourceLineNo">1594</span>    // later figuring what regions are in a table and what are not: see<a name="line.1594"></a>
-<span class="sourceLineNo">1595</span>    // regionStates#getRegionsOfTable<a name="line.1595"></a>
-<span class="sourceLineNo">1596</span>    final RegionStateNode node = regionStates.getOrCreateRegionStateNode(parent);<a name="line.1596"></a>
-<span class="sourceLineNo">1597</span>    node.setState(State.SPLIT);<a name="line.1597"></a>
-<span class="sourceLineNo">1598</span>    final RegionStateNode nodeA = regionStates.getOrCreateRegionStateNode(daughterA);<a name="line.1598"></a>
-<span class="sourceLineNo">1599</span>    nodeA.setState(State.SPLITTING_NEW);<a name="line.1599"></a>
-<span class="sourceLineNo">1600</span>    final RegionStateNode nodeB = regionStates.getOrCreateRegionStateNode(daughterB);<a name="line.1600"></a>
-<span class="sourceLineNo">1601</span>    nodeB.setState(State.SPLITTING_NEW);<a name="line.1601"></a>
-<span class="sourceLineNo">1602</span><a name="line.1602"></a>
-<span class="sourceLineNo">1603</span>    regionStateStore.splitRegion(parent, daughterA, daughterB, serverName);<a name="line.1603"></a>
-<span class="sourceLineNo">1604</span>    if (shouldAssignFavoredNodes(parent)) {<a name="line.1604"></a>
-<span class="sourceLineNo">1605</span>      List&lt;ServerName&gt; onlineServers = this.master.getServerManager().getOnlineServersList();<a name="line.1605"></a>
-<span class="sourceLineNo">1606</span>      ((FavoredNodesPromoter)getBalancer()).<a name="line.1606"></a>
-<span class="sourceLineNo">1607</span>          generateFavoredNodesForDaughter(onlineServers, parent, daughterA, daughterB);<a name="line.1607"></a>
-<span class="sourceLineNo">1608</span>    }<a name="line.1608"></a>
-<span class="sourceLineNo">1609</span>  }<a name="line.1609"></a>
-<span class="sourceLineNo">1610</span><a name="line.1610"></a>
-<span class="sourceLineNo">1611</span>  /**<a name="line.1611"></a>
-<span class="sourceLineNo">1612</span>   * When called here, the merge has happened. The two merged regions have been<a name="line.1612"></a>
-<span class="sourceLineNo">1613</span>   * unassigned and the above markRegionClosed has been called on each so they have been<a name="line.1613"></a>
-<span class="sourceLineNo">1614</span>   * disassociated from a hosting Server. The merged region will be open after this call. The<a name="line.1614"></a>
-<span class="sourceLineNo">1615</span>   * merged regions are removed from hbase:meta below&gt; Later they are deleted from the filesystem<a name="line.1615"></a>
-<span class="sourceLineNo">1616</span>   * by the catalog janitor running against hbase:meta. It notices when the merged region no<a name="line.1616"></a>
-<span class="sourceLineNo">1617</span>   * longer holds references to the old regions.<a name="line.1617"></a>
-<span class="sourceLineNo">1618</span>   */<a name="line.1618"></a>
-<span class="sourceLineNo">1619</span>  public void markRegionAsMerged(final RegionInfo child, final ServerName serverName,<a name="line.1619"></a>
-<span class="sourceLineNo">1620</span>      final RegionInfo mother, final RegionInfo father) throws IOException {<a name="line.1620"></a>
-<span class="sourceLineNo">1621</span>    final RegionStateNode node = regionStates.getOrCreateRegionStateNode(child);<a name="line.1621"></a>
-<span class="sourceLineNo">1622</span>    node.setState(State.MERGED);<a name="line.1622"></a>
-<span class="sourceLineNo">1623</span>    regionStates.deleteRegion(mother);<a name="line.1623"></a>
-<span class="sourceLineNo">1624</span>    regionStates.deleteRegion(father);<a name="line.1624"></a>
-<span class="sourceLineNo">1625</span>    regionStateStore.mergeRegions(child, mother, father, serverName);<a name="line.1625"></a>
-<span class="sourceLineNo">1626</span>    if (shouldAssignFavoredNodes(child)) {<a name="line.1626"></a>
-<span class="sourceLineNo">1627</span>      ((FavoredNodesPromoter)getBalancer()).<a name="line.1627"></a>
-<span class="sourceLineNo">1628</span>        generateFavoredNodesForMergedRegion(child, mother, father);<a name="line.1628"></a>
-<span class="sourceLineNo">1629</span>    }<a name="line.1629"></a>
-<span class="sourceLineNo">1630</span>  }<a name="line.1630"></a>
-<span class="sourceLineNo">1631</span><a name="line.1631"></a>
-<span class="sourceLineNo">1632</span>  /*<a name="line.1632"></a>
-<span class="sourceLineNo">1633</span>   * Favored nodes should be applied only when FavoredNodes balancer is configured and the region<a name="line.1633"></a>
-<span class="sourceLineNo">1634</span>   * belongs to a non-system table.<a name="line.1634"></a>
-<span class="sourceLineNo">1635</span>   */<a name="line.1635"></a>
-<span class="sourceLineNo">1636</span>  private boolean shouldAssignFavoredNodes(RegionInfo region) {<a name="line.1636"></a>
-<span class="sourceLineNo">1637</span>    return this.shouldAssignRegionsWithFavoredNodes &amp;&amp;<a name="line.1637"></a>
-<span class="sourceLineNo">1638</span>        FavoredNodesManager.isFavoredNodeApplicable(region);<a name="line.1638"></a>
-<span class="sourceLineNo">1639</span>  }<a name="line.1639"></a>
-<span class="sourceLineNo">1640</span><a name="line.1640"></a>
-<span class="sourceLineNo">1641</span>  // ============================================================================================<a name="line.1641"></a>
-<span class="sourceLineNo">1642</span>  //  Assign Queue (Assign/Balance)<a name="line.1642"></a>
-<span class="sourceLineNo">1643</span>  // ============================================================================================<a name="line.1643"></a>
-<span class="sourceLineNo">1644</span>  private final ArrayList&lt;RegionStateNode&gt; pendingAssignQueue = new ArrayList&lt;RegionStateNode&gt;();<a name="line.1644"></a>
-<span class="sourceLineNo">1645</span>  private final ReentrantLock assignQueueLock = new ReentrantLock();<a name="line.1645"></a>
-<span class="sourceLineNo">1646</span>  private final Condition assignQueueFullCond = assignQueueLock.newCondition();<a name="line.1646"></a>
-<span class="sourceLineNo">1647</span><a name="line.1647"></a>
-<span class="sourceLineNo">1648</span>  /**<a name="line.1648"></a>
-<span class="sourceLineNo">1649</span>   * Add the assign operation to the assignment queue.<a name="line.1649"></a>
-<span class="sourceLineNo">1650</span>   * The pending assignment operation will be processed,<a name="line.1650"></a>
-<span class="sourceLineNo">1651</span>   * and each region will be assigned by a server using the balancer.<a name="line.1651"></a>
-<span class="sourceLineNo">1652</span>   */<a name="line.1652"></a>
-<span class="sourceLineNo">1653</span>  protected void queueAssign(final RegionStateNode regionNode) {<a name="line.1653"></a>
-<span class="sourceLineNo">1654</span>    regionNode.getProcedureEvent().suspend();<a name="line.1654"></a>
-<span class="sourceLineNo">1655</span><a name="line.1655"></a>
-<span class="sourceLineNo">1656</span>    // TODO: quick-start for meta and the other sys-tables?<a name="line.1656"></a>
-<span class="sourceLineNo">1657</span>    assignQueueLock.lock();<a name="line.1657"></a>
-<span class="sourceLineNo">1658</span>    try {<a name="line.1658"></a>
-<span class="sourceLineNo">1659</span>      pendingAssignQueue.add(regionNode);<a name="line.1659"></a>
-<span class="sourceLineNo">1660</span>      if (regionNode.isSystemTable() ||<a name="line.1660"></a>
-<span class="sourceLineNo">1661</span>          pendingAssignQueue.size() == 1 ||<a name="line.1661"></a>
-<span class="sourceLineNo">1662</span>          pendingAssignQueue.size() &gt;= assignDispatchWaitQueueMaxSize) {<a name="line.1662"></a>
-<span class="sourceLineNo">1663</span>        assignQueueFullCond.signal();<a name="line.1663"></a>
-<span class="sourceLineNo">1664</span>      }<a name="line.1664"></a>
-<span class="sourceLineNo">1665</span>    } finally {<a name="line.1665"></a>
-<span class="sourceLineNo">1666</span>      assignQueueLock.unlock();<a name="line.1666"></a>
-<span class="sourceLineNo">1667</span>    }<a name="line.1667"></a>
-<span class="sourceLineNo">1668</span>  }<a name="line.1668"></a>
-<span class="sourceLineNo">1669</span><a name="line.1669"></a>
-<span class="sourceLineNo">1670</span>  private void startAssignmentThread() {<a name="line.1670"></a>
-<span class="sourceLineNo">1671</span>    // Get Server Thread name. Sometimes the Server is mocked so may not implement HasThread.<a name="line.1671"></a>
-<span class="sourceLineNo">1672</span>    // For example, in tests.<a name="line.1672"></a>
-<span class="sourceLineNo">1673</span>    String name = master instanceof HasThread? ((HasThread)master).getName():<a name="line.1673"></a>
-<span class="sourceLineNo">1674</span>        master.getServerName().toShortString();<a name="line.1674"></a>
-<span class="sourceLineNo">1675</span>    assignThread = new Thread(name) {<a name="line.1675"></a>
-<span class="sourceLineNo">1676</span>      @Override<a name="line.1676"></a>
-<span class="sourceLineNo">1677</span>      public void run() {<a name="line.1677"></a>
-<span class="sourceLineNo">1678</span>        while (isRunning()) {<a name="line.1678"></a>
-<span class="sourceLineNo">1679</span>          processAssignQueue();<a name="line.1679"></a>
-<span class="sourceLineNo">1680</span>        }<a name="line.1680"></a>
-<span class="sourceLineNo">1681</span>        pendingAssignQueue.clear();<a name="line.1681"></a>
-<span class="sourceLineNo">1682</span>      }<a name="line.1682"></a>
-<span class="sourceLineNo">1683</span>    };<a name="line.1683"></a>
-<span class="sourceLineNo">1684</span>    assignThread.setDaemon(true);<a name="line.1684"></a>
-<span class="sourceLineNo">1685</span>    assignThread.start();<a name="line.1685"></a>
-<span class="sourceLineNo">1686</span>  }<a name="line.1686"></a>
-<span class="sourceLineNo">1687</span><a name="line.1687"></a>
-<span class="sourceLineNo">1688</span>  private void stopAssignmentThread() {<a name="line.1688"></a>
-<span class="sourceLineNo">1689</span>    assignQueueSignal();<a name="line.1689"></a>
-<span class="sourceLineNo">1690</span>    try {<a name="line.1690"></a>
-<span class="sourceLineNo">1691</span>      while (assignThread.isAlive()) {<a name="line.1691"></a>
-<span class="sourceLineNo">1692</span>        assignQueueSignal();<a name="line.1692"></a>
-<span class="sourceLineNo">1693</span>        assignThread.join(250);<a name="line.1693"></a>
-<span class="sourceLineNo">1694</span>      }<a name="line.1694"></a>
-<span class="sourceLineNo">1695</span>    } catch (InterruptedException e) {<a name="line.1695"></a>
-<span class="sourceLineNo">1696</span>      LOG.warn("join interrupted", e);<a name="line.1696"></a>
-<span class="sourceLineNo">1697</span>      Thread.currentThread().interrupt();<a name="line.1697"></a>
-<span class="sourceLineNo">1698</span>    }<a name="line.1698"></a>
-<span class="sourceLineNo">1699</span>  }<a name="line.1699"></a>
-<span class="sourceLineNo">1700</span><a name="line.1700"></a>
-<span class="sourceLineNo">1701</span>  private void assignQueueSignal() {<a name="line.1701"></a>
-<span class="sourceLineNo">1702</span>    assignQueueLock.lock();<a name="line.1702"></a>
-<span class="sourceLineNo">1703</span>    try {<a name="line.1703"></a>
-<span class="sourceLineNo">1704</span>      assignQueueFullCond.signal();<a name="line.1704"></a>
-<span class="sourceLineNo">1705</span>    } finally {<a name="line.1705"></a>
-<span class="sourceLineNo">1706</span>      assignQueueLock.unlock();<a name="line.1706"></a>
-<span class="sourceLineNo">1707</span>    }<a name="line.1707"></a>
-<span class="sourceLineNo">1708</span>  }<a name="line.1708"></a>
-<span class="sourceLineNo">1709</span><a name="line.1709"></a>
-<span class="sourceLineNo">1710</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings("WA_AWAIT_NOT_IN_LOOP")<a name="line.1710"></a>
-<span class="sourceLineNo">1711</span>  private HashMap&lt;RegionInfo, RegionStateNode&gt; waitOnAssignQueue() {<a name="line.1711"></a>
-<span class="sourceLineNo">1712</span>    HashMap&lt;RegionInfo, RegionStateNode&gt; regions = null;<a name="line.1712"></a>
-<span class="sourceLineNo">1713</span><a name="line.1713"></a>
-<span class="sourceLineNo">1714</span>    assignQueueLock.lock();<a name="line.1714"></a>
-<span class="sourceLineNo">1715</span>    try {<a name="line.1715"></a>
-<span class="sourceLineNo">1716</span>      if (pendingAssignQueue.isEmpty() &amp;&amp; isRunning()) {<a name="line.1716"></a>
-<span class="sourceLineNo">1717</span>        assignQueueFullCond.await();<a name="line.1717"></a>
-<span class="sourceLineNo">1718</span>      }<a name="line.1718"></a>
+<span class="sourceLineNo">1336</span>    boolean meta = isMetaRegion(hri);<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    boolean metaLoaded = isMetaLoaded();<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>    if (!meta &amp;&amp; !metaLoaded) {<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>      throw new PleaseHoldException(<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>        "Master not fully online; hbase:meta=" + meta + ", metaLoaded=" + metaLoaded);<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>    }<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>  }<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span><a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>  // ============================================================================================<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>  //  TODO: Metrics<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>  // ============================================================================================<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>  public int getNumRegionsOpened() {<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    // TODO: Used by TestRegionPlacement.java and assume monotonically increasing value<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>    return 0;<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>  }<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span><a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>  public long submitServerCrash(ServerName serverName, boolean shouldSplitWal) {<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>    boolean carryingMeta;<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>    long pid;<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    ServerStateNode serverNode = regionStates.getServerNode(serverName);<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>    if(serverNode == null){<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>      LOG.info("Skip to add SCP for {} since this server should be OFFLINE already", serverName);<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>      return -1;<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    }<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    // we hold the write lock here for fencing on reportRegionStateTransition. Once we set the<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>    // server state to CRASHED, we will no longer accept the reportRegionStateTransition call from<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>    // this server. This is used to simplify the implementation for TRSP and SCP, where we can make<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>    // sure that, the region list fetched by SCP will not be changed any more.<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>    serverNode.writeLock().lock();<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    try {<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>      ProcedureExecutor&lt;MasterProcedureEnv&gt; procExec = this.master.getMasterProcedureExecutor();<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>      carryingMeta = isCarryingMeta(serverName);<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>      if (!serverNode.isInState(ServerState.ONLINE)) {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>        LOG.info(<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>          "Skip to add SCP for {} with meta= {}, " +<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>              "since there should be a SCP is processing or already done for this server node",<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>          serverName, carryingMeta);<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>        return -1;<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>      } else {<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>        serverNode.setState(ServerState.CRASHED);<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>        pid = procExec.submitProcedure(new ServerCrashProcedure(procExec.getEnvironment(),<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>            serverName, shouldSplitWal, carryingMeta));<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>        LOG.info(<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>          "Added {} to dead servers which carryingMeta={}, submitted ServerCrashProcedure pid={}",<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>          serverName, carryingMeta, pid);<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>      }<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>    } finally {<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>      serverNode.writeLock().unlock();<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>    }<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>    return pid;<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>  }<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span><a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>  public void offlineRegion(final RegionInfo regionInfo) {<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>    // TODO used by MasterRpcServices<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>    RegionStateNode node = regionStates.getRegionStateNode(regionInfo);<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>    if (node != null) {<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>      node.offline();<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>    }<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>  }<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span><a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>  public void onlineRegion(final RegionInfo regionInfo, final ServerName serverName) {<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>    // TODO used by TestSplitTransactionOnCluster.java<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span>  }<a name="line.1398"></a>
+<span class="sourceLineNo">1399</span><a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; getSnapShotOfAssignment(<a name="line.1400"></a>
+<span class="sourceLineNo">1401</span>      final Collection&lt;RegionInfo&gt; regions) {<a name="line.1401"></a>
+<span class="sourceLineNo">1402</span>    return regionStates.getSnapShotOfAssignment(regions);<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>  }<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span><a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>  // ============================================================================================<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>  //  TODO: UTILS/HELPERS?<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>  // ============================================================================================<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>  /**<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>   * Used by the client (via master) to identify if all regions have the schema updates<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>   *<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>   * @param tableName<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>   * @return Pair indicating the status of the alter command (pending/total)<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>   * @throws IOException<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>   */<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>  public Pair&lt;Integer, Integer&gt; getReopenStatus(TableName tableName) {<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>    if (isTableDisabled(tableName)) return new Pair&lt;Integer, Integer&gt;(0, 0);<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span><a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>    final List&lt;RegionState&gt; states = regionStates.getTableRegionStates(tableName);<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>    int ritCount = 0;<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span>    for (RegionState regionState: states) {<a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>      if (!regionState.isOpened() &amp;&amp; !regionState.isSplit()) {<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>        ritCount++;<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>      }<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span>    }<a name="line.1424"></a>
+<span class="sourceLineNo">1425</span>    return new Pair&lt;Integer, Integer&gt;(ritCount, states.size());<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>  }<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span><a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>  // ============================================================================================<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>  //  TODO: Region State In Transition<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span>  // ============================================================================================<a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>  public boolean hasRegionsInTransition() {<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>    return regionStates.hasRegionsInTransition();<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span>  }<a name="line.1433"></a>
+<span class="sourceLineNo">1434</span><a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>  public List&lt;RegionStateNode&gt; getRegionsInTransition() {<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span>    return regionStates.getRegionsInTransition();<a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>  }<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span><a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>  public List&lt;RegionInfo&gt; getAssignedRegions() {<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>    return regionStates.getAssignedRegions();<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>  }<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span><a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>  public RegionInfo getRegionInfo(final byte[] regionName) {<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>    final RegionStateNode regionState = regionStates.getRegionStateNodeFromName(regionName);<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>    return regionState != null ? regionState.getRegionInfo() : null;<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span>  }<a name="line.1446"></a>
+<span class="sourceLineNo">1447</span><a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>  // ============================================================================================<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>  //  Expected states on region state transition.<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span>  //  Notice that there is expected states for transiting to OPENING state, this is because SCP.<a name="line.1450"></a>
+<span class="sourceLineNo">1451</span>  //  See the comments in regionOpening method for more details.<a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>  // ============================================================================================<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>  private static final State[] STATES_EXPECTED_ON_OPEN = {<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>    State.OPENING, // Normal case<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>    State.OPEN // Retrying<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>  };<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span><a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>  private static final State[] STATES_EXPECTED_ON_CLOSING = {<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>    State.OPEN, // Normal case<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>    State.CLOSING, // Retrying<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>    State.SPLITTING, // Offline the split parent<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>    State.MERGING // Offline the merge parents<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>  };<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span><a name="line.1464"></a>
+<span class="sourceLineNo">1465</span>  private static final State[] STATES_EXPECTED_ON_CLOSED = {<a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>    State.CLOSING, // Normal case<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>    State.CLOSED // Retrying<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>  };<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span><a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>  // This is for manually scheduled region assign, can add other states later if we find out other<a name="line.1470"></a>
+<span class="sourceLineNo">1471</span>  // usages<a name="line.1471"></a>
+<span class="sourceLineNo">1472</span>  private static final State[] STATES_EXPECTED_ON_ASSIGN = { State.CLOSED, State.OFFLINE };<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span><a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>  // We only allow unassign or move a region which is in OPEN state.<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span>  private static final State[] STATES_EXPECTED_ON_UNASSIGN_OR_MOVE = { State.OPEN };<a name="line.1475"></a>
+<span class="sourceLineNo">1476</span><a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>  // ============================================================================================<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>  //  Region Status update<a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>  //  Should only be called in TransitRegionStateProcedure<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span>  // ============================================================================================<a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>  private void transitStateAndUpdate(RegionStateNode regionNode, RegionState.State newState,<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>      RegionState.State... expectedStates) throws IOException {<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>    RegionState.State state = regionNode.getState();<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>    regionNode.transitionState(newState, expectedStates);<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>    boolean succ = false;<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span>    try {<a name="line.1486"></a>
+<span class="sourceLineNo">1487</span>      regionStateStore.updateRegionLocation(regionNode);<a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>      succ = true;<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>    } finally {<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>      if (!succ) {<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>        // revert<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span>        regionNode.setState(state);<a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>      }<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>    }<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>  }<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span><a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>  // should be called within the synchronized block of RegionStateNode<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>  void regionOpening(RegionStateNode regionNode) throws IOException {<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>    // As in SCP, for performance reason, there is no TRSP attached with this region, we will not<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>    // update the region state, which means that the region could be in any state when we want to<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span>    // assign it after a RS crash. So here we do not pass the expectedStates parameter.<a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>    transitStateAndUpdate(regionNode, State.OPENING);<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span>    regionStates.addRegionToServer(regionNode);<a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>    // update the operation count metrics<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>    metrics.incrementOperationCounter();<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span>  }<a name="line.1506"></a>
+<span class="sourceLineNo">1507</span><a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>  // should be called within the synchronized block of RegionStateNode.<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span>  // The parameter 'giveUp' means whether we will try to open the region again, if it is true, then<a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>  // we will persist the FAILED_OPEN state into hbase:meta.<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>  void regionFailedOpen(RegionStateNode regionNode, boolean giveUp) throws IOException {<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>    RegionState.State state = regionNode.getState();<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span>    ServerName regionLocation = regionNode.getRegionLocation();<a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>    if (giveUp) {<a name="line.1514"></a>
+<span class="sourceLineNo">1515</span>      regionNode.setState(State.FAILED_OPEN);<a name="line.1515"></a>
+<span class="sourceLineNo">1516</span>      regionNode.setRegionLocation(null);<a name="line.1516"></a>
+<span class="sourceLineNo">1517</span>      boolean succ = false;<a name="line.1517"></a>
+<span class="sourceLineNo">1518</span>      try {<a name="line.1518"></a>
+<span class="sourceLineNo">1519</span>        regionStateStore.updateRegionLocation(regionNode);<a name="line.1519"></a>
+<span class="sourceLineNo">1520</span>        succ = true;<a name="line.1520"></a>
+<span class="sourceLineNo">1521</span>      } finally {<a name="line.1521"></a>
+<span class="sourceLineNo">1522</span>        if (!succ) {<a name="line.1522"></a>
+<span class="sourceLineNo">1523</span>          // revert<a name="line.1523"></a>
+<span class="sourceLineNo">1524</span>          regionNode.setState(state);<a name="line.1524"></a>
+<span class="sourceLineNo">1525</span>          regionNode.setRegionLocation(regionLocation);<a name="line.1525"></a>
+<span class="sourceLineNo">1526</span>        }<a name="line.1526"></a>
+<span class="sourceLineNo">1527</span>      }<a name="line.1527"></a>
+<span class="sourceLineNo">1528</span>    }<a name="line.1528"></a>
+<span class="sourceLineNo">1529</span>    if (regionLocation != null) {<a name="line.1529"></a>
+<span class="sourceLineNo">1530</span>      regionStates.removeRegionFromServer(regionLocation, regionNode);<a name="line.1530"></a>
+<span class="sourceLineNo">1531</span>    }<a name="line.1531"></a>
+<span class="sourceLineNo">1532</span>  }<a name="line.1532"></a>
+<span class="sourceLineNo">1533</span><a name="line.1533"></a>
+<span class="sourceLineNo">1534</span>  // should be called within the synchronized block of RegionStateNode<a name="line.1534"></a>
+<span class="sourceLineNo">1535</span>  void regionOpened(RegionStateNode regionNode) throws IOException {<a name="line.1535"></a>
+<span class="sourceLineNo">1536</span>    // TODO: OPENING Updates hbase:meta too... we need to do both here and there?<a name="line.1536"></a>
+<span class="sourceLineNo">1537</span>    // That is a lot of hbase:meta writing.<a name="line.1537"></a>
+<span class="sourceLineNo">1538</span>    transitStateAndUpdate(regionNode, State.OPEN, STATES_EXPECTED_ON_OPEN);<a name="line.1538"></a>
+<span class="sourceLineNo">1539</span>    RegionInfo hri = regionNode.getRegionInfo();<a name="line.1539"></a>
+<span class="sourceLineNo">1540</span>    if (isMetaRegion(hri)) {<a name="line.1540"></a>
+<span class="sourceLineNo">1541</span>      // Usually we'd set a table ENABLED at this stage but hbase:meta is ALWAYs enabled, it<a name="line.1541"></a>
+<span class="sourceLineNo">1542</span>      // can't be disabled -- so skip the RPC (besides... enabled is managed by TableStateManager<a name="line.1542"></a>
+<span class="sourceLineNo">1543</span>      // which is backed by hbase:meta... Avoid setting ENABLED to avoid having to update state<a name="line.1543"></a>
+<span class="sourceLineNo">1544</span>      // on table that contains state.<a name="line.1544"></a>
+<span class="sourceLineNo">1545</span>      setMetaAssigned(hri, true);<a name="line.1545"></a>
+<span class="sourceLineNo">1546</span>    }<a name="line.1546"></a>
+<span class="sourceLineNo">1547</span>    regionStates.addRegionToServer(regionNode);<a name="line.1547"></a>
+<span class="sourceLineNo">1548</span>    regionStates.removeFromFailedOpen(hri);<a name="line.1548"></a>
+<span class="sourceLineNo">1549</span>  }<a name="line.1549"></a>
+<span class="sourceLineNo">1550</span><a name="line.1550"></a>
+<span class="sourceLineNo">1551</span>  // should be called within the synchronized block of RegionStateNode<a name="line.1551"></a>
+<span class="sourceLineNo">1552</span>  void regionClosing(RegionStateNode regionNode) throws IOException {<a name="line.1552"></a>
+<span class="sourceLineNo">1553</span>    transitStateAndUpdate(regionNode, State.CLOSING, STATES_EXPECTED_ON_CLOSING);<a name="line.1553"></a>
+<span class="sourceLineNo">1554</span><a name="line.1554"></a>
+<span class="sourceLineNo">1555</span>    RegionInfo hri = regionNode.getRegionInfo();<a name="line.1555"></a>
+<span class="sourceLineNo">1556</span>    // Set meta has not initialized early. so people trying to create/edit tables will wait<a name="line.1556"></a>
+<span class="sourceLineNo">1557</span>    if (isMetaRegion(hri)) {<a name="line.1557"></a>
+<span class="sourceLineNo">1558</span>      setMetaAssigned(hri, false);<a name="line.1558"></a>
+<span class="sourceLineNo">1559</span>    }<a name="line.1559"></a>
+<span class="sourceLineNo">1560</span>    regionStates.addRegionToServer(regionNode);<a name="line.1560"></a>
+<span class="sourceLineNo">1561</span>    // update the operation count metrics<a name="line.1561"></a>
+<span class="sourceLineNo">1562</span>    metrics.incrementOperationCounter();<a name="line.1562"></a>
+<span class="sourceLineNo">1563</span>  }<a name="line.1563"></a>
+<span class="sourceLineNo">1564</span><a name="line.1564"></a>
+<span class="sourceLineNo">1565</span>  // should be called within the synchronized block of RegionStateNode<a name="line.1565"></a>
+<span class="sourceLineNo">1566</span>  // The parameter 'normally' means whether we are closed cleanly, if it is true, then it means that<a name="line.1566"></a>
+<span class="sourceLineNo">1567</span>  // we are closed due to a RS crash.<a name="line.1567"></a>
+<span class="sourceLineNo">1568</span>  void regionClosed(RegionStateNode regionNode, boolean normally) throws IOException {<a name="line.1568"></a>
+<span class="sourceLineNo">1569</span>    RegionState.State state = regionNode.getState();<a name="line.1569"></a>
+<span class="sourceLineNo">1570</span>    ServerName regionLocation = regionNode.getRegionLocation();<a name="line.1570"></a>
+<span class="sourceLineNo">1571</span>    if (normally) {<a name="line.1571"></a>
+<span class="sourceLineNo">1572</span>      regionNode.transitionState(State.CLOSED, STATES_EXPECTED_ON_CLOSED);<a name="line.1572"></a>
+<span class="sourceLineNo">1573</span>    } else {<a name="line.1573"></a>
+<span class="sourceLineNo">1574</span>      // For SCP<a name="line.1574"></a>
+<span class="sourceLineNo">1575</span>      regionNode.transitionState(State.ABNORMALLY_CLOSED);<a name="line.1575"></a>
+<span class="sourceLineNo">1576</span>    }<a name="line.1576"></a>
+<span class="sourceLineNo">1577</span>    regionNode.setRegionLocation(null);<a name="line.1577"></a>
+<span class="sourceLineNo">1578</span>    boolean succ = false;<a name="line.1578"></a>
+<span class="sourceLineNo">1579</span>    try {<a name="line.1579"></a>
+<span class="sourceLineNo">1580</span>      regionStateStore.updateRegionLocation(regionNode);<a name="line.1580"></a>
+<span class="sourceLineNo">1581</span>      succ = true;<a name="line.1581"></a>
+<span class="sourceLineNo">1582</span>    } finally {<a name="line.1582"></a>
+<span class="sourceLineNo">1583</span>      if (!succ) {<a name="line.1583"></a>
+<span class="sourceLineNo">1584</span>        // revert<a name="line.1584"></a>
+<span class="sourceLineNo">1585</span>        regionNode.setState(state);<a name="line.1585"></a>
+<span class="sourceLineNo">1586</span>        regionNode.setRegionLocation(regionLocation);<a name="line.1586"></a>
+<span class="sourceLineNo">1587</span>      }<a name="line.1587"></a>
+<span class="sourceLineNo">1588</span>    }<a name="line.1588"></a>
+<span class="sourceLineNo">1589</span>    if (regionLocation != null) {<a name="line.1589"></a>
+<span class="sourceLineNo">1590</span>      regionNode.setLastHost(regionLocation);<a name="line.1590"></a>
+<span class="sourceLineNo">1591</span>      regionStates.removeRegionFromServer(regionLocation, regionNode);<a name="line.1591"></a>
+<span class="sourceLineNo">1592</span>    }<a name="line.1592"></a>
+<span class="sourceLineNo">1593</span>  }<a name="line.1593"></a>
+<span class="sourceLineNo">1594</span><a name="line.1594"></a>
+<span class="sourceLineNo">1595</span>  public void markRegionAsSplit(final RegionInfo parent, final ServerName serverName,<a name="line.1595"></a>
+<span class="sourceLineNo">1596</span>      final RegionInfo daughterA, final RegionInfo daughterB) throws IOException {<a name="line.1596"></a>
+<span class="sourceLineNo">1597</span>    // Update hbase:meta. Parent will be marked offline and split up in hbase:meta.<a name="line.1597"></a>
+<span class="sourceLineNo">1598</span>    // The parent stays in regionStates until cleared when removed by CatalogJanitor.<a name="line.1598"></a>
+<span class="sourceLineNo">1599</span>    // Update its state in regionStates to it shows as offline and split when read<a name="line.1599"></a>
+<span class="sourceLineNo">1600</span>    // later figuring what regions are in a table and what are not: see<a name="line.1600"></a>
+<span class="sourceLineNo">1601</span>    // regionStates#getRegionsOfTable<a name="line.1601"></a>
+<span class="sourceLineNo">1602</span>    final RegionStateNode node = regionStates.getOrCreateRegionStateNode(parent);<a name="line.1602"></a>
+<span class="sourceLineNo">1603</span>    node.setState(State.SPLIT);<a name="line.1603"></a>
+<span class="sourceLineNo">1604</span>    final RegionStateNode nodeA = regionStates.getOrCreateRegionStateNode(daughterA);<a name="line.1604"></a>
+<span class="sourceLineNo">1605</span>    nodeA.setState(State.SPLITTING_NEW);<a name="line.1605"></a>
+<span class="sourceLineNo">1606</span>    final RegionStateNode nodeB = regionStates.getOrCreateRegionStateNode(daughterB);<a name="line.1606"></a>
+<span class="sourceLineNo">1607</span>    nodeB.setState(State.SPLITTING_NEW);<a name="line.1607"></a>
+<span class="sourceLineNo">1608</span><a name="line.1608"></a>
+<span class="sourceLineNo">1609</span>    regionStateStore.splitRegion(parent, daughterA, daughterB, serverName);<a name="line.1609"></a>
+<span class="sourceLineNo">1610</span>    if (shouldAssignFavoredNodes(parent)) {<a name="line.1610"></a>
+<span class="sourceLineNo">1611</span>      List&lt;ServerName&gt; onlineServers = this.master.getServerManager().getOnlineServersList();<a name="line.1611"></a>
+<span class="sourceLineNo">1612</span>      ((FavoredNodesPromoter)getBalancer()).<a name="line.1612"></a>
+<span class="sourceLineNo">1613</span>          generateFavoredNodesForDaughter(onlineServers, parent, daughterA, daughterB);<a name="line.1613"></a>
+<span class="sourceLineNo">1614</span>    }<a name="line.1614"></a>
+<span class="sourceLineNo">1615</span>  }<a name="line.1615"></a>
+<span class="sourceLineNo">1616</span><a name="line.1616"></a>
+<span class="sourceLineNo">1617</span>  /**<a name="line.1617"></a>
+<span class="sourceLineNo">1618</span>   * When called here, the merge has happened. The two merged regions have been<a name="line.1618"></a>
+<span class="sourceLineNo">1619</span>   * unassigned and the above markRegionClosed has been called on each so they have been<a name="line.1619"></a>
+<span class="sourceLineNo">1620</span>   * disassociated from a hosting Server. The merged region will be open after this call. The<a name="line.1620"></a>
+<span class="sourceLineNo">1621</span>   * merged regions are removed from hbase:meta below&gt; Later they are deleted from the filesystem<a name="line.1621"></a>
+<span class="sourceLineNo">1622</span>   * by the catalog janitor running against hbase:meta. It notices when the merged region no<a name="line.1622"></a>
+<span class="sourceLineNo">1623</span>   * longer holds references to the old regions.<a name="line.1623"></a>
+<span class="sourceLineNo">1624</span>   */<a name="line.1624"></a>
+<span class="sourceLineNo">1625</span>  public void markRegionAsMerged(final RegionInfo child, final ServerName serverName,<a name="line.1625"></a>
+<span class="sourceLineNo">1626</span>      final RegionInfo mother, final RegionInfo father) throws IOException {<a name="line.1626"></a>
+<span class="sourceLineNo">1627</span>    final RegionStateNode node = regionStates.getOrCreateRegionStateNode(child);<a name="line.1627"></a>
+<span class="sourceLineNo">1628</span>    node.setState(State.MERGED);<a name="line.1628"></a>
+<span class="sourceLineNo">1629</span>    regionStates.deleteRegion(mother);<a name="line.1629"></a>
+<span class="sourceLineNo">1630</span>    regionStates.deleteRegion(father);<a name="line.1630"></a>
+<span class="sourceLineNo">1631</span>    regionStateStore.mergeRegions(child, mother, father, serverName);<a name="line.1631"></a>
+<span class="sourceLineNo">1632</span>    if (shouldAssignFavoredNodes(child)) {<a name="line.1632"></a>
+<span class="sourceLineNo">1633</span>      ((FavoredNodesPromoter)getBalancer()).<a name="line.1633"></a>
+<span class="sourceLineNo">1634</span>        generateFavoredNodesForMergedRegion(child, mother, father);<a name="line.1634"></a>
+<span class="sourceLineNo">1635</span>    }<a name="line.1635"></a>
+<span class="sourceLineNo">1636</span>  }<a name="line.1636"></a>
+<span class="sourceLineNo">1637</span><a name="line.1637"></a>
+<span class="sourceLineNo">1638</span>  /*<a name="line.1638"></a>
+<span class="sourceLineNo">1639</span>   * Favored nodes should be applied only when FavoredNodes balancer is configured and the region<a name="line.1639"></a>
+<span class="sourceLineNo">1640</span>   * belongs to a non-system table.<a name="line.1640"></a>
+<span class="sourceLineNo">1641</span>   */<a name="line.1641"></a>
+<span class="sourceLineNo">1642</span>  private boolean shouldAssignFavoredNodes(RegionInfo region) {<a name="line.1642"></a>
+<span class="sourceLineNo">1643</span>    return this.shouldAssignRegionsWithFavoredNodes &amp;&amp;<a name="line.1643"></a>
+<span class="sourceLineNo">1644</span>        FavoredNodesManager.isFavoredNodeApplicable(region);<a name="line.1644"></a>
+<span class="sourceLineNo">1645</span>  }<a name="line.1645"></a>
+<span class="sourceLineNo">1646</span><a name="line.1646"></a>
+<span class="sourceLineNo">1647</span>  // ============================================================================================<a name="line.1647"></a>
+<span class="sourceLineNo">1648</span>  //  Assign Queue (Assign/Balance)<a name="line.1648"></a>
+<span class="sourceLineNo">1649</span>  // ============================================================================================<a name="line.1649"></a>
+<span class="sourceLineNo">1650</span>  private final ArrayList&lt;RegionStateNode&gt; pendingAssignQueue = new ArrayList&lt;RegionStateNode&gt;();<a name="line.1650"></a>
+<span class="sourceLineNo">1651</span>  private final ReentrantLock assignQueueLock = new ReentrantLock();<a name="line.1651"></a>
+<span class="sourceLineNo">1652</span>  private final Condition assignQueueFullCond = assignQueueLock.newCondition();<a name="line.1652"></a>
+<span class="sourceLineNo">1653</span><a name="line.1653"></a>
+<span class="sourceLineNo">1654</span>  /**<a name="line.1654"></a>
+<span class="sourceLineNo">1655</span>   * Add the assign operation to the assignment queue.<a name="line.1655"></a>
+<span class="sourceLineNo">1656</span>   * The pending assignment operation will be processed,<a name="line.1656"></a>
+<span class="sourceLineNo">1657</span>   * and each region will be assigned by a server using the balancer.<a name="line.1657"></a>
+<span class="sourceLineNo">1658</span>   */<a name="line.1658"></a>
+<span class="sourceLineNo">1659</span>  protected void queueAssign(final RegionStateNode regionNode) {<a name="line.1659"></a>
+<span class="sourceLineNo">1660</span>    regionNode.getProcedureEvent().suspend();<a name="line.1660"></a>
+<span class="sourceLineNo">1661</span><a name="line.1661"></a>
+<span class="sourceLineNo">1662</span>    // TODO: quick-start for meta and the other sys-tables?<a name="line.1662"></a>
+<span class="sourceLineNo">1663</span>    assignQueueLock.lock();<a name="line.1663"></a>
+<span class="sourceLineNo">1664</span>    try {<a name="line.1664"></a>
+<span class="sourceLineNo">1665</span>      pendingAssignQueue.add(regionNode);<a name="line.1665"></a>
+<span class="sourceLineNo">1666</span>      if (regionNode.isSystemTable() ||<a name="line.1666"></a>
+<span class="sourceLineNo">1667</span>          pendingAssignQueue.size() == 1 ||<a name="line.1667"></a>
+<span class="sourceLineNo">1668</span>          pendingAssignQueue.size() &gt;= assignDispatchWaitQueueMaxSize) {<a name="line.1668"></a>
+<span class="sourceLineNo">1669</span>        assignQueueFullCond.signal();<a name="line.1669"></a>
+<span class="sourceLineNo">1670</span>      }<a name="line.1670"></a>
+<span class="sourceLineNo">1671</span>    } finally {<a name="line.1671"></a>
+<span class="sourceLineNo">1672</span>      assignQueueLock.unlock();<a name="line.1672"></a>
+<span class="sourceLineNo">1673</span>    }<a name="line.1673"></a>
+<span class="sourceLineNo">1674</span>  }<a name="line.1674"></a>
+<span class="sourceLineNo">1675</span><a name="line.1675"></a>
+<span class="sourceLineNo">1676</span>  private void startAssignmentThread() {<a name="line.1676"></a>
+<span class="sourceLineNo">1677</span>    // Get Server Thread name. Sometimes the Server is mocked so may not implement HasThread.<a name="line.1677"></a>
+<span class="sourceLineNo">1678</span>    // For example, in tests.<a name="line.1678"></a>
+<span class="sourceLineNo">1679</span>    String name = master instanceof HasThread? ((HasThread)master).getName():<a name="line.1679"></a>
+<span class="sourceLineNo">1680</span>        master.getServerName().toShortString();<a name="line.1680"></a>
+<span class="sourceLineNo">1681</span>    assignThread = new Thread(name) {<a name="line.1681"></a>
+<span class="sourceLineNo">1682</span>      @Override<a name="line.1682"></a>
+<span class="sourceLineNo">1683</span>      public void run() {<a name="line.1683"></a>
+<span class="sourceLineNo">1684</span>        while (isRunning()) {<a name="line.1684"></a>
+<span class="sourceLineNo">1685</span>          processAssignQueue();<a name="line.1685"></a>
+<span class="sourceLineNo">1686</span>        }<a name="line.1686"></a>
+<span class="sourceLineNo">1687</span>        pendingAssignQueue.clear();<a name="line.1687"></a>
+<span class="sourceLineNo">1688</span>      }<a name="line.1688"></a>
+<span class="sourceLineNo">1689</span>    };<a name="line.1689"></a>
+<span class="sourceLineNo">1690</span>    assignThread.setDaemon(true);<a name="line.1690"></a>
+<span class="sourceLineNo">1691</span>    assignThread.start();<a name="line.1691"></a>
+<span class="sourceLineNo">1692</span>  }<a name="line.1692"></a>
+<span class="sourceLineNo">1693</span><a name="line.1693"></a>
+<span class="sourceLineNo">1694</span>  private void stopAssignmentThread() {<a name="line.1694"></a>
+<span class="sourceLineNo">1695</span>    assignQueueSignal();<a name="line.1695"></a>
+<span class="sourceLineNo">1696</span>    try {<a name="line.1696"></a>
+<span class="sourceLineNo">1697</span>      while (assignThread.isAlive()) {<a name="line.1697"></a>
+<span class="sourceLineNo">1698</span>        assignQueueSignal();<a name="line.1698"></a>
+<span class="sourceLineNo">1699</span>        assignThread.join(250);<a name="line.1699"></a>
+<span class="sourceLineNo">1700</span>      }<a name="line.1700"></a>
+<span class="sourceLineNo">1701</span>    } catch (InterruptedException e) {<a name="line.1701"></a>
+<span class="sourceLineNo">1702</span>      LOG.warn("join interrupted", e);<a name="line.1702"></a>
+<span class="sourceLineNo">1703</span>      Thread.currentThread().interrupt();<a name="line.1703"></a>
+<span class="sourceLineNo">1704</span>    }<a name="line.1704"></a>
+<span class="sourceLineNo">1705</span>  }<a name="line.1705"></a>
+<span class="sourceLineNo">1706</span><a name="line.1706"></a>
+<span class="sourceLineNo">1707</span>  private void assignQueueSignal() {<a name="line.1707"></a>
+<span class="sourceLineNo">1708</span>    assignQueueLock.lock();<a name="line.1708"></a>
+<span class="sourceLineNo">1709</span>    try {<a name="line.1709"></a>
+<span class="sourceLineNo">1710</span>      assignQueueFullCond.signal();<a name="line.1710"></a>
+<span class="sourceLineNo">1711</span>    } finally {<a name="line.1711"></a>
+<span class="sourceLineNo">1712</span>      assignQueueLock.unlock();<a name="line.1712"></a>
+<span class="sourceLineNo">1713</span>    }<a name="line.1713"></a>
+<span class="sourceLineNo">1714</span>  }<a name="line.1714"></a>
+<span class="sourceLineNo">1715</span><a name="line.1715"></a>
+<span class="sourceLineNo">1716</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings("WA_AWAIT_NOT_IN_LOOP")<a name="line.1716"></a>
+<span class="sourceLineNo">1717</span>  private HashMap&lt;RegionInfo, RegionStateNode&gt; waitOnAssignQueue() {<a name="line.1717"></a>
+<span class="sourceLineNo">1718</span>    HashMap&lt;RegionInfo, RegionStateNode&gt; regions = null;<a name="line.1718"></a>
 <span class="sourceLineNo">1719</span><a name="line.1719"></a>
-<span class="sourceLineNo">1720</span>      if (!isRunning()) return null;<a name="line.1720"></a>
-<span class="sourceLineNo">1721</span>      assignQueueFullCond.await(assignDispatchWaitMillis, TimeUnit.MILLISECONDS);<a name="line.1721"></a>
-<span class="sourceLineNo">1722</span>      regions = new HashMap&lt;RegionInfo, RegionStateNode&gt;(pendingAssignQueue.size());<a name="line.1722"></a>
-<span class="sourceLineNo">1723</span>      for (RegionStateNode regionNode: pendingAssignQueue) {<a name="line.1723"></a>
-<span class="sourceLineNo">1724</span>        regions.put(regionNode.getRegionInfo(), regionNode);<a name="line.1724"></a>
-<span class="sourceLineNo">1725</span>      }<a name="line.1725"></a>
-<span class="sourceLineNo">1726</span>      pendingAssignQueue.clear();<a name="line.1726"></a>
-<span class="sourceLineNo">1727</span>    } catch (InterruptedException e) {<a name="line.1727"></a>
-<span class="sourceLineNo">1728</span>      LOG.warn("got interrupted ", e);<a name="line.1728"></a>
-<span class="sourceLineNo">1729</span>      Thread.currentThread().interrupt();<a name="line.1729"></a>
-<span class="sourceLineNo">1730</span>    } finally {<a name="line.1730"></a>
-<span class="sourceLineNo">1731</span>      assignQueueLock.unlock();<a name="line.1731"></a>
-<span class="sourceLineNo">1732</span>    }<a name="line.1732"></a>
-<span class="sourceLineNo">1733</span>    return regions;<a name="line.1733"></a>
-<span class="sourceLineNo">1734</span>  }<a name="line.1734"></a>
-<span class="sourceLineNo">1735</span><a name="line.1735"></a>
-<span class="sourceLineNo">1736</span>  private void processAssignQueue() {<a name="line.1736"></a>
-<span class="sourceLineNo">1737</span>    final HashMap&lt;RegionInfo, RegionStateNode&gt; regions = waitOnAssignQueue();<a name="line.1737"></a>
-<span class="sourceLineNo">1738</span>    if (regions == null || regions.size() == 0 || !isRunning()) {<a name="line.1738"></a>
-<span class="sourceLineNo">1739</span>      return;<a name="line.1739"></a>
-<span class="sourceLineNo">1740</span>    }<a name="line.1740"></a>
+<span class="sourceLineNo">1720</span>    assignQueueLock.lock();<a name="line.1720"></a>
+<span class="sourceLineNo">1721</span>    try {<a name="line.1721"></a>
+<span class="sourceLineNo">1722</span>      if (pendingAssignQueue.isEmpty() &amp;&amp; isRunning()) {<a name="line.1722"></a>
+<span class="sourceLineNo">1723</span>        assignQueueFullCond.await();<a name="line.1723"></a>
+<span class="sourceLineNo">1724</span>      }<a name="line.1724"></a>
+<span class="sourceLineNo">1725</span><a name="line.1725"></a>
+<span class="sourceLineNo">1726</span>      if (!isRunning()) return null;<a name="line.1726"></a>
+<span class="sourceLineNo">1727</span>      assignQueueFullCond.await(assignDispatchWaitMillis, TimeUnit.MILLISECONDS);<a name="line.1727"></a>
+<span class="sourceLineNo">1728</span>      regions = new HashMap&lt;RegionInfo, RegionStateNode&gt;(pendingAssignQueue.size());<a name="line.1728"></a>
+<span class="sourceLineNo">1729</span>      for (RegionStateNode regionNode: pendingAssignQueue) {<a name="line.1729"></a>
+<span class="sourceLineNo">1730</span>        regions.put(regionNode.getRegionInfo(), regionNode);<a name="line.1730"></a>
+<span class="sourceLineNo">1731</span>      }<a name="line.1731"></a>
+<span class="sourceLineNo">1732</span>      pendingAssignQueue.clear();<a name="line.1732"></a>
+<span class="sourceLineNo">1733</span>    } catch (InterruptedException e) {<a name="line.1733"></a>
+<span class="sourceLineNo">1734</span>      LOG.warn("got interrupted ", e);<a name="line.1734"></a>
+<span class="sourceLineNo">1735</span>      Thread.currentThread().interrupt();<a name="line.1735"></a>
+<span class="sourceLineNo">1736</span>    } finally {<a name="line.1736"></a>
+<span class="sourceLineNo">1737</span>      assignQueueLock.unlock();<a name="line.1737"></a>
+<span class="sourceLineNo">1738</span>    }<a name="line.1738"></a>
+<span class="sourceLineNo">1739</span>    return regions;<a name="line.1739"></a>
+<span class="sourceLineNo">1740</span>  }<a name="line.1740"></a>
 <span class="sourceLineNo">1741</span><a name="line.1741"></a>
-<span class="sourceLineNo">1742</span>    if (LOG.isTraceEnabled()) {<a name="line.1742"></a>
-<span class="sourceLineNo">1743</span>      LOG.trace("PROCESS ASSIGN QUEUE regionCount=" + regions.size());<a name="line.1743"></a>
-<span class="sourceLineNo">1744</span>    }<a name="line.1744"></a>
-<span class="sourceLineNo">1745</span><a name="line.1745"></a>
-<span class="sourceLineNo">1746</span>    // TODO: Optimize balancer. pass a RegionPlan?<a name="line.1746"></a>
-<span class="sourceLineNo">1747</span>    final HashMap&lt;RegionInfo, ServerName&gt; retainMap = new HashMap&lt;&gt;();<a name="line.1747"></a>
-<span class="sourceLineNo">1748</span>    final List&lt;RegionInfo&gt; userHRIs = new ArrayList&lt;&gt;(regions.size());<a name="line.1748"></a>
-<span class="sourceLineNo">1749</span>    // Regions for system tables requiring reassignment<a name="line.1749"></a>
-<span class="sourceLineNo">1750</span>    final List&lt;RegionInfo&gt; systemHRIs = new ArrayList&lt;&gt;();<a name="line.1750"></a>
-<span class="sourceLineNo">1751</span>    for (RegionStateNode regionStateNode: regions.values()) {<a name="line.1751"></a>
-<span class="sourceLineNo">1752</span>      boolean sysTable = regionStateNode.isSystemTable();<a name="line.1752"></a>
-<span class="sourceLineNo">1753</span>      final List&lt;RegionInfo&gt; hris = sysTable? systemHRIs: userHRIs;<a name="line.1753"></a>
-<span class="sourceLineNo">1754</span>      if (regionStateNode.getRegionLocation() != null) {<a name="line.1754"></a>
-<span class="sourceLineNo">1755</span>        retainMap.put(regionStateNode.getRegionInfo(), regionStateNode.getRegionLocation());<a name="line.1755"></a>
-<span class="sourceLineNo">1756</span>      } else {<a name="line.1756"></a>
-<span class="sourceLineNo">1757</span>        hris.add(regionStateNode.getRegionInfo());<a name="line.1757"></a>
-<span class="sourceLineNo">1758</span>      }<a name="line.1758"></a>
-<span class="sourceLineNo">1759</span>    }<a name="line.1759"></a>
-<span class="sourceLineNo">1760</span><a name="line.1760"></a>
-<span class="sourceLineNo">1761</span>    // TODO: connect with the listener to invalidate the cache<a name="line.1761"></a>
-<span class="sourceLineNo">1762</span><a name="line.1762"></a>
-<span class="sourceLineNo">1763</span>    // TODO use events<a name="line.1763"></a>
-<span class="sourceLineNo">1764</span>    List&lt;ServerName&gt; servers = master.getServerManager().createDestinationServersList();<a name="line.1764"></a>
-<span class="sourceLineNo">1765</span>    for (int i = 0; servers.size() &lt; 1; ++i) {<a name="line.1765"></a>
-<span class="sourceLineNo">1766</span>      // Report every fourth time around this loop; try not to flood log.<a name="line.1766"></a>
-<span class="sourceLineNo">1767</span>      if (i % 4 == 0) {<a name="line.1767"></a>
-<span class="sourceLineNo">1768</span>        LOG.warn("No servers available; cannot place " + regions.size() + " unassigned regions.");<a name="line.1768"></a>
-<span class="sourceLineNo">1769</span>      }<a name="line.1769"></a>
-<span class="sourceLineNo">1770</span><a name="line.1770"></a>
-<span class="sourceLineNo">1771</span>      if (!isRunning()) {<a name="line.1771"></a>
-<span class="sourceLineNo">1772</span>        LOG.debug("Stopped! Dropping assign of " + regions.size() + " queued regions.");<a name="line.1772"></a>
-<span class="sourceLineNo">1773</span>        return;<a name="line.1773"></a>
-<span class="sourceLineNo">1774</span>      }<a name="line.1774"></a>
-<span class="sourceLineNo">1775</span>      Threads.sleep(250);<a name="line.1775"></a>
-<span class="sourceLineNo">1776</span>      servers = master.getServerManager().createDestinationServersList();<a name="line.1776"></a>
-<span class="sourceLineNo">1777</span>    }<a name="line.1777"></a>
-<span class="sourceLineNo">1778</span><a name="line.1778"></a>
-<span class="sourceLineNo">1779</span>    if (!systemHRIs.isEmpty()) {<a name="line.1779"></a>
-<span class="sourceLineNo">1780</span>      // System table regions requiring reassignment are present, get region servers<a name="line.1780"></a>
-<span class="sourceLineNo">1781</span>      // not available for system table regions<a name="line.1781"></a>
-<span class="sourceLineNo">1782</span>      final List&lt;ServerName&gt; excludeServers = getExcludedServersForSystemTable();<a name="line.1782"></a>
-<span class="sourceLineNo">1783</span>      List&lt;ServerName&gt; serversForSysTables = servers.stream()<a name="line.1783"></a>
-<span class="sourceLineNo">1784</span>          .filter(s -&gt; !excludeServers.contains(s)).collect(Collectors.toList());<a name="line.1784"></a>
-<span class="sourceLineNo">1785</span>      if (serversForSysTables.isEmpty()) {<a name="line.1785"></a>
-<span class="sourceLineNo">1786</span>        LOG.warn("Filtering old server versions and the excluded produced an empty set; " +<a name="line.1786"></a>
-<span class="sourceLineNo">1787</span>            "instead considering all candidate servers!");<a name="line.1787"></a>
-<span class="sourceLineNo">1788</span>      }<a name="line.1788"></a>
-<span class="sourceLineNo">1789</span>      LOG.debug("Processing assignQueue; systemServersCount=" + serversForSysTables.size() +<a name="line.1789"></a>
-<span class="sourceLineNo">1790</span>          ", allServersCount=" + servers.size());<a name="line.1790"></a>
-<span class="sourceLineNo">1791</span>      processAssignmentPlans(regions, null, systemHRIs,<a name="line.1791"></a>
-<span class="sourceLineNo">1792</span>          serversForSysTables.isEmpty()? servers: serversForSysTables);<a name="line.1792"></a>
-<span class="sourceLineNo">1793</span>    }<a name="line.1793"></a>
-<span class="sourceLineNo">1794</span><a name="line.1794"></a>
-<span class="sourceLineNo">1795</span>    processAssignmentPlans(regions, retainMap, userHRIs, servers);<a name="line.1795"></a>
-<span class="sourceLineNo">1796</span>  }<a name="line.1796"></a>
-<span class="sourceLineNo">1797</span><a name="line.1797"></a>
-<span class="sourceLineNo">1798</span>  private void processAssignmentPlans(final HashMap&lt;RegionInfo, RegionStateNode&gt; regions,<a name="line.1798"></a>
-<span class="sourceLineNo">1799</span>      final HashMap&lt;RegionInfo, ServerName&gt; retainMap, final List&lt;RegionInfo&gt; hris,<a name="line.1799"></a>
-<span class="sourceLineNo">1800</span>      final List&lt;ServerName&gt; servers) {<a name="line.1800"></a>
-<span class="sourceLineNo">1801</span>    boolean isTraceEnabled = LOG.isTraceEnabled();<a name="line.1801"></a>
-<span class="sourceLineNo">1802</span>    if (isTraceEnabled) {<a name="line.1802"></a>
-<span class="sourceLineNo">1803</span>      LOG.trace("Available servers count=" + servers.size() + ": " + servers);<a name="line.1803"></a>
-<span class="sourceLineNo">1804</span>    }<a name="line.1804"></a>
-<span class="sourceLineNo">1805</span><a name="line.1805"></a>
-<span class="sourceLineNo">1806</span>    final LoadBalancer balancer = getBalancer();<a name="line.1806"></a>
-<span class="sourceLineNo">1807</span>    // ask the balancer where to place regions<a name="line.1807"></a>
-<span class="sourceLineNo">1808</span>    if (retainMap != null &amp;&amp; !retainMap.isEmpty()) {<a name="line.1808"></a>
-<span class="sourceLineNo">1809</span>      if (isTraceEnabled) {<a name="line.1809"></a>
-<span class="sourceLineNo">1810</span>        LOG.trace("retain assign regions=" + retainMap);<a name="line.1810"></a>
-<span class="sourceLineNo">1811</span>      }<a name="line.1811"></a>
-<span class="sourceLineNo">1812</span>      try {<a name="line.1812"></a>
-<span class="sourceLineNo">1813</span>        acceptPlan(regions, balancer.retainAssignment(retainMap, servers));<a name="line.1813"></a>
-<span class="sourceLineNo">1814</span>      } catch (HBaseIOException e) {<a name="line.1814"></a>
-<span class="sourceLineNo">1815</span>        LOG.warn("unable to retain assignment", e);<a name="line.1815"></a>
-<span class="sourceLineNo">1816</span>        addToPendingAssignment(regions, retainMap.keySet());<a name="line.1816"></a>
+<span class="sourceLineNo">1742</span>  private void processAssignQueue() {<a name="line.1742"></a>
+<span class="sourceLineNo">1743</span>    final HashMap&lt;RegionInfo, RegionStateNode&gt; regions = waitOnAssignQueue();<a name="line.1743"></a>
+<span class="sourceLineNo">1744</span>    if (regions == null || regions.size() == 0 || !isRunning()) {<a name="line.1744"></a>
+<span class="sourceLineNo">1745</span>      return;<a name="line.1745"></a>
+<span class="sourceLineNo">1746</span>    }<a name="line.1746"></a>
+<span class="sourceLineNo">1747</span><a name="line.1747"></a>
+<span class="sourceLineNo">1748</span>    if (LOG.isTraceEnabled()) {<a name="line.1748"></a>
+<span class="sourceLineNo">1749</span>      LOG.trace("PROCESS ASSIGN QUEUE regionCount=" + regions.size());<a name="line.1749"></a>
+<span class="sourceLineNo">1750</span>    }<a name="line.1750"></a>
+<span class="sourceLineNo">1751</span><a name="line.1751"></a>
+<span class="sourceLineNo">1752</span>    // TODO: Optimize balancer. pass a RegionPlan?<a name="line.1752"></a>
+<span class="sourceLineNo">1753</span>    final HashMap&lt;RegionInfo, ServerName&gt; retainMap = new HashMap&lt;&gt;();<a name="line.1753"></a>
+<span class="sourceLineNo">1754</span>    final List&lt;RegionInfo&gt; userHRIs = new ArrayList&lt;&gt;(regions.size());<a name="line.1754"></a>
+<span class="sourceLineNo">1755</span>    // Regions for system tables requiring reassignment<a name="line.1755"></a>
+<span class="sourceLineNo">1756</span>    final List&lt;RegionInfo&gt; systemHRIs = new ArrayList&lt;&gt;();<a name="line.1756"></a>
+<span class="sourceLineNo">1757</span>    for (RegionStateNode regionStateNode: regions.values()) {<a name="line.1757"></a>
+<span class="sourceLineNo">1758</span>      boolean sysTable = regionStateNode.isSystemTable();<a name="line.1758"></a>
+<span class="sourceLineNo">1759</span>      final List&lt;RegionInfo&gt; hris = sysTable? systemHRIs: userHRIs;<a name="line.1759"></a>
+<span class="sourceLineNo">1760</span>      if (regionStateNode.getRegionLocation() != null) {<a name="line.1760"></a>
+<span class="sourceLineNo">1761</span>        retainMap.put(regionStateNode.getRegionInfo(), regionStateNode.getRegionLocation());<a name="line.1761"></a>
+<span class="sourceLineNo">1762</span>      } else {<a name="line.1762"></a>
+<span class="sourceLineNo">1763</span>        hris.add(regionStateNode.getRegionInfo());<a name="line.1763"></a>
+<span class="sourceLineNo">1764</span>      }<a name="line.1764"></a>
+<span class="sourceLineNo">1765</span>    }<a name="line.1765"></a>
+<span class="sourceLineNo">1766</span><a name="line.1766"></a>
+<span class="sourceLineNo">1767</span>    // TODO: connect with the listener to invalidate the cache<a name="line.1767"></a>
+<span class="sourceLineNo">1768</span><a name="line.1768"></a>
+<span class="sourceLineNo">1769</span>    // TODO use events<a name="line.1769"></a>
+<span class="sourceLineNo">1770</span>    List&lt;ServerName&gt; servers = master.getServerManager().createDestinationServersList();<a name="line.1770"></a>
+<span class="sourceLineNo">1771</span>    for (int i = 0; servers.size() &lt; 1; ++i) {<a name="line.1771"></a>
+<span class="sourceLineNo">1772</span>      // Report every fourth time around this loop; try not to flood log.<a name="line.1772"></a>
+<span class="sourceLineNo">1773</span>      if (i % 4 == 0) {<a name="line.1773"></a>
+<span class="sourceLineNo">1774</span>        LOG.warn("No servers available; cannot place " + regions.size() + " unassigned regions.");<a name="line.1774"></a>
+<span class="sourceLineNo">1775</span>      }<a name="line.1775"></a>
+<span class="sourceLineNo">1776</span><a name="line.1776"></a>
+<span class="sourceLineNo">1777</span>      if (!isRunning()) {<a name="line.1777"></a>
+<span class="sourceLineNo">1778</span>        LOG.debug("Stopped! Dropping assign of " + regions.size() + " queued regions.");<a name="line.1778"></a>
+<span class="sourceLineNo">1779</span>        return;<a name="line.1779"></a>
+<span class="sourceLineNo">1780</span>      }<a name="line.1780"></a>
+<span class="sourceLineNo">1781</span>      Threads.sleep(250);<a name="line.1781"></a>
+<span class="sourceLineNo">1782</span>      servers = master.getServerManager().createDestinationServersList();<a name="line.1782"></a>
+<span class="sourceLineNo">1783</span>    }<a name="line.1783"></a>
+<span class="sourceLineNo">1784</span><a name="line.1784"></a>
+<span class="sourceLineNo">1785</span>    if (!systemHRIs.isEmpty()) {<a name="line.1785"></a>
+<span class="sourceLineNo">1786</span>      // System table regions requiring reassignment are present, get region servers<a name="line.1786"></a>
+<span class="sourceLineNo">1787</span>      // not available for system table regions<a name="line.1787"></a>
+<span class="sourceLineNo">1788</span>      final List&lt;ServerName&gt; excludeServers = getExcludedServersForSystemTable();<a name="line.1788"></a>
+<span class="sourceLineNo">1789</span>      List&lt;ServerName&gt; serversForSysTables = servers.stream()<a name="line.1789"></a>
+<span class="sourceLineNo">1790</span>          .filter(s -&gt; !excludeServers.contains(s)).collect(Collectors.toList());<a name="line.1790"></a>
+<span class="sourceLineNo">1791</span>      if (serversForSysTables.isEmpty()) {<a name="line.1791"></a>
+<span class="sourceLineNo">1792</span>        LOG.warn("Filtering old server versions and the excluded produced an empty set; " +<a name="line.1792"></a>
+<span class="sourceLineNo">1793</span>            "instead considering all candidate servers!");<a name="line.1793"></a>
+<span class="sourceLineNo">1794</span>      }<a name="line.1794"></a>
+<span class="sourceLineNo">1795</span>      LOG.debug("Processing assignQueue; systemServersCount=" + serversForSysTables.size() +<a name="line.1795"></a>
+<span class="sourceLineNo">1796</span>          ", allServersCount=" + servers.size());<a name="line.1796"></a>
+<span class="sourceLineNo">1797</span>      processAssignmentPlans(regions, null, systemHRIs,<a name="line.1797"></a>
+<span class="sourceLineNo">1798</span>          serversForSysTables.isEmpty()? servers: serversForSysTables);<a name="line.1798"></a>
+<span class="sourceLineNo">1799</span>    }<a name="line.1799"></a>
+<span class="sourceLineNo">1800</span><a name="line.1800"></a>
+<span class="sourceLineNo">1801</span>    processAssignmentPlans(regions, retainMap, userHRIs, servers);<a name="line.1801"></a>
+<span class="sourceLineNo">1802</span>  }<a name="line.1802"></a>
+<span class="sourceLineNo">1803</span><a name="line.1803"></a>
+<span class="sourceLineNo">1804</span>  private void processAssignmentPlans(final HashMap&lt;RegionInfo, RegionStateNode&gt; regions,<a name="line.1804"></a>
+<span class="sourceLineNo">1805</span>      final HashMap&lt;RegionInfo, ServerName&gt; retainMap, final List&lt;RegionInfo&gt; hris,<a name="line.1805"></a>
+<span class="sourceLineNo">1806</span>      final List&lt;ServerName&gt; servers) {<a name="line.1806"></a>
+<span class="sourceLineNo">1807</span>    boolean isTraceEnabled = LOG.isTraceEnabled();<a name="line.1807"></a>
+<span class="sourceLineNo">1808</span>    if (isTraceEnabled) {<a name="line.1808"></a>
+<span class="sourceLineNo">1809</span>      LOG.trace("Available servers count=" + servers.size() + ": " + servers);<a name="line.1809"></a>
+<span class="sourceLineNo">1810</span>    }<a name="line.1810"></a>
+<span class="sourceLineNo">1811</span><a name="line.1811"></a>
+<span class="sourceLineNo">1812</span>    final LoadBalancer balancer = getBalancer();<a name="line.1812"></a>
+<span class="sourceLineNo">1813</span>    // ask the balancer where to place regions<a name="line.1813"></a>
+<span class="sourceLineNo">1814</span>    if (retainMap != null &amp;&amp; !retainMap.isEmpty()) {<a name="line.1814"></a>
+<span class="sourceLineNo">1815</span>      if (isTraceEnabled) {<a name="line.1815"></a>
+<span class="sourceLineNo">1816</span>        LOG.trace("retain assign regions=" + retainMap);<a name="line.1816"></a>
 <span class="sourceLineNo">1817</span>      }<a name="line.1817"></a>
-<span class="sourceLineNo">1818</span>    }<a name="line.1818"></a>
-<span class="sourceLineNo">1819</span><a name="line.1819"></a>
-<span class="sourceLineNo">1820</span>    // TODO: Do we need to split retain and round-robin?<a name="line.1820"></a>
-<span class="sourceLineNo">1821</span>    // the retain seems to fallback to round-robin/random if the region is not in the map.<a name="line.1821"></a>
-<span class="sourceLineNo">1822</span>    if (!hris.isEmpty()) {<a name="line.1822"></a>
-<span class="sourceLineNo">1823</span>      Collections.sort(hris, RegionInfo.COMPARATOR);<a name="line.1823"></a>
-<span class="sourceLineNo">1824</span>      if (isTraceEnabled) {<a name="line.1824"></a>
-<span class="sourceLineNo">1825</span>        LOG.trace("round robin regions=" + hris);<a name="line.1825"></a>
-<span class="sourceLineNo">1826</span>      }<a name="line.1826"></a>
-<span class="sourceLineNo">1827</span>      try {<a name="line.1827"></a>
-<span class="sourceLineNo">1828</span>        acceptPlan(regions, balancer.roundRobinAssignment(hris, servers));<a name="line.1828"></a>
-<span class="sourceLineNo">1829</span>      } catch (HBaseIOException e) {<a name="line.1829"></a>
-<span class="sourceLineNo">1830</span>        LOG.warn("unable to round-robin assignment", e);<a name="line.1830"></a>
-<span class="sourceLineNo">1831</span>        addToPendingAssignment(regions, hris);<a name="line.1831"></a>
+<span class="sourceLineNo">1818</span>      try {<a name="line.1818"></a>
+<span class="sourceLineNo">1819</span>        acceptPlan(regions, balancer.retainAssignment(retainMap, servers));<a name="line.1819"></a>
+<span class="sourceLineNo">1820</span>      } catch (HBaseIOException e) {<a name="line.1820"></a>
+<span class="sourceLineNo">1821</span>        LOG.warn("unable to retain assignment", e);<a name="line.1821"></a>
+<span class="sourceLineNo">1822</span>        addToPendingAssignment(regions, retainMap.keySet());<a name="line.1822"></a>
+<span class="sourceLineNo">1823</span>      }<a name="line.1823"></a>
+<span class="sourceLineNo">1824</span>    }<a name="line.1824"></a>
+<span class="sourceLineNo">1825</span><a name="line.1825"></a>
+<span class="sourceLineNo">1826</span>    // TODO: Do we need to split retain and round-robin?<a name="line.1826"></a>
+<span class="sourceLineNo">1827</span>    // the retain seems to fallback to round-robin/random if the region is not in the map.<a name="line.1827"></a>
+<span class="sourceLineNo">1828</span>    if (!hris.isEmpty()) {<a name="line.1828"></a>
+<span class="sourceLineNo">1829</span>      Collections.sort(hris, RegionInfo.COMPARATOR);<a name="line.1829"></a>
+<span class="sourceLineNo">1830</span>      if (isTraceEnabled) {<a name="line.1830"></a>
+<span class="sourceLineNo">1831</span>        LOG.trace("round robin regions=" + hris);<a name="line.1831"></a>
 <span class="sourceLineNo">1832</span>      }<a name="line.1832"></a>
-<span class="sourceLineNo">1833</span>    }<a name="line.1833"></a>
-<span class="sourceLineNo">1834</span>  }<a name="line.1834"></a>
-<span class="sourceLineNo">1835</span><a name="line.1835"></a>
-<span class="sourceLineNo">1836</span>  private void acceptPlan(final HashMap&lt;RegionInfo, RegionStateNode&gt; regions,<a name="line.1836"></a>
-<span class="sourceLineNo">1837</span>      final Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; plan) throws HBaseIOException {<a name="line.1837"></a>
-<span class="sourceLineNo">1838</span>    final ProcedureEvent&lt;?&gt;[] events = new ProcedureEvent[regions.size()];<a name="line.1838"></a>
-<span class="sourceLineNo">1839</span>    final long st = System.currentTimeMillis();<a name="line.1839"></a>
-<span class="sourceLineNo">1840</span><a name="line.1840"></a>
-<span class="sourceLineNo">1841</span>    if (plan == null) {<a name="line.1841"></a>
-<span class="sourceLineNo">1842</span>      throw new HBaseIOException("unable to compute plans for regions=" + regions.size());<a name="line.1842"></a>
-<span class="sourceLineNo">1843</span>    }<a name="line.1843"></a>
-<span class="sourceLineNo">1844</span><a name="line.1844"></a>
-<span class="sourceLineNo">1845</span>    if (plan.isEmpty()) return;<a name="line.1845"></a>
+<span class="sourceLineNo">1833</span>      try {<a name="line.1833"></a>
+<span class="sourceLineNo">1834</span>        acceptPlan(regions, balancer.roundRobinAssignment(hris, servers));<a name="line.1834"></a>
+<span class="sourceLineNo">1835</span>      } catch (HBaseIOException e) {<a name="line.1835"></a>
+<span class="sourceLineNo">1836</span>        LOG.warn("unable to round-robin assignment", e);<a name="line.1836"></a>
+<span class="sourceLineNo">1837</span>        addToPendingAssignment(regions, hris);<a name="line.1837"></a>
+<span class="sourceLineNo">1838</span>      }<a name="line.1838"></a>
+<span class="sourceLineNo">1839</span>    }<a name="line.1839"></a>
+<span class="sourceLineNo">1840</span>  }<a name="line.1840"></a>
+<span class="sourceLineNo">1841</span><a name="line.1841"></a>
+<span class="sourceLineNo">1842</span>  private void acceptPlan(final HashMap&lt;RegionInfo, RegionStateNode&gt; regions,<a name="line.1842"></a>
+<span class="sourceLineNo">1843</span>      final Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; plan) throws HBaseIOException {<a name="line.1843"></a>
+<span class="sourceLineNo">1844</span>    final ProcedureEvent&lt;?&gt;[] events = new ProcedureEvent[regions.size()];<a name="line.1844"></a>
+<span class="sourceLineNo">1845</span>    final long st = System.currentTimeMillis();<a name="line.1845"></a>
 <span class="sourceLineNo">1846</span><a name="line.1846"></a>
-<span class="sourceLineNo">1847</span>    int evcount = 0;<a name="line.1847"></a>
-<span class="sourceLineNo">1848</span>    for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; entry: plan.entrySet()) {<a name="line.1848"></a>
-<span class="sourceLineNo">1849</span>      final ServerName server = entry.getKey();<a name="line.1849"></a>
-<span class="sourceLineNo">1850</span>      for (RegionInfo hri: entry.getValue()) {<a name="line.1850"></a>
-<span class="sourceLineNo">1851</span>        final RegionStateNode regionNode = regions.get(hri);<a name="line.1851"></a>
-<span class="sourceLineNo">1852</span>        regionNode.setRegionLocation(server);<a name="line.1852"></a>
-<span class="sourceLineNo">1853</span>        events[evcount++] = regionNode.getProcedureEvent();<a name="line.1853"></a>
-<span class="sourceLineNo">1854</span>      }<a name="line.1854"></a>
-<span class="sourceLineNo">1855</span>    }<a name="line.1855"></a>
-<span class="sourceLineNo">1856</span>    ProcedureEvent.wakeEvents(getProcedureScheduler(), events);<a name="line.1856"></a>
-<span class="sourceLineNo">1857</span><a name="line.1857"></a>
-<span class="sourceLineNo">1858</span>    final long et = System.currentTimeMillis();<a name="line.1858"></a>
-<span class="sourceLineNo">1859</span>    if (LOG.isTraceEnabled()) {<a name="line.1859"></a>
-<span class="sourceLineNo">1860</span>      LOG.trace("ASSIGN ACCEPT " + events.length + " -&gt; " +<a name="line.1860"></a>
-<span class="sourceLineNo">1861</span>          StringUtils.humanTimeDiff(et - st));<a name="line.1861"></a>
-<span class="sourceLineNo">1862</span>    }<a name="line.1862"></a>
-<span class="sourceLineNo">1863</span>  }<a name="line.1863"></a>
-<span class="sourceLineNo">1864</span><a name="line.1864"></a>
-<span class="sourceLineNo">1865</span>  private void addToPendingAssignment(final HashMap&lt;RegionInfo, RegionStateNode&gt; regions,<a name="line.1865"></a>
-<span class="sourceLineNo">1866</span>      final Collection&lt;RegionInfo&gt; pendingRegions) {<a name="line.1866"></a>
-<span class="sourceLineNo">1867</span>    assignQueueLock.lock();<a name="line.1867"></a>
-<span class="sourceLineNo">1868</span>    try {<a name="line.1868"></a>
-<span class="sourceLineNo">1869</span>      for (RegionInfo hri: pendingRegions) {<a name="line.1869"></a>
-<span class="sourceLineNo">1870</span>        pendingAssignQueue.add(regions.get(hri));<a name="line.1870"></a>
-<span class="sourceLineNo">1871</span>      }<a name="line.1871"></a>
-<span class="sourceLineNo">1872</span>    } finally {<a name="line.1872"></a>
-<span class="sourceLineNo">1873</span>      assignQueueLock.unlock();<a name="line.1873"></a>
-<span class="sourceLineNo">1874</span>    }<a name="line.1874"></a>
-<span class="sourceLineNo">1875</span>  }<a name="line.1875"></a>
-<span class="sourceLineNo">1876</span><a name="line.1876"></a>
-<span class="sourceLineNo">1877</span>  /**<a name="line.1877"></a>
-<span class="sourceLineNo">1878</span>   * Get a list of servers that this region cannot be assigned to.<a name="line.1878"></a>
-<span class="sourceLineNo">1879</span>   * For system tables, we must assign them to a server with highest version.<a name="line.1879"></a>
-<span class="sourceLineNo">1880</span>   */<a name="line.1880"></a>
-<span class="sourceLineNo">1881</span>  public List&lt;ServerName&gt; getExcludedServersForSystemTable() {<a name="line.1881"></a>
-<span class="sourceLineNo">1882</span>    // TODO: This should be a cached list kept by the ServerManager rather than calculated on each<a name="line.1882"></a>
-<span class="sourceLineNo">1883</span>    // move or system region assign. The RegionServerTracker keeps list of online Servers with<a name="line.1883"></a>
-<span class="sourceLineNo">1884</span>    // RegionServerInfo that includes Version.<a name="line.1884"></a>
-<span class="sourceLineNo">1885</span>    List&lt;Pair&lt;ServerName, String&gt;&gt; serverList = master.getServerManager().getOnlineServersList()<a name="line.1885"></a>
-<span class="sourceLineNo">1886</span>        .stream()<a name="line.1886"></a>
-<span class="sourceLineNo">1887</span>        .map((s)-&gt;new Pair&lt;&gt;(s, master.getRegionServerVersion(s)))<a name="line.1887"></a>
-<span class="sourceLineNo">1888</span>        .collect(Collectors.toList());<a name="line.1888"></a>
-<span class="sourceLineNo">1889</span>    if (serverList.isEmpty()) {<a name="line.1889"></a>
-<span class="sourceLineNo">1890</span>      return Collections.emptyList();<a name="line.1890"></a>
-<span class="sourceLineNo">1891</span>    }<a name="line.1891"></a>
-<span class="sourceLineNo">1892</span>    String highestVersion = Collections.max(serverList,<a name="line.1892"></a>
-<span class="sourceLineNo">1893</span>        (o1, o2) -&gt; VersionInfo.compareVersion(o1.getSecond(), o2.getSecond())).getSecond();<a name="line.1893"></a>
-<span class="sourceLineNo">1894</span>    return serverList.stream()<a name="line.1894"></a>
-<span class="sourceLineNo">1895</span>        .filter((p)-&gt;!p.getSecond().equals(highestVersion))<a name="line.1895"></a>
-<span class="sourceLineNo">1896</span>        .map(Pair::getFirst)<a name="line.1896"></a>
-<span class="sourceLineNo">1897</span>        .collect(Collectors.toList());<a name="line.1897"></a>
-<span class="sourceLineNo">1898</span>  }<a name="line.1898"></a>
-<span class="sourceLineNo">1899</span><a name="line.1899"></a>
-<span class="sourceLineNo">1900</span>  @VisibleForTesting<a name="line.1900"></a>
-<span class="sourceLineNo">1901</span>  MasterServices getMaster() {<a name="line.1901"></a>
-<span class="sourceLineNo">1902</span>    return master;<a name="line.1902"></a>
-<span class="sourceLineNo">1903</span>  }<a name="line.1903"></a>
-<span class="sourceLineNo">1904</span>}<a name="line.1904"></a>
+<span class="sourceLineNo">1847</span>    if (plan == null) {<a name="line.1847"></a>
+<span class="sourceLineNo">1848</span>      throw new HBaseIOException("unable to compute plans for regions=" + regions.size());<a name="line.1848"></a>
+<span class="sourceLineNo">1849</span>    }<a name="line.1849"></a>
+<span class="sourceLineNo">1850</span><a name="line.1850"></a>
+<span class="sourceLineNo">1851</span>    if (plan.isEmpty()) return;<a name="line.1851"></a>
+<span class="sourceLineNo">1852</span><a name="line.1852"></a>
+<span class="sourceLineNo">1853</span>    int evcount = 0;<a name="line.1853"></a>
+<span class="sourceLineNo">1854</span>    for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; entry: plan.entrySet()) {<a name="line.1854"></a>
+<span class="sourceLineNo">1855</span>      final ServerName server = entry.getKey();<a name="line.1855"></a>
+<span class="sourceLineNo">1856</span>      for (RegionInfo hri: entry.getValue()) {<a name="line.1856"></a>
+<span class="sourceLineNo">1857</span>        final RegionStateNode regionNode = regions.get(hri);<a name="line.1857"></a>
+<span class="sourceLineNo">1858</span>        regionNode.setRegionLocation(server);<a name="line.1858"></a>
+<span class="sourceLineNo">1859</span>        events[evcount++] = regionNode.getProcedureEvent();<a name="line.1859"></a>
+<span class="sourceLineNo">1860</span>      }<a name="line.1860"></a>
+<span class="sourceLineNo">1861</span>    }<a name="line.1861"></a>
+<span class="sourceLineNo">1862</span>    ProcedureEvent.wakeEvents(getProcedureScheduler(), events);<a name="line.1862"></a>
+<span class="sourceLineNo">1863</span><a name="line.1863"></a>
+<span class="sourceLineNo">1864</span>    final long et = System.currentTimeMillis();<a name="line.1864"></a>
+<span class="sourceLineNo">1865</span>    if (LOG.isTraceEnabled()) {<a name="line.1865"></a>
+<span class="sourceLineNo">1866</span>      LOG.trace("ASSIGN ACCEPT " + events.length + " -&gt; " +<a name="line.1866"></a>
+<span class="sourceLineNo">1867</span>          StringUtils.humanTimeDiff(et - st));<a name="line.1867"></a>
+<span class="sourceLineNo">1868</span>    }<a name="line.1868"></a>
+<span class="sourceLineNo">1869</span>  }<a name="line.1869"></a>
+<span class="sourceLineNo">1870</span><a name="line.1870"></a>
+<span class="sourceLineNo">1871</span>  private void addToPendingAssignment(final HashMap&lt;RegionInfo, RegionStateNode&gt; regions,<a name="line.1871"></a>
+<span class="sourceLineNo">1872</span>      final Collection&lt;RegionInfo&gt; pendingRegions) {<a name="line.1872"></a>
+<span class="sourceLineNo">1873</span>    assignQueueLock.lock();<a name="line.1873"></a>
+<span class="sourceLineNo">1874</span>    try {<a name="line.1874"></a>
+<span class="sourceLineNo">1875</span>      for (RegionInfo hri: pendingRegions) {<a name="line.1875"></a>
+<span class="sourceLineNo">1876</span>        pendingAssignQueue.add(regions.get(hri));<a name="line.1876"></a>
+<span class="sourceLineNo">1877</span>      }<a name="line.1877"></a>
+<span class="sourceLineNo">1878</span>    } finally {<a name="line.1878"></a>
+<span class="sourceLineNo">1879</span>      assignQueueLock.unlock();<a name="line.1879"></a>
+<span class="sourceLineNo">1880</span>    }<a name="line.1880"></a>
+<span class="sourceLineNo">1881</span>  }<a name="line.1881"></a>
+<span class="sourceLineNo">1882</span><a name="line.1882"></a>
+<span class="sourceLineNo">1883</span>  /**<a name="line.1883"></a>
+<span class="sourceLineNo">1884</span>   * Get a list of servers that this region cannot be assigned to.<a name="line.1884"></a>
+<span class="sourceLineNo">1885</span>   * For system tables, we must assign them to a server with highest version.<a name="line.1885"></a>
+<span class="sourceLineNo">1886</span>   */<a name="line.1886"></a>
+<span class="sourceLineNo">1887</span>  public List&lt;ServerName&gt; getExcludedServersForSystemTable() {<a name="line.1887"></a>
+<span class="sourceLineNo">1888</span>    // TODO: This should be a cached list kept by the ServerManager rather than calculated on each<a name="line.1888"></a>
+<span class="sourceLineNo">1889</span>    // move or system region assign. The RegionServerTracker keeps list of online Servers with<a name="line.1889"></a>
+<span class="sourceLineNo">1890</span>    // RegionServerInfo that includes Version.<a name="line.1890"></a>
+<span class="sourceLineNo">1891</span>    List&lt;Pair&lt;ServerName, String&gt;&gt; serverList = master.getServerManager().getOnlineServersList()<a name="line.1891"></a>
+<span class="sourceLineNo">1892</span>        .stream()<a name="line.1892"></a>
+<span class="sourceLineNo">1893</span>        .map((s)-&gt;new Pair&lt;&gt;(s, master.getRegionServerVersion(s)))<a name="line.1893"></a>
+<span class="sourceLineNo">1894</span>        .collect(Collectors.toList());<a name="line.1894"></a>
+<span class="sourceLineNo">1895</span>    if (serverList.isEmpty()) {<a name="line.1895"></a>
+<span class="sourceLineNo">1896</span>      return Collections.emptyList();<a name="line.1896"></a>
+<span class="sourceLineNo">1897</span>    }<a name="line.1897"></a>
+<span class="sourceLineNo">1898</span>    String highestVersion = Collections.max(serverList,<a name="line.1898"></a>
+<span class="sourceLineNo">1899</span>        (o1, o2) -&gt; VersionInfo.compareVersion(o1.getSecond(), o2.getSecond())).getSecond();<a name="line.1899"></a>
+<span class="sourceLineNo">1900</span>    return serverList.stream()<a name="line.1900"></a>
+<span class="sourceLineNo">1901</span>        .filter((p)-&gt;!p.getSecond().equals(highestVersion))<a name="line.1901"></a>
+<span class="sourceLineNo">1902</span>        .map(Pair::getFirst)<a name="line.1902"></a>
+<span class="sourceLineNo">1903</span>        .collect(Collectors.toList());<a name="line.1903"></a>
+<span class="sourceLineNo">1904</span>  }<a name="line.1904"></a>
+<span class="sourceLineNo">1905</span><a name="line.1905"></a>
+<span class="sourceLineNo">1906</span>  @VisibleForTesting<a name="line.1906"></a>
+<span class="sourceLineNo">1907</span>  MasterServices getMaster() {<a name="line.1907"></a>
+<span class="sourceLineNo">1908</span>    return master;<a name="line.1908"></a>
+<span class="sourceLineNo">1909</span>  }<a name="line.1909"></a>
+<span class="sourceLineNo">1910</span>}<a name="line.1910"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStateNode.AssignmentProcedureEvent.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStateNode.AssignmentProcedureEvent.html
index d664e99..9291b40 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStateNode.AssignmentProcedureEvent.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStateNode.AssignmentProcedureEvent.html
@@ -177,150 +177,154 @@
 <span class="sourceLineNo">169</span><a name="line.169"></a>
 <span class="sourceLineNo">170</span>  public long getLastUpdate() {<a name="line.170"></a>
 <span class="sourceLineNo">171</span>    TransitRegionStateProcedure proc = this.procedure;<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    return proc != null ? proc.getLastUpdate() : lastUpdate;<a name="line.172"></a>
-<span class="sourceLineNo">173</span>  }<a name="line.173"></a>
-<span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>  public void setLastHost(final ServerName serverName) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    this.lastHost = serverName;<a name="line.176"></a>
+<span class="sourceLineNo">172</span>    if (proc != null) {<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      long lastUpdate = proc.getLastUpdate();<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      return lastUpdate != 0 ? lastUpdate : proc.getSubmittedTime();<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    }<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    return lastUpdate;<a name="line.176"></a>
 <span class="sourceLineNo">177</span>  }<a name="line.177"></a>
 <span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>  public void setOpenSeqNum(final long seqId) {<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    this.openSeqNum = seqId;<a name="line.180"></a>
+<span class="sourceLineNo">179</span>  public void setLastHost(final ServerName serverName) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    this.lastHost = serverName;<a name="line.180"></a>
 <span class="sourceLineNo">181</span>  }<a name="line.181"></a>
 <span class="sourceLineNo">182</span><a name="line.182"></a>
-<span class="sourceLineNo">183</span>  public ServerName setRegionLocation(final ServerName serverName) {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    ServerName lastRegionLocation = this.regionLocation;<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    if (LOG.isTraceEnabled() &amp;&amp; serverName == null) {<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      LOG.trace("Tracking when we are set to null " + this, new Throwable("TRACE"));<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    }<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    this.regionLocation = serverName;<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    this.lastUpdate = EnvironmentEdgeManager.currentTime();<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    return lastRegionLocation;<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>  public void setProcedure(TransitRegionStateProcedure proc) {<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    assert this.procedure == null;<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    this.procedure = proc;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    ritMap.put(regionInfo, this);<a name="line.196"></a>
-<span class="sourceLineNo">197</span>  }<a name="line.197"></a>
-<span class="sourceLineNo">198</span><a name="line.198"></a>
-<span class="sourceLineNo">199</span>  public void unsetProcedure(TransitRegionStateProcedure proc) {<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    assert this.procedure == proc;<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    this.procedure = null;<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    ritMap.remove(regionInfo, this);<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  }<a name="line.203"></a>
-<span class="sourceLineNo">204</span><a name="line.204"></a>
-<span class="sourceLineNo">205</span>  public TransitRegionStateProcedure getProcedure() {<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    return procedure;<a name="line.206"></a>
+<span class="sourceLineNo">183</span>  public void setOpenSeqNum(final long seqId) {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    this.openSeqNum = seqId;<a name="line.184"></a>
+<span class="sourceLineNo">185</span>  }<a name="line.185"></a>
+<span class="sourceLineNo">186</span><a name="line.186"></a>
+<span class="sourceLineNo">187</span>  public ServerName setRegionLocation(final ServerName serverName) {<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    ServerName lastRegionLocation = this.regionLocation;<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    if (LOG.isTraceEnabled() &amp;&amp; serverName == null) {<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      LOG.trace("Tracking when we are set to null " + this, new Throwable("TRACE"));<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    }<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    this.regionLocation = serverName;<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    this.lastUpdate = EnvironmentEdgeManager.currentTime();<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    return lastRegionLocation;<a name="line.194"></a>
+<span class="sourceLineNo">195</span>  }<a name="line.195"></a>
+<span class="sourceLineNo">196</span><a name="line.196"></a>
+<span class="sourceLineNo">197</span>  public void setProcedure(TransitRegionStateProcedure proc) {<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    assert this.procedure == null;<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    this.procedure = proc;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    ritMap.put(regionInfo, this);<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>  public void unsetProcedure(TransitRegionStateProcedure proc) {<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    assert this.procedure == proc;<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    this.procedure = null;<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    ritMap.remove(regionInfo, this);<a name="line.206"></a>
 <span class="sourceLineNo">207</span>  }<a name="line.207"></a>
 <span class="sourceLineNo">208</span><a name="line.208"></a>
-<span class="sourceLineNo">209</span>  public ProcedureEvent&lt;?&gt; getProcedureEvent() {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    return event;<a name="line.210"></a>
+<span class="sourceLineNo">209</span>  public TransitRegionStateProcedure getProcedure() {<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    return procedure;<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>  public RegionInfo getRegionInfo() {<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    return regionInfo;<a name="line.214"></a>
+<span class="sourceLineNo">213</span>  public ProcedureEvent&lt;?&gt; getProcedureEvent() {<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    return event;<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>  public TableName getTable() {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    return getRegionInfo().getTable();<a name="line.218"></a>
+<span class="sourceLineNo">217</span>  public RegionInfo getRegionInfo() {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    return regionInfo;<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>  public boolean isSystemTable() {<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    return getTable().isSystemTable();<a name="line.222"></a>
+<span class="sourceLineNo">221</span>  public TableName getTable() {<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    return getRegionInfo().getTable();<a name="line.222"></a>
 <span class="sourceLineNo">223</span>  }<a name="line.223"></a>
 <span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>  public ServerName getLastHost() {<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    return lastHost;<a name="line.226"></a>
+<span class="sourceLineNo">225</span>  public boolean isSystemTable() {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    return getTable().isSystemTable();<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 ServerName getRegionLocation() {<a name="line.229"></a>
-<span class="sourceLineNo">230</span>    return regionLocation;<a name="line.230"></a>
+<span class="sourceLineNo">229</span>  public ServerName getLastHost() {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    return lastHost;<a name="line.230"></a>
 <span class="sourceLineNo">231</span>  }<a name="line.231"></a>
 <span class="sourceLineNo">232</span><a name="line.232"></a>
-<span class="sourceLineNo">233</span>  public State getState() {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    return state;<a name="line.234"></a>
+<span class="sourceLineNo">233</span>  public ServerName getRegionLocation() {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    return regionLocation;<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>  public long getOpenSeqNum() {<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    return openSeqNum;<a name="line.238"></a>
+<span class="sourceLineNo">237</span>  public State getState() {<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    return state;<a name="line.238"></a>
 <span class="sourceLineNo">239</span>  }<a name="line.239"></a>
 <span class="sourceLineNo">240</span><a name="line.240"></a>
-<span class="sourceLineNo">241</span>  public int getFormatVersion() {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    // we don't have any format for now<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    // it should probably be in regionInfo.getFormatVersion()<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    return 0;<a name="line.244"></a>
-<span class="sourceLineNo">245</span>  }<a name="line.245"></a>
-<span class="sourceLineNo">246</span><a name="line.246"></a>
-<span class="sourceLineNo">247</span>  public RegionState toRegionState() {<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    return new RegionState(getRegionInfo(), getState(), getLastUpdate(), getRegionLocation());<a name="line.248"></a>
+<span class="sourceLineNo">241</span>  public long getOpenSeqNum() {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    return openSeqNum;<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>  public int getFormatVersion() {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    // we don't have any format for now<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    // it should probably be in regionInfo.getFormatVersion()<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    return 0;<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 int compareTo(final RegionStateNode other) {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    // NOTE: RegionInfo sort by table first, so we are relying on that.<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    // we have a TestRegionState#testOrderedByTable() that check for that.<a name="line.254"></a>
-<span class="sourceLineNo">255</span>    return RegionInfo.COMPARATOR.compare(getRegionInfo(), other.getRegionInfo());<a name="line.255"></a>
-<span class="sourceLineNo">256</span>  }<a name="line.256"></a>
-<span class="sourceLineNo">257</span><a name="line.257"></a>
-<span class="sourceLineNo">258</span>  @Override<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  public int hashCode() {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    return getRegionInfo().hashCode();<a name="line.260"></a>
-<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
-<span class="sourceLineNo">262</span><a name="line.262"></a>
-<span class="sourceLineNo">263</span>  @Override<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  public boolean equals(final Object other) {<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    if (this == other) {<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      return true;<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    }<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    if (!(other instanceof RegionStateNode)) {<a name="line.268"></a>
-<span class="sourceLineNo">269</span>      return false;<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    }<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    return compareTo((RegionStateNode) other) == 0;<a name="line.271"></a>
-<span class="sourceLineNo">272</span>  }<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>  @Override<a name="line.274"></a>
-<span class="sourceLineNo">275</span>  public String toString() {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    return toDescriptiveString();<a name="line.276"></a>
-<span class="sourceLineNo">277</span>  }<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>  public String toShortString() {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    // rit= is the current Region-In-Transition State -- see State enum.<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    return String.format("rit=%s, location=%s", getState(), getRegionLocation());<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>  public String toDescriptiveString() {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    return String.format("%s, table=%s, region=%s", toShortString(), getTable(),<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      getRegionInfo().getEncodedName());<a name="line.286"></a>
-<span class="sourceLineNo">287</span>  }<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>  public void checkOnline() throws DoNotRetryRegionException {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    RegionInfo ri = getRegionInfo();<a name="line.290"></a>
-<span class="sourceLineNo">291</span>    State s = state;<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    if (s != State.OPEN) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      throw new DoNotRetryRegionException(ri.getEncodedName() + " is no OPEN; state=" + s);<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    }<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    if (ri.isSplitParent()) {<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      throw new DoNotRetryRegionException(<a name="line.296"></a>
-<span class="sourceLineNo">297</span>        ri.getEncodedName() + " is not online (splitParent=true)");<a name="line.297"></a>
+<span class="sourceLineNo">251</span>  public RegionState toRegionState() {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    return new RegionState(getRegionInfo(), getState(), getLastUpdate(), getRegionLocation());<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>  @Override<a name="line.255"></a>
+<span class="sourceLineNo">256</span>  public int compareTo(final RegionStateNode other) {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    // NOTE: RegionInfo sort by table first, so we are relying on that.<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    // we have a TestRegionState#testOrderedByTable() that check for that.<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    return RegionInfo.COMPARATOR.compare(getRegionInfo(), other.getRegionInfo());<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
+<span class="sourceLineNo">261</span><a name="line.261"></a>
+<span class="sourceLineNo">262</span>  @Override<a name="line.262"></a>
+<span class="sourceLineNo">263</span>  public int hashCode() {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    return getRegionInfo().hashCode();<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  }<a name="line.265"></a>
+<span class="sourceLineNo">266</span><a name="line.266"></a>
+<span class="sourceLineNo">267</span>  @Override<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  public boolean equals(final Object other) {<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    if (this == other) {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      return true;<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    }<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    if (!(other instanceof RegionStateNode)) {<a name="line.272"></a>
+<span class="sourceLineNo">273</span>      return false;<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    }<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    return compareTo((RegionStateNode) other) == 0;<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  }<a name="line.276"></a>
+<span class="sourceLineNo">277</span><a name="line.277"></a>
+<span class="sourceLineNo">278</span>  @Override<a name="line.278"></a>
+<span class="sourceLineNo">279</span>  public String toString() {<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    return toDescriptiveString();<a name="line.280"></a>
+<span class="sourceLineNo">281</span>  }<a name="line.281"></a>
+<span class="sourceLineNo">282</span><a name="line.282"></a>
+<span class="sourceLineNo">283</span>  public String toShortString() {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    // rit= is the current Region-In-Transition State -- see State enum.<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    return String.format("rit=%s, location=%s", getState(), getRegionLocation());<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 String toDescriptiveString() {<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    return String.format("%s, table=%s, region=%s", toShortString(), getTable(),<a name="line.289"></a>
+<span class="sourceLineNo">290</span>      getRegionInfo().getEncodedName());<a name="line.290"></a>
+<span class="sourceLineNo">291</span>  }<a name="line.291"></a>
+<span class="sourceLineNo">292</span><a name="line.292"></a>
+<span class="sourceLineNo">293</span>  public void checkOnline() throws DoNotRetryRegionException {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    RegionInfo ri = getRegionInfo();<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    State s = state;<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    if (s != State.OPEN) {<a name="line.296"></a>
+<span class="sourceLineNo">297</span>      throw new DoNotRetryRegionException(ri.getEncodedName() + " is no OPEN; state=" + s);<a name="line.297"></a>
 <span class="sourceLineNo">298</span>    }<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    if (ri.isSplit()) {<a name="line.299"></a>
-<span class="sourceLineNo">300</span>      throw new DoNotRetryRegionException(ri.getEncodedName() + " has split=true");<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    }<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    if (ri.isOffline()) {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>      // RegionOfflineException is not instance of DNRIOE so wrap it.<a name="line.303"></a>
-<span class="sourceLineNo">304</span>      throw new DoNotRetryRegionException(new RegionOfflineException(ri.getEncodedName()));<a name="line.304"></a>
+<span class="sourceLineNo">299</span>    if (ri.isSplitParent()) {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>      throw new DoNotRetryRegionException(<a name="line.300"></a>
+<span class="sourceLineNo">301</span>        ri.getEncodedName() + " is not online (splitParent=true)");<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    }<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    if (ri.isSplit()) {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>      throw new DoNotRetryRegionException(ri.getEncodedName() + " has split=true");<a name="line.304"></a>
 <span class="sourceLineNo">305</span>    }<a name="line.305"></a>
-<span class="sourceLineNo">306</span>  }<a name="line.306"></a>
-<span class="sourceLineNo">307</span><a name="line.307"></a>
-<span class="sourceLineNo">308</span>  public void lock() {<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    lock.lock();<a name="line.309"></a>
+<span class="sourceLineNo">306</span>    if (ri.isOffline()) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      // RegionOfflineException is not instance of DNRIOE so wrap it.<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      throw new DoNotRetryRegionException(new RegionOfflineException(ri.getEncodedName()));<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    }<a name="line.309"></a>
 <span class="sourceLineNo">310</span>  }<a name="line.310"></a>
 <span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span>  public void unlock() {<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    lock.unlock();<a name="line.313"></a>
+<span class="sourceLineNo">312</span>  public void lock() {<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    lock.lock();<a name="line.313"></a>
 <span class="sourceLineNo">314</span>  }<a name="line.314"></a>
-<span class="sourceLineNo">315</span>}<a name="line.315"></a>
+<span class="sourceLineNo">315</span><a name="line.315"></a>
+<span class="sourceLineNo">316</span>  public void unlock() {<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    lock.unlock();<a name="line.317"></a>
+<span class="sourceLineNo">318</span>  }<a name="line.318"></a>
+<span class="sourceLineNo">319</span>}<a name="line.319"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStateNode.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStateNode.html
index d664e99..9291b40 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStateNode.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStateNode.html
@@ -177,150 +177,154 @@
 <span class="sourceLineNo">169</span><a name="line.169"></a>
 <span class="sourceLineNo">170</span>  public long getLastUpdate() {<a name="line.170"></a>
 <span class="sourceLineNo">171</span>    TransitRegionStateProcedure proc = this.procedure;<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    return proc != null ? proc.getLastUpdate() : lastUpdate;<a name="line.172"></a>
-<span class="sourceLineNo">173</span>  }<a name="line.173"></a>
-<span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>  public void setLastHost(final ServerName serverName) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    this.lastHost = serverName;<a name="line.176"></a>
+<span class="sourceLineNo">172</span>    if (proc != null) {<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      long lastUpdate = proc.getLastUpdate();<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      return lastUpdate != 0 ? lastUpdate : proc.getSubmittedTime();<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    }<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    return lastUpdate;<a name="line.176"></a>
 <span class="sourceLineNo">177</span>  }<a name="line.177"></a>
 <span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>  public void setOpenSeqNum(final long seqId) {<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    this.openSeqNum = seqId;<a name="line.180"></a>
+<span class="sourceLineNo">179</span>  public void setLastHost(final ServerName serverName) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    this.lastHost = serverName;<a name="line.180"></a>
 <span class="sourceLineNo">181</span>  }<a name="line.181"></a>
 <span class="sourceLineNo">182</span><a name="line.182"></a>
-<span class="sourceLineNo">183</span>  public ServerName setRegionLocation(final ServerName serverName) {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    ServerName lastRegionLocation = this.regionLocation;<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    if (LOG.isTraceEnabled() &amp;&amp; serverName == null) {<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      LOG.trace("Tracking when we are set to null " + this, new Throwable("TRACE"));<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    }<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    this.regionLocation = serverName;<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    this.lastUpdate = EnvironmentEdgeManager.currentTime();<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    return lastRegionLocation;<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>  public void setProcedure(TransitRegionStateProcedure proc) {<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    assert this.procedure == null;<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    this.procedure = proc;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    ritMap.put(regionInfo, this);<a name="line.196"></a>
-<span class="sourceLineNo">197</span>  }<a name="line.197"></a>
-<span class="sourceLineNo">198</span><a name="line.198"></a>
-<span class="sourceLineNo">199</span>  public void unsetProcedure(TransitRegionStateProcedure proc) {<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    assert this.procedure == proc;<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    this.procedure = null;<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    ritMap.remove(regionInfo, this);<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  }<a name="line.203"></a>
-<span class="sourceLineNo">204</span><a name="line.204"></a>
-<span class="sourceLineNo">205</span>  public TransitRegionStateProcedure getProcedure() {<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    return procedure;<a name="line.206"></a>
+<span class="sourceLineNo">183</span>  public void setOpenSeqNum(final long seqId) {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    this.openSeqNum = seqId;<a name="line.184"></a>
+<span class="sourceLineNo">185</span>  }<a name="line.185"></a>
+<span class="sourceLineNo">186</span><a name="line.186"></a>
+<span class="sourceLineNo">187</span>  public ServerName setRegionLocation(final ServerName serverName) {<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    ServerName lastRegionLocation = this.regionLocation;<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    if (LOG.isTraceEnabled() &amp;&amp; serverName == null) {<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      LOG.trace("Tracking when we are set to null " + this, new Throwable("TRACE"));<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    }<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    this.regionLocation = serverName;<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    this.lastUpdate = EnvironmentEdgeManager.currentTime();<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    return lastRegionLocation;<a name="line.194"></a>
+<span class="sourceLineNo">195</span>  }<a name="line.195"></a>
+<span class="sourceLineNo">196</span><a name="line.196"></a>
+<span class="sourceLineNo">197</span>  public void setProcedure(TransitRegionStateProcedure proc) {<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    assert this.procedure == null;<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    this.procedure = proc;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    ritMap.put(regionInfo, this);<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>  public void unsetProcedure(TransitRegionStateProcedure proc) {<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    assert this.procedure == proc;<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    this.procedure = null;<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    ritMap.remove(regionInfo, this);<a name="line.206"></a>
 <span class="sourceLineNo">207</span>  }<a name="line.207"></a>
 <span class="sourceLineNo">208</span><a name="line.208"></a>
-<span class="sourceLineNo">209</span>  public ProcedureEvent&lt;?&gt; getProcedureEvent() {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    return event;<a name="line.210"></a>
+<span class="sourceLineNo">209</span>  public TransitRegionStateProcedure getProcedure() {<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    return procedure;<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>  public RegionInfo getRegionInfo() {<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    return regionInfo;<a name="line.214"></a>
+<span class="sourceLineNo">213</span>  public ProcedureEvent&lt;?&gt; getProcedureEvent() {<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    return event;<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>  public TableName getTable() {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    return getRegionInfo().getTable();<a name="line.218"></a>
+<span class="sourceLineNo">217</span>  public RegionInfo getRegionInfo() {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    return regionInfo;<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>  public boolean isSystemTable() {<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    return getTable().isSystemTable();<a name="line.222"></a>
+<span class="sourceLineNo">221</span>  public TableName getTable() {<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    return getRegionInfo().getTable();<a name="line.222"></a>
 <span class="sourceLineNo">223</span>  }<a name="line.223"></a>
 <span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>  public ServerName getLastHost() {<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    return lastHost;<a name="line.226"></a>
+<span class="sourceLineNo">225</span>  public boolean isSystemTable() {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    return getTable().isSystemTable();<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 ServerName getRegionLocation() {<a name="line.229"></a>
-<span class="sourceLineNo">230</span>    return regionLocation;<a name="line.230"></a>
+<span class="sourceLineNo">229</span>  public ServerName getLastHost() {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    return lastHost;<a name="line.230"></a>
 <span class="sourceLineNo">231</span>  }<a name="line.231"></a>
 <span class="sourceLineNo">232</span><a name="line.232"></a>
-<span class="sourceLineNo">233</span>  public State getState() {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    return state;<a name="line.234"></a>
+<span class="sourceLineNo">233</span>  public ServerName getRegionLocation() {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    return regionLocation;<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>  public long getOpenSeqNum() {<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    return openSeqNum;<a name="line.238"></a>
+<span class="sourceLineNo">237</span>  public State getState() {<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    return state;<a name="line.238"></a>
 <span class="sourceLineNo">239</span>  }<a name="line.239"></a>
 <span class="sourceLineNo">240</span><a name="line.240"></a>
-<span class="sourceLineNo">241</span>  public int getFormatVersion() {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    // we don't have any format for now<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    // it should probably be in regionInfo.getFormatVersion()<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    return 0;<a name="line.244"></a>
-<span class="sourceLineNo">245</span>  }<a name="line.245"></a>
-<span class="sourceLineNo">246</span><a name="line.246"></a>
-<span class="sourceLineNo">247</span>  public RegionState toRegionState() {<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    return new RegionState(getRegionInfo(), getState(), getLastUpdate(), getRegionLocation());<a name="line.248"></a>
+<span class="sourceLineNo">241</span>  public long getOpenSeqNum() {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    return openSeqNum;<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>  public int getFormatVersion() {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    // we don't have any format for now<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    // it should probably be in regionInfo.getFormatVersion()<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    return 0;<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 int compareTo(final RegionStateNode other) {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    // NOTE: RegionInfo sort by table first, so we are relying on that.<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    // we have a TestRegionState#testOrderedByTable() that check for that.<a name="line.254"></a>
-<span class="sourceLineNo">255</span>    return RegionInfo.COMPARATOR.compare(getRegionInfo(), other.getRegionInfo());<a name="line.255"></a>
-<span class="sourceLineNo">256</span>  }<a name="line.256"></a>
-<span class="sourceLineNo">257</span><a name="line.257"></a>
-<span class="sourceLineNo">258</span>  @Override<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  public int hashCode() {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    return getRegionInfo().hashCode();<a name="line.260"></a>
-<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
-<span class="sourceLineNo">262</span><a name="line.262"></a>
-<span class="sourceLineNo">263</span>  @Override<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  public boolean equals(final Object other) {<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    if (this == other) {<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      return true;<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    }<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    if (!(other instanceof RegionStateNode)) {<a name="line.268"></a>
-<span class="sourceLineNo">269</span>      return false;<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    }<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    return compareTo((RegionStateNode) other) == 0;<a name="line.271"></a>
-<span class="sourceLineNo">272</span>  }<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>  @Override<a name="line.274"></a>
-<span class="sourceLineNo">275</span>  public String toString() {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    return toDescriptiveString();<a name="line.276"></a>
-<span class="sourceLineNo">277</span>  }<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>  public String toShortString() {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    // rit= is the current Region-In-Transition State -- see State enum.<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    return String.format("rit=%s, location=%s", getState(), getRegionLocation());<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>  public String toDescriptiveString() {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    return String.format("%s, table=%s, region=%s", toShortString(), getTable(),<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      getRegionInfo().getEncodedName());<a name="line.286"></a>
-<span class="sourceLineNo">287</span>  }<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>  public void checkOnline() throws DoNotRetryRegionException {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    RegionInfo ri = getRegionInfo();<a name="line.290"></a>
-<span class="sourceLineNo">291</span>    State s = state;<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    if (s != State.OPEN) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      throw new DoNotRetryRegionException(ri.getEncodedName() + " is no OPEN; state=" + s);<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    }<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    if (ri.isSplitParent()) {<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      throw new DoNotRetryRegionException(<a name="line.296"></a>
-<span class="sourceLineNo">297</span>        ri.getEncodedName() + " is not online (splitParent=true)");<a name="line.297"></a>
+<span class="sourceLineNo">251</span>  public RegionState toRegionState() {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    return new RegionState(getRegionInfo(), getState(), getLastUpdate(), getRegionLocation());<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>  @Override<a name="line.255"></a>
+<span class="sourceLineNo">256</span>  public int compareTo(final RegionStateNode other) {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    // NOTE: RegionInfo sort by table first, so we are relying on that.<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    // we have a TestRegionState#testOrderedByTable() that check for that.<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    return RegionInfo.COMPARATOR.compare(getRegionInfo(), other.getRegionInfo());<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
+<span class="sourceLineNo">261</span><a name="line.261"></a>
+<span class="sourceLineNo">262</span>  @Override<a name="line.262"></a>
+<span class="sourceLineNo">263</span>  public int hashCode() {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    return getRegionInfo().hashCode();<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  }<a name="line.265"></a>
+<span class="sourceLineNo">266</span><a name="line.266"></a>
+<span class="sourceLineNo">267</span>  @Override<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  public boolean equals(final Object other) {<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    if (this == other) {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      return true;<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    }<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    if (!(other instanceof RegionStateNode)) {<a name="line.272"></a>
+<span class="sourceLineNo">273</span>      return false;<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    }<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    return compareTo((RegionStateNode) other) == 0;<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  }<a name="line.276"></a>
+<span class="sourceLineNo">277</span><a name="line.277"></a>
+<span class="sourceLineNo">278</span>  @Override<a name="line.278"></a>
+<span class="sourceLineNo">279</span>  public String toString() {<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    return toDescriptiveString();<a name="line.280"></a>
+<span class="sourceLineNo">281</span>  }<a name="line.281"></a>
+<span class="sourceLineNo">282</span><a name="line.282"></a>
+<span class="sourceLineNo">283</span>  public String toShortString() {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    // rit= is the current Region-In-Transition State -- see State enum.<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    return String.format("rit=%s, location=%s", getState(), getRegionLocation());<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 String toDescriptiveString() {<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    return String.format("%s, table=%s, region=%s", toShortString(), getTable(),<a name="line.289"></a>
+<span class="sourceLineNo">290</span>      getRegionInfo().getEncodedName());<a name="line.290"></a>
+<span class="sourceLineNo">291</span>  }<a name="line.291"></a>
+<span class="sourceLineNo">292</span><a name="line.292"></a>
+<span class="sourceLineNo">293</span>  public void checkOnline() throws DoNotRetryRegionException {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    RegionInfo ri = getRegionInfo();<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    State s = state;<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    if (s != State.OPEN) {<a name="line.296"></a>
+<span class="sourceLineNo">297</span>      throw new DoNotRetryRegionException(ri.getEncodedName() + " is no OPEN; state=" + s);<a name="line.297"></a>
 <span class="sourceLineNo">298</span>    }<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    if (ri.isSplit()) {<a name="line.299"></a>
-<span class="sourceLineNo">300</span>      throw new DoNotRetryRegionException(ri.getEncodedName() + " has split=true");<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    }<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    if (ri.isOffline()) {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>      // RegionOfflineException is not instance of DNRIOE so wrap it.<a name="line.303"></a>
-<span class="sourceLineNo">304</span>      throw new DoNotRetryRegionException(new RegionOfflineException(ri.getEncodedName()));<a name="line.304"></a>
+<span class="sourceLineNo">299</span>    if (ri.isSplitParent()) {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>      throw new DoNotRetryRegionException(<a name="line.300"></a>
+<span class="sourceLineNo">301</span>        ri.getEncodedName() + " is not online (splitParent=true)");<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    }<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    if (ri.isSplit()) {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>      throw new DoNotRetryRegionException(ri.getEncodedName() + " has split=true");<a name="line.304"></a>
 <span class="sourceLineNo">305</span>    }<a name="line.305"></a>
-<span class="sourceLineNo">306</span>  }<a name="line.306"></a>
-<span class="sourceLineNo">307</span><a name="line.307"></a>
-<span class="sourceLineNo">308</span>  public void lock() {<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    lock.lock();<a name="line.309"></a>
+<span class="sourceLineNo">306</span>    if (ri.isOffline()) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      // RegionOfflineException is not instance of DNRIOE so wrap it.<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      throw new DoNotRetryRegionException(new RegionOfflineException(ri.getEncodedName()));<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    }<a name="line.309"></a>
 <span class="sourceLineNo">310</span>  }<a name="line.310"></a>
 <span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span>  public void unlock() {<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    lock.unlock();<a name="line.313"></a>
+<span class="sourceLineNo">312</span>  public void lock() {<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    lock.lock();<a name="line.313"></a>
 <span class="sourceLineNo">314</span>  }<a name="line.314"></a>
-<span class="sourceLineNo">315</span>}<a name="line.315"></a>
+<span class="sourceLineNo">315</span><a name="line.315"></a>
+<span class="sourceLineNo">316</span>  public void unlock() {<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    lock.unlock();<a name="line.317"></a>
+<span class="sourceLineNo">318</span>  }<a name="line.318"></a>
+<span class="sourceLineNo">319</span>}<a name="line.319"></a>
 
 
 
diff --git a/downloads.html b/downloads.html
index aabf715..679a03f 100644
--- a/downloads.html
+++ b/downloads.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20190212" />
+    <meta name="Date-Revision-yyyymmdd" content="20190213" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Apache HBase Downloads</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -489,7 +489,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2019-02-12</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2019-02-13</li>
             </p>
                 </div>
 
diff --git a/export_control.html b/export_control.html
index 46cdf88..5dbf2c2 100644
--- a/export_control.html
+++ b/export_control.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20190212" />
+    <meta name="Date-Revision-yyyymmdd" content="20190213" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Export Control
@@ -341,7 +341,7 @@ for more details.</p>
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2019-02-12</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2019-02-13</li>
             </p>
                 </div>
 
diff --git a/index.html b/index.html
index 8d75a9e..7fb5653 100644
--- a/index.html
+++ b/index.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20190212" />
+    <meta name="Date-Revision-yyyymmdd" content="20190213" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Apache HBaseâ„¢ Home</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -421,7 +421,7 @@ Apache HBase is an open-source, distributed, versioned, non-relational database
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2019-02-12</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2019-02-13</li>
             </p>
                 </div>
 
diff --git a/integration.html b/integration.html
index 5461b56..c81cacf 100644
--- a/integration.html
+++ b/integration.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20190212" />
+    <meta name="Date-Revision-yyyymmdd" content="20190213" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; CI Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -301,7 +301,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2019-02-12</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2019-02-13</li>
             </p>
                 </div>
 
diff --git a/issue-tracking.html b/issue-tracking.html
index 1411c27..2dd5386 100644
--- a/issue-tracking.html
+++ b/issue-tracking.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20190212" />
+    <meta name="Date-Revision-yyyymmdd" content="20190213" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Issue Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -298,7 +298,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2019-02-12</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2019-02-13</li>
             </p>
                 </div>
 
diff --git a/license.html b/license.html
index 139f4e8..7b2d66f 100644
--- a/license.html
+++ b/license.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20190212" />
+    <meta name="Date-Revision-yyyymmdd" content="20190213" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Licenses</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -501,7 +501,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2019-02-12</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2019-02-13</li>
             </p>
                 </div>
 
diff --git a/mail-lists.html b/mail-lists.html
index e694746..e98f1fd 100644
--- a/mail-lists.html
+++ b/mail-lists.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20190212" />
+    <meta name="Date-Revision-yyyymmdd" content="20190213" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Mailing Lists</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -351,7 +351,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2019-02-12</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2019-02-13</li>
             </p>
                 </div>
 
diff --git a/metrics.html b/metrics.html
index 128a5df..7f74b44 100644
--- a/metrics.html
+++ b/metrics.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20190212" />
+    <meta name="Date-Revision-yyyymmdd" content="20190213" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Apache HBase (TM) Metrics
@@ -469,7 +469,7 @@ export HBASE_REGIONSERVER_OPTS=&quot;$HBASE_JMX_OPTS -Dcom.sun.management.jmxrem
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2019-02-12</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2019-02-13</li>
             </p>
                 </div>
 
diff --git a/old_news.html b/old_news.html
index e0ee103..578e142 100644
--- a/old_news.html
+++ b/old_news.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20190212" />
+    <meta name="Date-Revision-yyyymmdd" content="20190213" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Old Apache HBase (TM) News
@@ -450,7 +450,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2019-02-12</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2019-02-13</li>
             </p>
                 </div>
 
diff --git a/plugin-management.html b/plugin-management.html
index a88f77a..e9d6505 100644
--- a/plugin-management.html
+++ b/plugin-management.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20190212" />
+    <meta name="Date-Revision-yyyymmdd" content="20190213" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Plugin Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -450,7 +450,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2019-02-12</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2019-02-13</li>
             </p>
                 </div>
 
diff --git a/plugins.html b/plugins.html
index bd57160..87ece4e 100644
--- a/plugins.html
+++ b/plugins.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20190212" />
+    <meta name="Date-Revision-yyyymmdd" content="20190213" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Plugins</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -381,7 +381,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2019-02-12</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2019-02-13</li>
             </p>
                 </div>
 
diff --git a/poweredbyhbase.html b/poweredbyhbase.html
index 0dea583..5b16e46 100644
--- a/poweredbyhbase.html
+++ b/poweredbyhbase.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20190212" />
+    <meta name="Date-Revision-yyyymmdd" content="20190213" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Powered By Apache HBase™</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -779,7 +779,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2019-02-12</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2019-02-13</li>
             </p>
                 </div>
 
diff --git a/project-info.html b/project-info.html
index 167def8..66ceccb 100644
--- a/project-info.html
+++ b/project-info.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20190212" />
+    <meta name="Date-Revision-yyyymmdd" content="20190213" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -345,7 +345,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2019-02-12</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2019-02-13</li>
             </p>
                 </div>
 
diff --git a/project-reports.html b/project-reports.html
index 652f47a..5395d82 100644
--- a/project-reports.html
+++ b/project-reports.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20190212" />
+    <meta name="Date-Revision-yyyymmdd" content="20190213" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Generated Reports</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -315,7 +315,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2019-02-12</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2019-02-13</li>
             </p>
                 </div>
 
diff --git a/project-summary.html b/project-summary.html
index ceba051..fb9083c 100644
--- a/project-summary.html
+++ b/project-summary.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20190212" />
+    <meta name="Date-Revision-yyyymmdd" content="20190213" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Summary</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -341,7 +341,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2019-02-12</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2019-02-13</li>
             </p>
                 </div>
 
diff --git a/pseudo-distributed.html b/pseudo-distributed.html
index 77668a6..42ffc74 100644
--- a/pseudo-distributed.html
+++ b/pseudo-distributed.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20190212" />
+    <meta name="Date-Revision-yyyymmdd" content="20190213" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
 Running Apache HBase (TM) in pseudo-distributed mode
@@ -318,7 +318,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2019-02-12</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2019-02-13</li>
             </p>
                 </div>
 
diff --git a/replication.html b/replication.html
index 53d6180..4895b00 100644
--- a/replication.html
+++ b/replication.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20190212" />
+    <meta name="Date-Revision-yyyymmdd" content="20190213" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Apache HBase (TM) Replication
@@ -313,7 +313,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2019-02-12</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2019-02-13</li>
             </p>
                 </div>
 
diff --git a/resources.html b/resources.html
index f6ec919..e7b0346 100644
--- a/resources.html
+++ b/resources.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20190212" />
+    <meta name="Date-Revision-yyyymmdd" content="20190213" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Other Apache HBase (TM) Resources</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -341,7 +341,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2019-02-12</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2019-02-13</li>
             </p>
                 </div>
 
diff --git a/source-repository.html b/source-repository.html
index 8a45028..ae97c99 100644
--- a/source-repository.html
+++ b/source-repository.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20190212" />
+    <meta name="Date-Revision-yyyymmdd" content="20190213" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Source Code Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -309,7 +309,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2019-02-12</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2019-02-13</li>
             </p>
                 </div>
 
diff --git a/sponsors.html b/sponsors.html
index 5bc3da6..b6a484d 100644
--- a/sponsors.html
+++ b/sponsors.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20190212" />
+    <meta name="Date-Revision-yyyymmdd" content="20190213" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Apache HBase™ Sponsors</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -343,7 +343,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2019-02-12</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2019-02-13</li>
             </p>
                 </div>
 
diff --git a/supportingprojects.html b/supportingprojects.html
index 2af379b..0b1a269 100644
--- a/supportingprojects.html
+++ b/supportingprojects.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20190212" />
+    <meta name="Date-Revision-yyyymmdd" content="20190213" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Supporting Projects</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -530,7 +530,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2019-02-12</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2019-02-13</li>
             </p>
                 </div>
 
diff --git a/team-list.html b/team-list.html
index 33ee3a2..d3dace8 100644
--- a/team-list.html
+++ b/team-list.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20190212" />
+    <meta name="Date-Revision-yyyymmdd" content="20190213" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Team</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -782,7 +782,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2019-02-12</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2019-02-13</li>
             </p>
                 </div>
 
diff --git a/testdevapidocs/index-all.html b/testdevapidocs/index-all.html
index 1f02db2..cf96f2e 100644
--- a/testdevapidocs/index-all.html
+++ b/testdevapidocs/index-all.html
@@ -44980,6 +44980,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html#tearDownAfterTest--">tearDownAfterTest()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html" title="class in org.apache.hadoop.hbase.client">TestAsyncNonMetaRegionLocator</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestAsyncRegionLocator.html#tearDownAfterTest--">tearDownAfterTest()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestAsyncRegionLocator.html" title="class in org.apache.hadoop.hbase.client">TestAsyncRegionLocator</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestAsyncTableBatch.html#tearDownAfterTest--">tearDownAfterTest()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestAsyncTableBatch.html" title="class in org.apache.hadoop.hbase.client">TestAsyncTableBatch</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/TestAssignmentManagerUtil.html#tearDownAfterTest--">tearDownAfterTest()</a></span> - Method in class org.apache.hadoop.hbase.master.assignment.<a href="org/apache/hadoop/hbase/master/assignment/TestAssignmentManagerUtil.html" title="class in org.apache.hadoop.hbase.master.assignment">TestAssignmentManagerUtil</a></dt>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.SleepRegionObserver.html b/testdevapidocs/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.SleepRegionObserver.html
index 6ed2827..dc9178e 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.SleepRegionObserver.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.SleepRegionObserver.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.html#line.77">TestAsyncRegionLocator.SleepRegionObserver</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.html#line.78">TestAsyncRegionLocator.SleepRegionObserver</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
 implements org.apache.hadoop.hbase.coprocessor.RegionCoprocessor, org.apache.hadoop.hbase.coprocessor.RegionObserver</pre>
 </li>
@@ -250,7 +250,7 @@ implements org.apache.hadoop.hbase.coprocessor.RegionCoprocessor, org.apache.had
 <ul class="blockListLast">
 <li class="blockList">
 <h4>SleepRegionObserver</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.SleepRegionObserver.html#line.77">SleepRegionObserver</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.SleepRegionObserver.html#line.78">SleepRegionObserver</a>()</pre>
 </li>
 </ul>
 </li>
@@ -267,7 +267,7 @@ implements org.apache.hadoop.hbase.coprocessor.RegionCoprocessor, org.apache.had
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionObserver</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html?is-external=true" title="class or interface in java.util">Optional</a>&lt;org.apache.hadoop.hbase.coprocessor.RegionObserver&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.SleepRegionObserver.html#line.79">getRegionObserver</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html?is-external=true" title="class or interface in java.util">Optional</a>&lt;org.apache.hadoop.hbase.coprocessor.RegionObserver&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.SleepRegionObserver.html#line.80">getRegionObserver</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code>getRegionObserver</code>&nbsp;in interface&nbsp;<code>org.apache.hadoop.hbase.coprocessor.RegionCoprocessor</code></dd>
@@ -280,7 +280,7 @@ implements org.apache.hadoop.hbase.coprocessor.RegionCoprocessor, org.apache.had
 <ul class="blockListLast">
 <li class="blockList">
 <h4>preScannerOpen</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.SleepRegionObserver.html#line.84">preScannerOpen</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;e,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.SleepRegionObserver.html#line.85">preScannerOpen</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;e,
                            org.apache.hadoop.hbase.client.Scan&nbsp;scan)
                     throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.html b/testdevapidocs/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.html
index 04e2a1d..3843855 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":9,"i1":9,"i2":10,"i3":10};
+var methods = {"i0":9,"i1":9,"i2":10,"i3":10,"i4":10};
 var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -109,7 +109,7 @@ var activeTableTab = "activeTableTab";
 <li class="blockList">
 <hr>
 <br>
-<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.html#line.59">TestAsyncRegionLocator</a>
+<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.html#line.60">TestAsyncRegionLocator</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>
@@ -218,10 +218,14 @@ 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/client/TestAsyncRegionLocator.html#testNoCompletionException--">testNoCompletionException</a></span>()</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestAsyncRegionLocator.html#tearDownAfterTest--">tearDownAfterTest</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/client/TestAsyncRegionLocator.html#testNoCompletionException--">testNoCompletionException</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/client/TestAsyncRegionLocator.html#testTimeout--">testTimeout</a></span>()</code>&nbsp;</td>
 </tr>
 </table>
@@ -252,7 +256,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/client/TestAsyncRegionLocator.html#line.62">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/client/TestAsyncRegionLocator.html#line.63">CLASS_RULE</a></pre>
 </li>
 </ul>
 <a name="TEST_UTIL">
@@ -261,7 +265,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>TEST_UTIL</h4>
-<pre>private static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.html#line.65">TEST_UTIL</a></pre>
+<pre>private static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.html#line.66">TEST_UTIL</a></pre>
 </li>
 </ul>
 <a name="TABLE_NAME">
@@ -270,7 +274,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>TABLE_NAME</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.TableName <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.html#line.67">TABLE_NAME</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.TableName <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.html#line.68">TABLE_NAME</a></pre>
 </li>
 </ul>
 <a name="FAMILY">
@@ -279,7 +283,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>FAMILY</h4>
-<pre>private static&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.html#line.69">FAMILY</a></pre>
+<pre>private static&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.html#line.70">FAMILY</a></pre>
 </li>
 </ul>
 <a name="CONN">
@@ -288,7 +292,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>CONN</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.client.AsyncConnectionImpl <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.html#line.71">CONN</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.client.AsyncConnectionImpl <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.html#line.72">CONN</a></pre>
 </li>
 </ul>
 <a name="LOCATOR">
@@ -297,7 +301,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>LOCATOR</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.client.AsyncRegionLocator <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.html#line.73">LOCATOR</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.client.AsyncRegionLocator <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.html#line.74">LOCATOR</a></pre>
 </li>
 </ul>
 <a name="SLEEP_MS">
@@ -306,7 +310,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>SLEEP_MS</h4>
-<pre>private static volatile&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.html#line.75">SLEEP_MS</a></pre>
+<pre>private static volatile&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.html#line.76">SLEEP_MS</a></pre>
 </li>
 </ul>
 </li>
@@ -323,7 +327,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TestAsyncRegionLocator</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.html#line.59">TestAsyncRegionLocator</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.html#line.60">TestAsyncRegionLocator</a>()</pre>
 </li>
 </ul>
 </li>
@@ -340,7 +344,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/client/TestAsyncRegionLocator.html#line.93">setUp</a>()
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.html#line.94">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>
@@ -354,7 +358,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/TestAsyncRegionLocator.html#line.107">tearDown</a>()
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.html#line.108">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>
@@ -362,13 +366,22 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </dl>
 </li>
 </ul>
+<a name="tearDownAfterTest--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>tearDownAfterTest</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.html#line.114">tearDownAfterTest</a>()</pre>
+</li>
+</ul>
 <a name="testTimeout--">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>testTimeout</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.html#line.113">testTimeout</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.html#line.119">testTimeout</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>
@@ -384,7 +397,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testNoCompletionException</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.html#line.136">testNoCompletionException</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.html#line.142">testNoCompletionException</a>()</pre>
 </li>
 </ul>
 </li>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
index f9b0ab1..95e74d8 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
@@ -158,8 +158,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/TestCacheOnWrite.CacheOnWriteType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">TestCacheOnWrite.CacheOnWriteType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/TagUsage.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">TagUsage</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/TestCacheOnWrite.CacheOnWriteType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">TestCacheOnWrite.CacheOnWriteType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
index 9043643..b10fe9a 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
@@ -579,15 +579,15 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">PerformanceEvaluation.Counter</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/RESTApiClusterManager.RoleCommand.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">RESTApiClusterManager.RoleCommand</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/RESTApiClusterManager.Service.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">RESTApiClusterManager.Service</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ScanPerformanceEvaluation.ScanCounter.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ScanPerformanceEvaluation.ScanCounter</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HBaseClusterManager.CommandProvider.Operation.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HBaseClusterManager.CommandProvider.Operation</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/RESTApiClusterManager.Service.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">RESTApiClusterManager.Service</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">PerformanceEvaluation.Counter</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ResourceChecker.Phase.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ResourceChecker.Phase</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ClusterManager.ServiceType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ClusterManager.ServiceType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/RESTApiClusterManager.RoleCommand.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">RESTApiClusterManager.RoleCommand</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/IntegrationTestDDLMasterFailover.ACTION.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">IntegrationTestDDLMasterFailover.ACTION</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/IntegrationTestRegionReplicaPerf.Stat.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">IntegrationTestRegionReplicaPerf.Stat</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/IntegrationTestDDLMasterFailover.ACTION.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">IntegrationTestDDLMasterFailover.ACTION</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ClusterManager.ServiceType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ClusterManager.ServiceType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
index 917c232..541be86 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
@@ -234,10 +234,10 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestStateMachineProcedure.TestSMProcedureState.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestStateMachineProcedure.TestSMProcedureState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineState.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestProcedureBypass.StuckStateMachineState</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestYieldProcedures.TestStateMachineProcedure.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestYieldProcedures.TestStateMachineProcedure.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineState.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestProcedureBypass.StuckStateMachineState</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureRecovery.TestStateMachineProcedure.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestProcedureRecovery.TestStateMachineProcedure.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestStateMachineProcedure.TestSMProcedureState.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestStateMachineProcedure.TestSMProcedureState</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
index 146507c..cee1ae5 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -701,9 +701,9 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestRegionServerReadRequestMetrics.Metric.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestRegionServerReadRequestMetrics.Metric</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestMultiLogThreshold.ActionType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestMultiLogThreshold.ActionType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DataBlockEncodingTool.Manipulation.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">DataBlockEncodingTool.Manipulation</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestMultiLogThreshold.ActionType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestMultiLogThreshold.ActionType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestRegionServerReadRequestMetrics.Metric.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestRegionServerReadRequestMetrics.Metric</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestCacheOnWriteInSchema.CacheOnWriteType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestCacheOnWriteInSchema.CacheOnWriteType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestAtomicOperation.TestStep</span></a></li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
index e60a80c..470c45a 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
@@ -253,10 +253,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.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Generator.Counts.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestBigLinkedList.Generator.Counts</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Verify.Counts.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestBigLinkedList.Verify.Counts</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestWithCellVisibilityLoadAndVerify.Counters.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestWithCellVisibilityLoadAndVerify.Counters</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestLoadAndVerify.Counters.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestLoadAndVerify.Counters</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestWithCellVisibilityLoadAndVerify.Counters.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestWithCellVisibilityLoadAndVerify.Counters</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Generator.Counts.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestBigLinkedList.Generator.Counts</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
index 8539cfa..a9f83d0 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
@@ -148,9 +148,9 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
+<li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/TestWALSplit.Corruptions.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">TestWALSplit.Corruptions</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">IOTestProvider.AllowedOperations</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/FaultyFSLog.FailureType.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">FaultyFSLog.FailureType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/TestWALSplit.Corruptions.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">TestWALSplit.Corruptions</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.SleepRegionObserver.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.SleepRegionObserver.html
index fb39f81..2124f2d 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.SleepRegionObserver.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.SleepRegionObserver.html
@@ -57,107 +57,113 @@
 <span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.49"></a>
 <span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.50"></a>
 <span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.junit.AfterClass;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.junit.BeforeClass;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.junit.ClassRule;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.junit.Test;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.junit.experimental.categories.Category;<a name="line.56"></a>
-<span class="sourceLineNo">057</span><a name="line.57"></a>
-<span class="sourceLineNo">058</span>@Category({ MediumTests.class, ClientTests.class })<a name="line.58"></a>
-<span class="sourceLineNo">059</span>public class TestAsyncRegionLocator {<a name="line.59"></a>
-<span class="sourceLineNo">060</span><a name="line.60"></a>
-<span class="sourceLineNo">061</span>  @ClassRule<a name="line.61"></a>
-<span class="sourceLineNo">062</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.62"></a>
-<span class="sourceLineNo">063</span>    HBaseClassTestRule.forClass(TestAsyncRegionLocator.class);<a name="line.63"></a>
-<span class="sourceLineNo">064</span><a name="line.64"></a>
-<span class="sourceLineNo">065</span>  private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();<a name="line.65"></a>
-<span class="sourceLineNo">066</span><a name="line.66"></a>
-<span class="sourceLineNo">067</span>  private static TableName TABLE_NAME = TableName.valueOf("async");<a name="line.67"></a>
-<span class="sourceLineNo">068</span><a name="line.68"></a>
-<span class="sourceLineNo">069</span>  private static byte[] FAMILY = Bytes.toBytes("cf");<a name="line.69"></a>
-<span class="sourceLineNo">070</span><a name="line.70"></a>
-<span class="sourceLineNo">071</span>  private static AsyncConnectionImpl CONN;<a name="line.71"></a>
-<span class="sourceLineNo">072</span><a name="line.72"></a>
-<span class="sourceLineNo">073</span>  private static AsyncRegionLocator LOCATOR;<a name="line.73"></a>
-<span class="sourceLineNo">074</span><a name="line.74"></a>
-<span class="sourceLineNo">075</span>  private static volatile long SLEEP_MS = 0L;<a name="line.75"></a>
-<span class="sourceLineNo">076</span><a name="line.76"></a>
-<span class="sourceLineNo">077</span>  public static class SleepRegionObserver implements RegionCoprocessor, RegionObserver {<a name="line.77"></a>
-<span class="sourceLineNo">078</span>    @Override<a name="line.78"></a>
-<span class="sourceLineNo">079</span>    public Optional&lt;RegionObserver&gt; getRegionObserver() {<a name="line.79"></a>
-<span class="sourceLineNo">080</span>      return Optional.of(this);<a name="line.80"></a>
-<span class="sourceLineNo">081</span>    }<a name="line.81"></a>
-<span class="sourceLineNo">082</span><a name="line.82"></a>
-<span class="sourceLineNo">083</span>    @Override<a name="line.83"></a>
-<span class="sourceLineNo">084</span>    public void preScannerOpen(ObserverContext&lt;RegionCoprocessorEnvironment&gt; e, Scan scan)<a name="line.84"></a>
-<span class="sourceLineNo">085</span>        throws IOException {<a name="line.85"></a>
-<span class="sourceLineNo">086</span>      if (SLEEP_MS &gt; 0) {<a name="line.86"></a>
-<span class="sourceLineNo">087</span>        Threads.sleepWithoutInterrupt(SLEEP_MS);<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>  }<a name="line.90"></a>
-<span class="sourceLineNo">091</span><a name="line.91"></a>
-<span class="sourceLineNo">092</span>  @BeforeClass<a name="line.92"></a>
-<span class="sourceLineNo">093</span>  public static void setUp() throws Exception {<a name="line.93"></a>
-<span class="sourceLineNo">094</span>    Configuration conf = TEST_UTIL.getConfiguration();<a name="line.94"></a>
-<span class="sourceLineNo">095</span>    conf.set(REGION_COPROCESSOR_CONF_KEY, SleepRegionObserver.class.getName());<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    conf.setLong(HBASE_CLIENT_META_OPERATION_TIMEOUT, 2000);<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    TEST_UTIL.startMiniCluster(1);<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    TEST_UTIL.createTable(TABLE_NAME, FAMILY);<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    TEST_UTIL.waitTableAvailable(TABLE_NAME);<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    AsyncRegistry registry = AsyncRegistryFactory.getRegistry(TEST_UTIL.getConfiguration());<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    CONN = new AsyncConnectionImpl(TEST_UTIL.getConfiguration(), registry,<a name="line.101"></a>
-<span class="sourceLineNo">102</span>      registry.getClusterId().get(), User.getCurrent());<a name="line.102"></a>
-<span class="sourceLineNo">103</span>    LOCATOR = CONN.getLocator();<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>  @AfterClass<a name="line.106"></a>
-<span class="sourceLineNo">107</span>  public static void tearDown() throws Exception {<a name="line.107"></a>
-<span class="sourceLineNo">108</span>    IOUtils.closeQuietly(CONN);<a name="line.108"></a>
-<span class="sourceLineNo">109</span>    TEST_UTIL.shutdownMiniCluster();<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>  @Test<a name="line.112"></a>
-<span class="sourceLineNo">113</span>  public void testTimeout() throws InterruptedException, ExecutionException {<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    SLEEP_MS = 1000;<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    long startNs = System.nanoTime();<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    try {<a name="line.116"></a>
-<span class="sourceLineNo">117</span>      LOCATOR.getRegionLocation(TABLE_NAME, EMPTY_START_ROW, RegionLocateType.CURRENT,<a name="line.117"></a>
-<span class="sourceLineNo">118</span>        TimeUnit.MILLISECONDS.toNanos(500)).get();<a name="line.118"></a>
-<span class="sourceLineNo">119</span>      fail();<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    } catch (ExecutionException e) {<a name="line.120"></a>
-<span class="sourceLineNo">121</span>      assertThat(e.getCause(), instanceOf(TimeoutIOException.class));<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    }<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    long costMs = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNs);<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    assertTrue(costMs &gt;= 500);<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    assertTrue(costMs &lt; 1000);<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    // wait for the background task finish<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    Thread.sleep(2000);<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    // Now the location should be in cache, so we will not visit meta again.<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    HRegionLocation loc = LOCATOR.getRegionLocation(TABLE_NAME, EMPTY_START_ROW,<a name="line.129"></a>
-<span class="sourceLineNo">130</span>      RegionLocateType.CURRENT, TimeUnit.MILLISECONDS.toNanos(500)).get();<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    assertEquals(loc.getServerName(),<a name="line.131"></a>
-<span class="sourceLineNo">132</span>      TEST_UTIL.getHBaseCluster().getRegionServer(0).getServerName());<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  }<a name="line.133"></a>
-<span class="sourceLineNo">134</span><a name="line.134"></a>
-<span class="sourceLineNo">135</span>  @Test<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  public void testNoCompletionException() {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    // make sure that we do not get CompletionException<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    SLEEP_MS = 0;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    AtomicReference&lt;Throwable&gt; errorHolder = new AtomicReference&lt;&gt;();<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    try {<a name="line.140"></a>
-<span class="sourceLineNo">141</span>      LOCATOR.getRegionLocation(TableName.valueOf("NotExist"), EMPTY_START_ROW,<a name="line.141"></a>
-<span class="sourceLineNo">142</span>        RegionLocateType.CURRENT, TimeUnit.SECONDS.toNanos(1))<a name="line.142"></a>
-<span class="sourceLineNo">143</span>        .whenComplete((r, e) -&gt; errorHolder.set(e)).join();<a name="line.143"></a>
-<span class="sourceLineNo">144</span>      fail();<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    } catch (CompletionException e) {<a name="line.145"></a>
-<span class="sourceLineNo">146</span>      // join will return a CompletionException, which is OK<a name="line.146"></a>
-<span class="sourceLineNo">147</span>      assertThat(e.getCause(), instanceOf(TableNotFoundException.class));<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    }<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    // but we need to make sure that we do not get a CompletionException in the callback<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    assertThat(errorHolder.get(), instanceOf(TableNotFoundException.class));<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  }<a name="line.151"></a>
-<span class="sourceLineNo">152</span>}<a name="line.152"></a>
+<span class="sourceLineNo">052</span>import org.junit.After;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.junit.AfterClass;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.junit.BeforeClass;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.junit.ClassRule;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.junit.Test;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.junit.experimental.categories.Category;<a name="line.57"></a>
+<span class="sourceLineNo">058</span><a name="line.58"></a>
+<span class="sourceLineNo">059</span>@Category({ MediumTests.class, ClientTests.class })<a name="line.59"></a>
+<span class="sourceLineNo">060</span>public class TestAsyncRegionLocator {<a name="line.60"></a>
+<span class="sourceLineNo">061</span><a name="line.61"></a>
+<span class="sourceLineNo">062</span>  @ClassRule<a name="line.62"></a>
+<span class="sourceLineNo">063</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.63"></a>
+<span class="sourceLineNo">064</span>    HBaseClassTestRule.forClass(TestAsyncRegionLocator.class);<a name="line.64"></a>
+<span class="sourceLineNo">065</span><a name="line.65"></a>
+<span class="sourceLineNo">066</span>  private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();<a name="line.66"></a>
+<span class="sourceLineNo">067</span><a name="line.67"></a>
+<span class="sourceLineNo">068</span>  private static TableName TABLE_NAME = TableName.valueOf("async");<a name="line.68"></a>
+<span class="sourceLineNo">069</span><a name="line.69"></a>
+<span class="sourceLineNo">070</span>  private static byte[] FAMILY = Bytes.toBytes("cf");<a name="line.70"></a>
+<span class="sourceLineNo">071</span><a name="line.71"></a>
+<span class="sourceLineNo">072</span>  private static AsyncConnectionImpl CONN;<a name="line.72"></a>
+<span class="sourceLineNo">073</span><a name="line.73"></a>
+<span class="sourceLineNo">074</span>  private static AsyncRegionLocator LOCATOR;<a name="line.74"></a>
+<span class="sourceLineNo">075</span><a name="line.75"></a>
+<span class="sourceLineNo">076</span>  private static volatile long SLEEP_MS = 0L;<a name="line.76"></a>
+<span class="sourceLineNo">077</span><a name="line.77"></a>
+<span class="sourceLineNo">078</span>  public static class SleepRegionObserver implements RegionCoprocessor, RegionObserver {<a name="line.78"></a>
+<span class="sourceLineNo">079</span>    @Override<a name="line.79"></a>
+<span class="sourceLineNo">080</span>    public Optional&lt;RegionObserver&gt; getRegionObserver() {<a name="line.80"></a>
+<span class="sourceLineNo">081</span>      return Optional.of(this);<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>    @Override<a name="line.84"></a>
+<span class="sourceLineNo">085</span>    public void preScannerOpen(ObserverContext&lt;RegionCoprocessorEnvironment&gt; e, Scan scan)<a name="line.85"></a>
+<span class="sourceLineNo">086</span>        throws IOException {<a name="line.86"></a>
+<span class="sourceLineNo">087</span>      if (SLEEP_MS &gt; 0) {<a name="line.87"></a>
+<span class="sourceLineNo">088</span>        Threads.sleepWithoutInterrupt(SLEEP_MS);<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>  }<a name="line.91"></a>
+<span class="sourceLineNo">092</span><a name="line.92"></a>
+<span class="sourceLineNo">093</span>  @BeforeClass<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  public static void setUp() throws Exception {<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    Configuration conf = TEST_UTIL.getConfiguration();<a name="line.95"></a>
+<span class="sourceLineNo">096</span>    conf.set(REGION_COPROCESSOR_CONF_KEY, SleepRegionObserver.class.getName());<a name="line.96"></a>
+<span class="sourceLineNo">097</span>    conf.setLong(HBASE_CLIENT_META_OPERATION_TIMEOUT, 2000);<a name="line.97"></a>
+<span class="sourceLineNo">098</span>    TEST_UTIL.startMiniCluster(1);<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    TEST_UTIL.createTable(TABLE_NAME, FAMILY);<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    TEST_UTIL.waitTableAvailable(TABLE_NAME);<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    AsyncRegistry registry = AsyncRegistryFactory.getRegistry(TEST_UTIL.getConfiguration());<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    CONN = new AsyncConnectionImpl(TEST_UTIL.getConfiguration(), registry,<a name="line.102"></a>
+<span class="sourceLineNo">103</span>      registry.getClusterId().get(), User.getCurrent());<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    LOCATOR = CONN.getLocator();<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 Exception {<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    IOUtils.closeQuietly(CONN);<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    TEST_UTIL.shutdownMiniCluster();<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>  @After<a name="line.113"></a>
+<span class="sourceLineNo">114</span>  public void tearDownAfterTest() {<a name="line.114"></a>
+<span class="sourceLineNo">115</span>    LOCATOR.clearCache();<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>  @Test<a name="line.118"></a>
+<span class="sourceLineNo">119</span>  public void testTimeout() throws InterruptedException, ExecutionException {<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    SLEEP_MS = 1000;<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    long startNs = System.nanoTime();<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    try {<a name="line.122"></a>
+<span class="sourceLineNo">123</span>      LOCATOR.getRegionLocation(TABLE_NAME, EMPTY_START_ROW, RegionLocateType.CURRENT,<a name="line.123"></a>
+<span class="sourceLineNo">124</span>        TimeUnit.MILLISECONDS.toNanos(500)).get();<a name="line.124"></a>
+<span class="sourceLineNo">125</span>      fail();<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    } catch (ExecutionException e) {<a name="line.126"></a>
+<span class="sourceLineNo">127</span>      assertThat(e.getCause(), instanceOf(TimeoutIOException.class));<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    }<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    long costMs = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNs);<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    assertTrue(costMs &gt;= 500);<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    assertTrue(costMs &lt; 1000);<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    // wait for the background task finish<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    Thread.sleep(2000);<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    // Now the location should be in cache, so we will not visit meta again.<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    HRegionLocation loc = LOCATOR.getRegionLocation(TABLE_NAME, EMPTY_START_ROW,<a name="line.135"></a>
+<span class="sourceLineNo">136</span>      RegionLocateType.CURRENT, TimeUnit.MILLISECONDS.toNanos(500)).get();<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    assertEquals(loc.getServerName(),<a name="line.137"></a>
+<span class="sourceLineNo">138</span>      TEST_UTIL.getHBaseCluster().getRegionServer(0).getServerName());<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  }<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>  @Test<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public void testNoCompletionException() {<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    // make sure that we do not get CompletionException<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    SLEEP_MS = 0;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    AtomicReference&lt;Throwable&gt; errorHolder = new AtomicReference&lt;&gt;();<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    try {<a name="line.146"></a>
+<span class="sourceLineNo">147</span>      LOCATOR.getRegionLocation(TableName.valueOf("NotExist"), EMPTY_START_ROW,<a name="line.147"></a>
+<span class="sourceLineNo">148</span>        RegionLocateType.CURRENT, TimeUnit.SECONDS.toNanos(1))<a name="line.148"></a>
+<span class="sourceLineNo">149</span>        .whenComplete((r, e) -&gt; errorHolder.set(e)).join();<a name="line.149"></a>
+<span class="sourceLineNo">150</span>      fail();<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    } catch (CompletionException e) {<a name="line.151"></a>
+<span class="sourceLineNo">152</span>      // join will return a CompletionException, which is OK<a name="line.152"></a>
+<span class="sourceLineNo">153</span>      assertThat(e.getCause(), instanceOf(TableNotFoundException.class));<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    }<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    // but we need to make sure that we do not get a CompletionException in the callback<a name="line.155"></a>
+<span class="sourceLineNo">156</span>    assertThat(errorHolder.get(), instanceOf(TableNotFoundException.class));<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  }<a name="line.157"></a>
+<span class="sourceLineNo">158</span>}<a name="line.158"></a>
 
 
 
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.html
index fb39f81..2124f2d 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.html
@@ -57,107 +57,113 @@
 <span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.49"></a>
 <span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.50"></a>
 <span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.junit.AfterClass;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.junit.BeforeClass;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.junit.ClassRule;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.junit.Test;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.junit.experimental.categories.Category;<a name="line.56"></a>
-<span class="sourceLineNo">057</span><a name="line.57"></a>
-<span class="sourceLineNo">058</span>@Category({ MediumTests.class, ClientTests.class })<a name="line.58"></a>
-<span class="sourceLineNo">059</span>public class TestAsyncRegionLocator {<a name="line.59"></a>
-<span class="sourceLineNo">060</span><a name="line.60"></a>
-<span class="sourceLineNo">061</span>  @ClassRule<a name="line.61"></a>
-<span class="sourceLineNo">062</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.62"></a>
-<span class="sourceLineNo">063</span>    HBaseClassTestRule.forClass(TestAsyncRegionLocator.class);<a name="line.63"></a>
-<span class="sourceLineNo">064</span><a name="line.64"></a>
-<span class="sourceLineNo">065</span>  private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();<a name="line.65"></a>
-<span class="sourceLineNo">066</span><a name="line.66"></a>
-<span class="sourceLineNo">067</span>  private static TableName TABLE_NAME = TableName.valueOf("async");<a name="line.67"></a>
-<span class="sourceLineNo">068</span><a name="line.68"></a>
-<span class="sourceLineNo">069</span>  private static byte[] FAMILY = Bytes.toBytes("cf");<a name="line.69"></a>
-<span class="sourceLineNo">070</span><a name="line.70"></a>
-<span class="sourceLineNo">071</span>  private static AsyncConnectionImpl CONN;<a name="line.71"></a>
-<span class="sourceLineNo">072</span><a name="line.72"></a>
-<span class="sourceLineNo">073</span>  private static AsyncRegionLocator LOCATOR;<a name="line.73"></a>
-<span class="sourceLineNo">074</span><a name="line.74"></a>
-<span class="sourceLineNo">075</span>  private static volatile long SLEEP_MS = 0L;<a name="line.75"></a>
-<span class="sourceLineNo">076</span><a name="line.76"></a>
-<span class="sourceLineNo">077</span>  public static class SleepRegionObserver implements RegionCoprocessor, RegionObserver {<a name="line.77"></a>
-<span class="sourceLineNo">078</span>    @Override<a name="line.78"></a>
-<span class="sourceLineNo">079</span>    public Optional&lt;RegionObserver&gt; getRegionObserver() {<a name="line.79"></a>
-<span class="sourceLineNo">080</span>      return Optional.of(this);<a name="line.80"></a>
-<span class="sourceLineNo">081</span>    }<a name="line.81"></a>
-<span class="sourceLineNo">082</span><a name="line.82"></a>
-<span class="sourceLineNo">083</span>    @Override<a name="line.83"></a>
-<span class="sourceLineNo">084</span>    public void preScannerOpen(ObserverContext&lt;RegionCoprocessorEnvironment&gt; e, Scan scan)<a name="line.84"></a>
-<span class="sourceLineNo">085</span>        throws IOException {<a name="line.85"></a>
-<span class="sourceLineNo">086</span>      if (SLEEP_MS &gt; 0) {<a name="line.86"></a>
-<span class="sourceLineNo">087</span>        Threads.sleepWithoutInterrupt(SLEEP_MS);<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>  }<a name="line.90"></a>
-<span class="sourceLineNo">091</span><a name="line.91"></a>
-<span class="sourceLineNo">092</span>  @BeforeClass<a name="line.92"></a>
-<span class="sourceLineNo">093</span>  public static void setUp() throws Exception {<a name="line.93"></a>
-<span class="sourceLineNo">094</span>    Configuration conf = TEST_UTIL.getConfiguration();<a name="line.94"></a>
-<span class="sourceLineNo">095</span>    conf.set(REGION_COPROCESSOR_CONF_KEY, SleepRegionObserver.class.getName());<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    conf.setLong(HBASE_CLIENT_META_OPERATION_TIMEOUT, 2000);<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    TEST_UTIL.startMiniCluster(1);<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    TEST_UTIL.createTable(TABLE_NAME, FAMILY);<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    TEST_UTIL.waitTableAvailable(TABLE_NAME);<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    AsyncRegistry registry = AsyncRegistryFactory.getRegistry(TEST_UTIL.getConfiguration());<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    CONN = new AsyncConnectionImpl(TEST_UTIL.getConfiguration(), registry,<a name="line.101"></a>
-<span class="sourceLineNo">102</span>      registry.getClusterId().get(), User.getCurrent());<a name="line.102"></a>
-<span class="sourceLineNo">103</span>    LOCATOR = CONN.getLocator();<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>  @AfterClass<a name="line.106"></a>
-<span class="sourceLineNo">107</span>  public static void tearDown() throws Exception {<a name="line.107"></a>
-<span class="sourceLineNo">108</span>    IOUtils.closeQuietly(CONN);<a name="line.108"></a>
-<span class="sourceLineNo">109</span>    TEST_UTIL.shutdownMiniCluster();<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>  @Test<a name="line.112"></a>
-<span class="sourceLineNo">113</span>  public void testTimeout() throws InterruptedException, ExecutionException {<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    SLEEP_MS = 1000;<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    long startNs = System.nanoTime();<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    try {<a name="line.116"></a>
-<span class="sourceLineNo">117</span>      LOCATOR.getRegionLocation(TABLE_NAME, EMPTY_START_ROW, RegionLocateType.CURRENT,<a name="line.117"></a>
-<span class="sourceLineNo">118</span>        TimeUnit.MILLISECONDS.toNanos(500)).get();<a name="line.118"></a>
-<span class="sourceLineNo">119</span>      fail();<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    } catch (ExecutionException e) {<a name="line.120"></a>
-<span class="sourceLineNo">121</span>      assertThat(e.getCause(), instanceOf(TimeoutIOException.class));<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    }<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    long costMs = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNs);<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    assertTrue(costMs &gt;= 500);<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    assertTrue(costMs &lt; 1000);<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    // wait for the background task finish<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    Thread.sleep(2000);<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    // Now the location should be in cache, so we will not visit meta again.<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    HRegionLocation loc = LOCATOR.getRegionLocation(TABLE_NAME, EMPTY_START_ROW,<a name="line.129"></a>
-<span class="sourceLineNo">130</span>      RegionLocateType.CURRENT, TimeUnit.MILLISECONDS.toNanos(500)).get();<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    assertEquals(loc.getServerName(),<a name="line.131"></a>
-<span class="sourceLineNo">132</span>      TEST_UTIL.getHBaseCluster().getRegionServer(0).getServerName());<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  }<a name="line.133"></a>
-<span class="sourceLineNo">134</span><a name="line.134"></a>
-<span class="sourceLineNo">135</span>  @Test<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  public void testNoCompletionException() {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    // make sure that we do not get CompletionException<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    SLEEP_MS = 0;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    AtomicReference&lt;Throwable&gt; errorHolder = new AtomicReference&lt;&gt;();<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    try {<a name="line.140"></a>
-<span class="sourceLineNo">141</span>      LOCATOR.getRegionLocation(TableName.valueOf("NotExist"), EMPTY_START_ROW,<a name="line.141"></a>
-<span class="sourceLineNo">142</span>        RegionLocateType.CURRENT, TimeUnit.SECONDS.toNanos(1))<a name="line.142"></a>
-<span class="sourceLineNo">143</span>        .whenComplete((r, e) -&gt; errorHolder.set(e)).join();<a name="line.143"></a>
-<span class="sourceLineNo">144</span>      fail();<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    } catch (CompletionException e) {<a name="line.145"></a>
-<span class="sourceLineNo">146</span>      // join will return a CompletionException, which is OK<a name="line.146"></a>
-<span class="sourceLineNo">147</span>      assertThat(e.getCause(), instanceOf(TableNotFoundException.class));<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    }<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    // but we need to make sure that we do not get a CompletionException in the callback<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    assertThat(errorHolder.get(), instanceOf(TableNotFoundException.class));<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  }<a name="line.151"></a>
-<span class="sourceLineNo">152</span>}<a name="line.152"></a>
+<span class="sourceLineNo">052</span>import org.junit.After;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.junit.AfterClass;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.junit.BeforeClass;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.junit.ClassRule;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.junit.Test;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.junit.experimental.categories.Category;<a name="line.57"></a>
+<span class="sourceLineNo">058</span><a name="line.58"></a>
+<span class="sourceLineNo">059</span>@Category({ MediumTests.class, ClientTests.class })<a name="line.59"></a>
+<span class="sourceLineNo">060</span>public class TestAsyncRegionLocator {<a name="line.60"></a>
+<span class="sourceLineNo">061</span><a name="line.61"></a>
+<span class="sourceLineNo">062</span>  @ClassRule<a name="line.62"></a>
+<span class="sourceLineNo">063</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.63"></a>
+<span class="sourceLineNo">064</span>    HBaseClassTestRule.forClass(TestAsyncRegionLocator.class);<a name="line.64"></a>
+<span class="sourceLineNo">065</span><a name="line.65"></a>
+<span class="sourceLineNo">066</span>  private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();<a name="line.66"></a>
+<span class="sourceLineNo">067</span><a name="line.67"></a>
+<span class="sourceLineNo">068</span>  private static TableName TABLE_NAME = TableName.valueOf("async");<a name="line.68"></a>
+<span class="sourceLineNo">069</span><a name="line.69"></a>
+<span class="sourceLineNo">070</span>  private static byte[] FAMILY = Bytes.toBytes("cf");<a name="line.70"></a>
+<span class="sourceLineNo">071</span><a name="line.71"></a>
+<span class="sourceLineNo">072</span>  private static AsyncConnectionImpl CONN;<a name="line.72"></a>
+<span class="sourceLineNo">073</span><a name="line.73"></a>
+<span class="sourceLineNo">074</span>  private static AsyncRegionLocator LOCATOR;<a name="line.74"></a>
+<span class="sourceLineNo">075</span><a name="line.75"></a>
+<span class="sourceLineNo">076</span>  private static volatile long SLEEP_MS = 0L;<a name="line.76"></a>
+<span class="sourceLineNo">077</span><a name="line.77"></a>
+<span class="sourceLineNo">078</span>  public static class SleepRegionObserver implements RegionCoprocessor, RegionObserver {<a name="line.78"></a>
+<span class="sourceLineNo">079</span>    @Override<a name="line.79"></a>
+<span class="sourceLineNo">080</span>    public Optional&lt;RegionObserver&gt; getRegionObserver() {<a name="line.80"></a>
+<span class="sourceLineNo">081</span>      return Optional.of(this);<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>    @Override<a name="line.84"></a>
+<span class="sourceLineNo">085</span>    public void preScannerOpen(ObserverContext&lt;RegionCoprocessorEnvironment&gt; e, Scan scan)<a name="line.85"></a>
+<span class="sourceLineNo">086</span>        throws IOException {<a name="line.86"></a>
+<span class="sourceLineNo">087</span>      if (SLEEP_MS &gt; 0) {<a name="line.87"></a>
+<span class="sourceLineNo">088</span>        Threads.sleepWithoutInterrupt(SLEEP_MS);<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>  }<a name="line.91"></a>
+<span class="sourceLineNo">092</span><a name="line.92"></a>
+<span class="sourceLineNo">093</span>  @BeforeClass<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  public static void setUp() throws Exception {<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    Configuration conf = TEST_UTIL.getConfiguration();<a name="line.95"></a>
+<span class="sourceLineNo">096</span>    conf.set(REGION_COPROCESSOR_CONF_KEY, SleepRegionObserver.class.getName());<a name="line.96"></a>
+<span class="sourceLineNo">097</span>    conf.setLong(HBASE_CLIENT_META_OPERATION_TIMEOUT, 2000);<a name="line.97"></a>
+<span class="sourceLineNo">098</span>    TEST_UTIL.startMiniCluster(1);<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    TEST_UTIL.createTable(TABLE_NAME, FAMILY);<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    TEST_UTIL.waitTableAvailable(TABLE_NAME);<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    AsyncRegistry registry = AsyncRegistryFactory.getRegistry(TEST_UTIL.getConfiguration());<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    CONN = new AsyncConnectionImpl(TEST_UTIL.getConfiguration(), registry,<a name="line.102"></a>
+<span class="sourceLineNo">103</span>      registry.getClusterId().get(), User.getCurrent());<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    LOCATOR = CONN.getLocator();<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 Exception {<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    IOUtils.closeQuietly(CONN);<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    TEST_UTIL.shutdownMiniCluster();<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>  @After<a name="line.113"></a>
+<span class="sourceLineNo">114</span>  public void tearDownAfterTest() {<a name="line.114"></a>
+<span class="sourceLineNo">115</span>    LOCATOR.clearCache();<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>  @Test<a name="line.118"></a>
+<span class="sourceLineNo">119</span>  public void testTimeout() throws InterruptedException, ExecutionException {<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    SLEEP_MS = 1000;<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    long startNs = System.nanoTime();<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    try {<a name="line.122"></a>
+<span class="sourceLineNo">123</span>      LOCATOR.getRegionLocation(TABLE_NAME, EMPTY_START_ROW, RegionLocateType.CURRENT,<a name="line.123"></a>
+<span class="sourceLineNo">124</span>        TimeUnit.MILLISECONDS.toNanos(500)).get();<a name="line.124"></a>
+<span class="sourceLineNo">125</span>      fail();<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    } catch (ExecutionException e) {<a name="line.126"></a>
+<span class="sourceLineNo">127</span>      assertThat(e.getCause(), instanceOf(TimeoutIOException.class));<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    }<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    long costMs = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNs);<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    assertTrue(costMs &gt;= 500);<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    assertTrue(costMs &lt; 1000);<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    // wait for the background task finish<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    Thread.sleep(2000);<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    // Now the location should be in cache, so we will not visit meta again.<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    HRegionLocation loc = LOCATOR.getRegionLocation(TABLE_NAME, EMPTY_START_ROW,<a name="line.135"></a>
+<span class="sourceLineNo">136</span>      RegionLocateType.CURRENT, TimeUnit.MILLISECONDS.toNanos(500)).get();<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    assertEquals(loc.getServerName(),<a name="line.137"></a>
+<span class="sourceLineNo">138</span>      TEST_UTIL.getHBaseCluster().getRegionServer(0).getServerName());<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  }<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>  @Test<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public void testNoCompletionException() {<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    // make sure that we do not get CompletionException<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    SLEEP_MS = 0;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    AtomicReference&lt;Throwable&gt; errorHolder = new AtomicReference&lt;&gt;();<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    try {<a name="line.146"></a>
+<span class="sourceLineNo">147</span>      LOCATOR.getRegionLocation(TableName.valueOf("NotExist"), EMPTY_START_ROW,<a name="line.147"></a>
+<span class="sourceLineNo">148</span>        RegionLocateType.CURRENT, TimeUnit.SECONDS.toNanos(1))<a name="line.148"></a>
+<span class="sourceLineNo">149</span>        .whenComplete((r, e) -&gt; errorHolder.set(e)).join();<a name="line.149"></a>
+<span class="sourceLineNo">150</span>      fail();<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    } catch (CompletionException e) {<a name="line.151"></a>
+<span class="sourceLineNo">152</span>      // join will return a CompletionException, which is OK<a name="line.152"></a>
+<span class="sourceLineNo">153</span>      assertThat(e.getCause(), instanceOf(TableNotFoundException.class));<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    }<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    // but we need to make sure that we do not get a CompletionException in the callback<a name="line.155"></a>
+<span class="sourceLineNo">156</span>    assertThat(errorHolder.get(), instanceOf(TableNotFoundException.class));<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  }<a name="line.157"></a>
+<span class="sourceLineNo">158</span>}<a name="line.158"></a>