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

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

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 b77546b  Published site at 62ad94c2b5d278210d24329850402c22c26c928c.
b77546b is described below

commit b77546bbca6616df738a7cd10cad3993e1e65cb1
Author: jenkins <bu...@apache.org>
AuthorDate: Mon May 13 14:50:18 2019 +0000

    Published site at 62ad94c2b5d278210d24329850402c22c26c928c.
---
 acid-semantics.html                                |    2 +-
 apache_hbase_reference_guide.pdf                   |    4 +-
 book.html                                          |    2 +-
 bulk-loads.html                                    |    2 +-
 checkstyle-aggregate.html                          |   22 +-
 checkstyle.rss                                     |   16 +-
 coc.html                                           |    2 +-
 dependencies.html                                  |    2 +-
 dependency-convergence.html                        |    2 +-
 dependency-info.html                               |    2 +-
 dependency-management.html                         |    2 +-
 devapidocs/constant-values.html                    |    4 +-
 devapidocs/index-all.html                          |   44 +-
 .../apache/hadoop/hbase/backup/package-tree.html   |    4 +-
 .../apache/hadoop/hbase/client/package-tree.html   |   24 +-
 .../hadoop/hbase/coprocessor/package-tree.html     |    2 +-
 .../class-use/UnexpectedStateException.html        |   24 +-
 .../apache/hadoop/hbase/executor/package-tree.html |    2 +-
 .../apache/hadoop/hbase/filter/package-tree.html   |    8 +-
 .../org/apache/hadoop/hbase/http/package-tree.html |    4 +-
 .../apache/hadoop/hbase/io/hfile/package-tree.html |    2 +-
 .../org/apache/hadoop/hbase/ipc/package-tree.html  |    2 +-
 .../hadoop/hbase/mapreduce/package-tree.html       |    4 +-
 .../AssignmentManager.RegionInTransitionChore.html |    6 +-
 .../AssignmentManager.RegionInTransitionStat.html  |   40 +-
 .../hbase/master/assignment/AssignmentManager.html |  340 +-
 .../master/assignment/CloseRegionProcedure.html    |  102 +-
 .../master/assignment/OpenRegionProcedure.html     |  126 +-
 .../assignment/RegionRemoteProcedureBase.html      |  149 +-
 ...TransitRegionStateProcedure.TransitionType.html |   10 +-
 .../assignment/TransitRegionStateProcedure.html    |   53 +-
 .../assignment/class-use/AssignmentManager.html    |   35 +
 .../assignment/class-use/RegionStateNode.html      |  134 +-
 .../hbase/master/assignment/package-tree.html      |    2 +-
 .../hadoop/hbase/master/balancer/package-tree.html |    2 +-
 .../apache/hadoop/hbase/master/package-tree.html   |    6 +-
 .../procedure/class-use/MasterProcedureEnv.html    |   24 +-
 .../hbase/master/procedure/package-tree.html       |    2 +-
 .../hadoop/hbase/monitoring/package-tree.html      |    2 +-
 .../org/apache/hadoop/hbase/package-tree.html      |   16 +-
 .../hadoop/hbase/procedure2/package-tree.html      |    6 +-
 .../apache/hadoop/hbase/quotas/package-tree.html   |    4 +-
 .../hadoop/hbase/regionserver/package-tree.html    |   20 +-
 .../regionserver/querymatcher/package-tree.html    |    4 +-
 .../hbase/regionserver/wal/package-tree.html       |    6 +-
 .../replication/regionserver/package-tree.html     |    2 +-
 .../hadoop/hbase/rest/model/package-tree.html      |    2 +-
 .../hadoop/hbase/security/access/package-tree.html |    2 +-
 .../apache/hadoop/hbase/security/package-tree.html |    4 +-
 .../org/apache/hadoop/hbase/util/package-tree.html |    8 +-
 .../org/apache/hadoop/hbase/wal/package-tree.html  |    2 +-
 .../src-html/org/apache/hadoop/hbase/Version.html  |    4 +-
 .../AssignmentManager.RegionInTransitionChore.html | 3371 ++++++++++----------
 .../AssignmentManager.RegionInTransitionStat.html  | 3371 ++++++++++----------
 .../hbase/master/assignment/AssignmentManager.html | 3371 ++++++++++----------
 .../master/assignment/CloseRegionProcedure.html    |  178 +-
 .../master/assignment/OpenRegionProcedure.html     |  216 +-
 .../assignment/RegionRemoteProcedureBase.html      |  345 +-
 ...TransitRegionStateProcedure.TransitionType.html |  287 +-
 .../assignment/TransitRegionStateProcedure.html    |  287 +-
 .../HRegion.BatchOperation.Visitor.html            |    2 +-
 .../hbase/regionserver/HRegion.BatchOperation.html |    2 +-
 .../regionserver/HRegion.BulkLoadListener.html     |    2 +-
 .../regionserver/HRegion.FlushResult.Result.html   |    2 +-
 .../hbase/regionserver/HRegion.FlushResult.html    |    2 +-
 .../regionserver/HRegion.FlushResultImpl.html      |    2 +-
 .../HRegion.MutationBatchOperation.html            |    2 +-
 .../HRegion.ObservedExceptionsInBatch.html         |    2 +-
 .../regionserver/HRegion.PrepareFlushResult.html   |    2 +-
 .../regionserver/HRegion.RegionScannerImpl.html    |    2 +-
 .../regionserver/HRegion.ReplayBatchOperation.html |    2 +-
 .../hbase/regionserver/HRegion.RowLockContext.html |    2 +-
 .../hbase/regionserver/HRegion.RowLockImpl.html    |    2 +-
 .../hbase/regionserver/HRegion.WriteState.html     |    2 +-
 .../apache/hadoop/hbase/regionserver/HRegion.html  |    2 +-
 .../regionserver/HStore.StoreFlusherImpl.html      |    2 +-
 .../apache/hadoop/hbase/regionserver/HStore.html   |    2 +-
 .../LoadIncrementalHFiles.BulkHFileVisitor.html    |    2 +-
 .../tool/LoadIncrementalHFiles.LoadQueueItem.html  |    2 +-
 .../hadoop/hbase/tool/LoadIncrementalHFiles.html   |    2 +-
 downloads.html                                     |    2 +-
 export_control.html                                |    2 +-
 index.html                                         |    2 +-
 issue-management.html                              |    2 +-
 licenses.html                                      |    2 +-
 mailing-lists.html                                 |    2 +-
 metrics.html                                       |    2 +-
 old_news.html                                      |    2 +-
 plugin-management.html                             |    2 +-
 plugins.html                                       |    2 +-
 poweredbyhbase.html                                |    2 +-
 project-info.html                                  |    2 +-
 project-reports.html                               |    2 +-
 pseudo-distributed.html                            |    2 +-
 replication.html                                   |    2 +-
 resources.html                                     |    2 +-
 scm.html                                           |    2 +-
 sponsors.html                                      |    2 +-
 summary.html                                       |    2 +-
 supportingprojects.html                            |    2 +-
 team.html                                          |    2 +-
 testdevapidocs/allclasses-frame.html               |    4 +
 testdevapidocs/allclasses-noframe.html             |    4 +
 testdevapidocs/index-all.html                      |   52 +
 .../apache/hadoop/hbase/backup/package-tree.html   |    2 +-
 .../hadoop/hbase/class-use/HBaseClassTestRule.html |   24 +-
 .../hbase/class-use/HBaseTestingUtility.html       |   18 +-
 .../apache/hadoop/hbase/io/hfile/package-tree.html |    2 +-
 ...gionProcedureHang.AssignmentManagerForTest.html |    2 +-
 ...ipleRegionServers.AssignmentManagerForTest.html |    2 +-
 .../TestRegionBypass.StallingAssignProcedure.html  |    2 +-
 ...OnlineRegionsRace.AssignmentManagerForTest.html |    2 +-
 ...ionFromDeadServer.AssignmentManagerForTest.html |    2 +-
 ...teTransitionRetry.AssignmentManagerForTest.html |    2 +-
 .../master/assignment/TestRogueRSAssignment.html   |    4 +-
 ...CPGetRegionsRace.AssignmentManagerForTest.html} |   64 +-
 .../TestSCPGetRegionsRace.HMasterForTest.html      |  426 +++
 ...estSCPGetRegionsRace.ServerManagerForTest.html} |   94 +-
 ...SAssignment.html => TestSCPGetRegionsRace.html} |  316 +-
 .../assignment/TestSplitTableRegionProcedure.html  |    4 +-
 .../TestWakeUpUnexpectedProcedure.AMForTest.html   |    2 +-
 ...SCPGetRegionsRace.AssignmentManagerForTest.html |  125 +
 .../TestSCPGetRegionsRace.HMasterForTest.html      |  125 +
 ...TestSCPGetRegionsRace.ServerManagerForTest.html |  125 +
 .../class-use/TestSCPGetRegionsRace.html           |  125 +
 .../hbase/master/assignment/package-frame.html     |    4 +
 .../hbase/master/assignment/package-summary.html   |   18 +
 .../hbase/master/assignment/package-tree.html      |    4 +
 .../org/apache/hadoop/hbase/package-tree.html      |   10 +-
 .../hadoop/hbase/procedure2/package-tree.html      |    4 +-
 .../hadoop/hbase/regionserver/package-tree.html    |    6 +-
 .../org/apache/hadoop/hbase/test/package-tree.html |    4 +-
 .../org/apache/hadoop/hbase/wal/package-tree.html  |    2 +-
 testdevapidocs/overview-tree.html                  |    4 +
 ...SCPGetRegionsRace.AssignmentManagerForTest.html |  290 ++
 .../TestSCPGetRegionsRace.HMasterForTest.html      |  290 ++
 ...TestSCPGetRegionsRace.ServerManagerForTest.html |  290 ++
 .../master/assignment/TestSCPGetRegionsRace.html   |  290 ++
 138 files changed, 9009 insertions(+), 6538 deletions(-)

diff --git a/acid-semantics.html b/acid-semantics.html
index 5ad6316..84c6fbd 100644
--- a/acid-semantics.html
+++ b/acid-semantics.html
@@ -457,7 +457,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-11</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-13</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/apache_hbase_reference_guide.pdf b/apache_hbase_reference_guide.pdf
index 66cfeda..54e958f 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:20190511144628+00'00')
-/CreationDate (D:20190511144628+00'00')
+/ModDate (D:20190513144627+00'00')
+/CreationDate (D:20190513144627+00'00')
 >>
 endobj
 2 0 obj
diff --git a/book.html b/book.html
index b4eb86c..b91a06a 100644
--- a/book.html
+++ b/book.html
@@ -41701,7 +41701,7 @@ org/apache/hadoop/hbase/security/access/AccessControlClient.revoke:(Lorg/apache/
 <div id="footer">
 <div id="footer-text">
 Version 3.0.0-SNAPSHOT<br>
-Last updated 2019-05-11 14:29:37 UTC
+Last updated 2019-05-13 14:29:38 UTC
 </div>
 </div>
 </body>
diff --git a/bulk-loads.html b/bulk-loads.html
index 362e5d7..221458c 100644
--- a/bulk-loads.html
+++ b/bulk-loads.html
@@ -162,7 +162,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-11</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-13</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/checkstyle-aggregate.html b/checkstyle-aggregate.html
index 51914fd..42ec493 100644
--- a/checkstyle-aggregate.html
+++ b/checkstyle-aggregate.html
@@ -156,7 +156,7 @@
 <th><img src="images/icon_warning_sml.gif" alt="" />&#160;Warnings</th>
 <th><img src="images/icon_error_sml.gif" alt="" />&#160;Errors</th></tr>
 <tr class="b">
-<td>3923</td>
+<td>3924</td>
 <td>0</td>
 <td>0</td>
 <td>13146</td></tr></table></div>
@@ -56642,55 +56642,55 @@
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 107).</td>
-<td>997</td></tr>
+<td>998</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>1195</td></tr>
+<td>1196</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>1197</td></tr>
+<td>1198</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>1424</td></tr>
+<td>1427</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>1426</td></tr>
+<td>1429</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>1429</td></tr>
+<td>1432</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>1739</td></tr>
+<td>1760</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>1864</td></tr>
+<td>1885</td></tr>
 <tr class="b">
 <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>1912</td></tr></table></div>
+<td>1933</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">
@@ -103343,7 +103343,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-11</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-13</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/checkstyle.rss b/checkstyle.rss
index 97ff497..dc42277 100644
--- a/checkstyle.rss
+++ b/checkstyle.rss
@@ -25,7 +25,7 @@ under the License.
     <language>en-us</language>
     <copyright>&#169;2007 - 2019 The Apache Software Foundation</copyright>
     <item>
-      <title>File: 3923,
+      <title>File: 3924,
              Errors: 13146,
              Warnings: 0,
              Infos: 0
@@ -24336,6 +24336,20 @@ under the License.
               </tr>
                           <tr>
                 <td>
+                  <a href="http://hbase.apache.org/checkstyle.html#org.apache.hadoop.hbase.master.assignment.TestSCPGetRegionsRace.java">org/apache/hadoop/hbase/master/assignment/TestSCPGetRegionsRace.java</a>
+                </td>
+                <td>
+                  0
+                </td>
+                <td>
+                  0
+                </td>
+                <td>
+                  0
+                </td>
+              </tr>
+                          <tr>
+                <td>
                   <a href="http://hbase.apache.org/checkstyle.html#org.apache.hadoop.hbase.types.TestStruct.java">org/apache/hadoop/hbase/types/TestStruct.java</a>
                 </td>
                 <td>
diff --git a/coc.html b/coc.html
index d0b72fc..4c03552 100644
--- a/coc.html
+++ b/coc.html
@@ -231,7 +231,7 @@ email to <a class="externalLink" href="mailto:private@hbase.apache.org">the priv
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-11</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-13</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/dependencies.html b/dependencies.html
index 7a7c6fd..635f490 100644
--- a/dependencies.html
+++ b/dependencies.html
@@ -311,7 +311,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-11</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-13</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/dependency-convergence.html b/dependency-convergence.html
index f64233d..d14373e 100644
--- a/dependency-convergence.html
+++ b/dependency-convergence.html
@@ -505,7 +505,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-11</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-13</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/dependency-info.html b/dependency-info.html
index 86b2e63..ef5c081 100644
--- a/dependency-info.html
+++ b/dependency-info.html
@@ -184,7 +184,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-11</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-13</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/dependency-management.html b/dependency-management.html
index c5e1ae7..703e090 100644
--- a/dependency-management.html
+++ b/dependency-management.html
@@ -894,7 +894,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-11</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-13</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/devapidocs/constant-values.html b/devapidocs/constant-values.html
index 9914e2d..c79cfda 100644
--- a/devapidocs/constant-values.html
+++ b/devapidocs/constant-values.html
@@ -3927,7 +3927,7 @@
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/Version.html#date">date</a></code></td>
-<td class="colLast"><code>"Sat May 11 14:34:49 UTC 2019"</code></td>
+<td class="colLast"><code>"Mon May 13 14:34:49 UTC 2019"</code></td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.revision">
@@ -3941,7 +3941,7 @@
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/Version.html#srcChecksum">srcChecksum</a></code></td>
-<td class="colLast"><code>"07462550979c5f1c2a6e0a5b8b0f4caa"</code></td>
+<td class="colLast"><code>"571d6868a121c249bdcff0e1f7675c34"</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 42321f5..0a8ef33 100644
--- a/devapidocs/index-all.html
+++ b/devapidocs/index-all.html
@@ -11461,6 +11461,12 @@
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/crypto/aes/CryptoAES.html#checkTransformation-java.lang.String-">checkTransformation(String)</a></span> - Method in class org.apache.hadoop.hbase.io.crypto.aes.<a href="org/apache/hadoop/hbase/io/crypto/aes/CryptoAES.html" title="class in org.apache.hadoop.hbase.io.crypto.aes">CryptoAES</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.html#checkTransition-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">checkTransition(RegionStateNode, RegionServerStatusProtos.RegionStateTransition.TransitionCode, long)</a></span> - Method in class org.apache.hadoop.hbase.master.assignment.<a href="org/apa [...]
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html#checkTransition-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">checkTransition(RegionStateNode, RegionServerStatusProtos.RegionStateTransition.TransitionCode, long)</a></span> - Method in class org.apache.hadoop.hbase.master.assignment.<a href="org/apac [...]
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#checkTransition-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">checkTransition(RegionStateNode, RegionServerStatusProtos.RegionStateTransition.TransitionCode, long)</a></span> - Method in class org.apache.hadoop.hbase.master.assignment.<a href="or [...]
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/hbck/ReplicationChecker.html#checkUnDeletedQueues--">checkUnDeletedQueues()</a></span> - Method in class org.apache.hadoop.hbase.util.hbck.<a href="org/apache/hadoop/hbase/util/hbck/ReplicationChecker.html" title="class in org.apache.hadoop.hbase.util.hbck">ReplicationChecker</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/HMaster.html#checkUnsupportedProcedure-java.util.Map-">checkUnsupportedProcedure(Map&lt;Class&lt;? extends Procedure&gt;, List&lt;Procedure&lt;MasterProcedureEnv&gt;&gt;&gt;)</a></span> - Method in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/HMaster.html" title="class in org.apache.hadoop.hbase.master">HMaster</a></dt>
@@ -84319,6 +84325,8 @@ service.</div>
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#persistToFile--">persistToFile()</a></span> - Method in class org.apache.hadoop.hbase.io.hfile.bucket.<a href="org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">BucketCache</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#persistToMeta-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">persistToMeta(RegionStateNode)</a></span> - Method in class org.apache.hadoop.hbase.master.assignment.<a href="org/apache/hadoop/hbase/master/assignment/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master.assignment">AssignmentManager</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html#perTableReadLatency">perTableReadLatency</a></span> - Variable in class org.apache.hadoop.hbase.tool.<a href="org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionStdOutSink</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/mapred/Driver.html#pgd">pgd</a></span> - Static variable in class org.apache.hadoop.hbase.mapred.<a href="org/apache/hadoop/hbase/mapred/Driver.html" title="class in org.apache.hadoop.hbase.mapred">Driver</a></dt>
@@ -92602,7 +92610,9 @@ service.</div>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.ManifestBuilder.html#regionClose-org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest.Builder-">regionClose(SnapshotProtos.SnapshotRegionManifest.Builder)</a></span> - Method in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.ManifestBuilder.html" title="class in org.apache.hadoop.hbase.snapshot">SnapshotManif [...]
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#regionClosed-org.apache.hadoop.hbase.master.assignment.RegionStateNode-boolean-">regionClosed(RegionStateNode, boolean)</a></span> - Method in class org.apache.hadoop.hbase.master.assignment.<a href="org/apache/hadoop/hbase/master/assignment/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master.assignment">AssignmentManager</a></dt>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#regionClosedAbnormally-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">regionClosedAbnormally(RegionStateNode)</a></span> - Method in class org.apache.hadoop.hbase.master.assignment.<a href="org/apache/hadoop/hbase/master/assignment/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master.assignment">AssignmentManager</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#regionClosedWithoutPersistingToMeta-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">regionClosedWithoutPersistingToMeta(RegionStateNode)</a></span> - Method in class org.apache.hadoop.hbase.master.assignment.<a href="org/apache/hadoop/hbase/master/assignment/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master.assignment">AssignmentManager</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/RSProcedureDispatcher.RegionCloseOperation.html#RegionCloseOperation-org.apache.hadoop.hbase.procedure2.RemoteProcedureDispatcher.RemoteProcedure-org.apache.hadoop.hbase.client.RegionInfo-long-org.apache.hadoop.hbase.ServerName-">RegionCloseOperation(RemoteProcedureDispatcher.RemoteProcedure, RegionInfo, long, ServerName)</a></span> - Constructor for class org.apache.hadoop.hbase.master.procedure.<a href=" [...]
 <dd>&nbsp;</dd>
@@ -93153,7 +93163,9 @@ service.</div>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.ManifestBuilder.html#regionOpen-org.apache.hadoop.hbase.client.RegionInfo-">regionOpen(RegionInfo)</a></span> - Method in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.ManifestBuilder.html" title="class in org.apache.hadoop.hbase.snapshot">SnapshotManifestV2.ManifestBuilder</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#regionOpened-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">regionOpened(RegionStateNode)</a></span> - Method in class org.apache.hadoop.hbase.master.assignment.<a href="org/apache/hadoop/hbase/master/assignment/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master.assignment">AssignmentManager</a></dt>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#regionOpenedWithoutPersistingToMeta-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">regionOpenedWithoutPersistingToMeta(RegionStateNode)</a></span> - Method in class org.apache.hadoop.hbase.master.assignment.<a href="org/apache/hadoop/hbase/master/assignment/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master.assignment">AssignmentManager</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html#regionOpenedWithoutPersistingToMeta-org.apache.hadoop.hbase.master.assignment.AssignmentManager-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">regionOpenedWithoutPersistingToMeta(AssignmentManager, RegionStateNode, RegionServerStatusProtos.RegionStateTr [...]
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#regionOpening-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">regionOpening(RegionStateNode)</a></span> - Method in class org.apache.hadoop.hbase.master.assignment.<a href="org/apache/hadoop/hbase/master/assignment/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master.assignment">AssignmentManager</a></dt>
 <dd>&nbsp;</dd>
@@ -96549,12 +96561,6 @@ service.</div>
 <dd>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span></div>
 &nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.html#reportTransition-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">reportTransition(RegionStateNode, RegionServerStatusProtos.RegionStateTransition.TransitionCode, long)</a></span> - Method in class org.apache.hadoop.hbase.master.assignment.<a href="org/a [...]
-<dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html#reportTransition-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">reportTransition(RegionStateNode, RegionServerStatusProtos.RegionStateTransition.TransitionCode, long)</a></span> - Method in class org.apache.hadoop.hbase.master.assignment.<a href="org/ap [...]
-<dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#reportTransition-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">reportTransition(RegionStateNode, RegionServerStatusProtos.RegionStateTransition.TransitionCode, long)</a></span> - Method in class org.apache.hadoop.hbase.master.assignment.<a href=" [...]
-<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#reportTransition-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.ServerName-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">reportTransition(MasterProcedureEnv, RegionStateNode, ServerName, RegionServerStatusProt [...]
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/RegionTransitionProcedure.html#reportTransition-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">reportTransition(MasterProcedureEnv, RegionStateNode, RegionServerStatusProtos.RegionStateTransition.TransitionCode, long)< [...]
@@ -97779,6 +97785,12 @@ service.</div>
 <dd>
 <div class="block">Create a new <a href="org/apache/hadoop/hbase/io/HFileLink.html" title="class in org.apache.hadoop.hbase.io"><code>HFileLink</code></a> to reference the store file.</div>
 </dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.html#restoreSucceedState-org.apache.hadoop.hbase.master.assignment.AssignmentManager-org.apache.hadoop.hbase.master.assignment.RegionStateNode-long-">restoreSucceedState(AssignmentManager, RegionStateNode, long)</a></span> - Method in class org.apache.hadoop.hbase.master.assignment.<a href="org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.html" title="class in org.apache [...]
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html#restoreSucceedState-org.apache.hadoop.hbase.master.assignment.AssignmentManager-org.apache.hadoop.hbase.master.assignment.RegionStateNode-long-">restoreSucceedState(AssignmentManager, RegionStateNode, long)</a></span> - Method in class org.apache.hadoop.hbase.master.assignment.<a href="org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html" title="class in org.apache.h [...]
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#restoreSucceedState-org.apache.hadoop.hbase.master.assignment.AssignmentManager-org.apache.hadoop.hbase.master.assignment.RegionStateNode-long-">restoreSucceedState(AssignmentManager, RegionStateNode, long)</a></span> - Method in class org.apache.hadoop.hbase.master.assignment.<a href="org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html" title="class in  [...]
+<dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/backup/impl/RestoreTablesClient.html" title="class in org.apache.hadoop.hbase.backup.impl"><span class="typeNameLink">RestoreTablesClient</span></a> - Class in <a href="org/apache/hadoop/hbase/backup/impl/package-summary.html">org.apache.hadoop.hbase.backup.impl</a></dt>
 <dd>
 <div class="block">Restore table implementation</div>
@@ -112616,6 +112628,10 @@ service.</div>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/WALCellCodec.StatelessUncompressor.html#StatelessUncompressor-org.apache.hadoop.hbase.regionserver.wal.CompressionContext-">StatelessUncompressor(CompressionContext)</a></span> - Constructor for class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/WALCellCodec.StatelessUncompressor.html" title="class in org.apache.hadoop.hbase.regionserver.wal">WALCellCodec.State [...]
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#stateLoaded-org.apache.hadoop.hbase.master.assignment.AssignmentManager-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">stateLoaded(AssignmentManager, RegionStateNode)</a></span> - Method in class org.apache.hadoop.hbase.master.assignment.<a href="org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html" title="class in org.apache.hadoop.hbase.mas [...]
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#stateLoaded-org.apache.hadoop.hbase.master.assignment.AssignmentManager-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">stateLoaded(AssignmentManager, RegionStateNode)</a></span> - Method in class org.apache.hadoop.hbase.master.assignment.<a href="org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase [...]
+<dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html" title="class in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">StateMachineProcedure</span></a>&lt;<a href="org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html" title="type parameter in StateMachineProcedure">TEnvironment</a>,<a href="org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html" title="type parameter in StateMachineProcedure">TState</a>&gt; - Class in <a href="org/apach [...]
 <dd>
 <div class="block">Procedure described by a series of steps.</div>
@@ -122358,12 +122374,6 @@ service.</div>
 <dd>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span></div>
 &nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.html#updateTransition-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">updateTransition(MasterProcedureEnv, RegionStateNode, RegionServerStatusProtos.RegionStateTransition.TransitionCode, long)</a></ [...]
-<dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html#updateTransition-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">updateTransition(MasterProcedureEnv, RegionStateNode, RegionServerStatusProtos.RegionStateTransition.TransitionCode, long)</a></s [...]
-<dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#updateTransition-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">updateTransition(MasterProcedureEnv, RegionStateNode, RegionServerStatusProtos.RegionStateTransition.TransitionCode, long)< [...]
-<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/RegionTransitionProcedure.html#updateTransition-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">updateTransition(MasterProcedureEnv, RegionStateNode)</a></span> - Method in class org.apache.hadoop.hbase.master.assignment.<a href="org/apache/hadoop/hbase/master/assignment/RegionTransitionProcedure.html" title="class in org.apache.hadoo [...]
 <dd>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span></div>
@@ -122372,6 +122382,12 @@ service.</div>
 <dd>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span></div>
 &nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.html#updateTransitionWithoutPersistingToMeta-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">updateTransitionWithoutPersistingToMeta(MasterProcedureEnv, RegionStateNode, RegionServerStatusProtos.Reg [...]
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html#updateTransitionWithoutPersistingToMeta-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">updateTransitionWithoutPersistingToMeta(MasterProcedureEnv, RegionStateNode, RegionServerStatusProtos.Regi [...]
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#updateTransitionWithoutPersistingToMeta-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">updateTransitionWithoutPersistingToMeta(MasterProcedureEnv, RegionStateNode, RegionServerStatusProto [...]
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/ipc/AdaptiveLifoCoDelCallQueue.html#updateTunables-int-int-double-">updateTunables(int, int, double)</a></span> - Method in class org.apache.hadoop.hbase.ipc.<a href="org/apache/hadoop/hbase/ipc/AdaptiveLifoCoDelCallQueue.html" title="class in org.apache.hadoop.hbase.ipc">AdaptiveLifoCoDelCallQueue</a></dt>
 <dd>
 <div class="block">Update tunables.</div>
diff --git a/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html b/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
index 0144a65..db18ec0 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.BackupPhase.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupInfo.BackupPhase</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupInfo.BackupState.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupInfo.BackupState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupRestoreConstants.BackupCommand.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupRestoreConstants.BackupCommand</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupType.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupType</span></a></li>
+<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>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/client/package-tree.html b/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
index 425a2e9..ff8da31 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
@@ -549,24 +549,24 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/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/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/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/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/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/Scan.ReadType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Scan.ReadType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncScanSingleRegionRpcRetryingCaller.ScanControllerState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncScanSingleRegionRpcRetryingCaller.ScanControllerState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncScanSingleRegionRpcRetryingCaller.ScanResumerState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncScanSingleRegionRpcRetryingCaller.ScanResumerState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/CompactionState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CompactionState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/CompactType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CompactType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/RequestController.ReturnCode.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">RequestController.ReturnCode</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/RegionLocateType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">RegionLocateType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcessTask.SubmittedRows.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncProcessTask.SubmittedRows</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/SnapshotType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">SnapshotType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/ScannerCallable.MoreResults.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">ScannerCallable.MoreResults</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncRequestFutureImpl.Retry.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncRequestFutureImpl.Retry</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/CompactType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CompactType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/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/Durability.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Durability</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/IsolationLevel.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">IsolationLevel</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/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/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/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/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/AbstractResponse.ResponseType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AbstractResponse.ResponseType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Scan.ReadType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Scan.ReadType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncScanSingleRegionRpcRetryingCaller.ScanControllerState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncScanSingleRegionRpcRetryingCaller.ScanControllerState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncScanSingleRegionRpcRetryingCaller.ScanResumerState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncScanSingleRegionRpcRetryingCaller.ScanResumerState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/TableState.State.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">TableState.State</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/coprocessor/package-tree.html b/devapidocs/org/apache/hadoop/hbase/coprocessor/package-tree.html
index dc618a4..c51f7b2 100644
--- a/devapidocs/org/apache/hadoop/hbase/coprocessor/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/coprocessor/package-tree.html
@@ -201,8 +201,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.coprocessor.<a href="../../../../../org/apache/hadoop/hbase/coprocessor/MetaTableMetrics.MetaTableOps.html" title="enum in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">MetaTableMetrics.MetaTableOps</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.coprocessor.<a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.MutationType.html" title="enum in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">RegionObserver.MutationType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.coprocessor.<a href="../../../../../org/apache/hadoop/hbase/coprocessor/MetaTableMetrics.MetaTableOps.html" title="enum in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">MetaTableMetrics.MetaTableOps</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/exceptions/class-use/UnexpectedStateException.html b/devapidocs/org/apache/hadoop/hbase/exceptions/class-use/UnexpectedStateException.html
index b40fda2..bbeaf49 100644
--- a/devapidocs/org/apache/hadoop/hbase/exceptions/class-use/UnexpectedStateException.html
+++ b/devapidocs/org/apache/hadoop/hbase/exceptions/class-use/UnexpectedStateException.html
@@ -107,6 +107,24 @@
 </tr>
 <tbody>
 <tr class="altColor">
+<td class="colFirst"><code>protected abstract void</code></td>
+<td class="colLast"><span class="typeNameLabel">RegionRemoteProcedureBase.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#checkTransition-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">checkTransition</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/maste [...]
+               org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;transitionCode,
+               long&nbsp;seqId)</code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>protected void</code></td>
+<td class="colLast"><span class="typeNameLabel">CloseRegionProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.html#checkTransition-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">checkTransition</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignme [...]
+               org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;transitionCode,
+               long&nbsp;seqId)</code>&nbsp;</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>protected void</code></td>
+<td class="colLast"><span class="typeNameLabel">OpenRegionProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html#checkTransition-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">checkTransition</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment [...]
+               org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;transitionCode,
+               long&nbsp;openSeqNum)</code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
 <td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><span class="typeNameLabel">UnassignProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/UnassignProcedure.html#reportTransition-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">reportTransition</a></span>(<a href=". [...]
                 <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
@@ -115,7 +133,7 @@
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;</div>
 &nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><span class="typeNameLabel">AssignProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignProcedure.html#reportTransition-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">reportTransition</a></span>(<a href="../.. [...]
                 <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
@@ -124,7 +142,7 @@
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;</div>
 &nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>protected abstract void</code></td>
 <td class="colLast"><span class="typeNameLabel">RegionTransitionProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionTransitionProcedure.html#reportTransition-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">reportTransition</a></ [...]
                 <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
@@ -133,7 +151,7 @@
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;</div>
 &nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">RegionStateNode.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html#transitionState-org.apache.hadoop.hbase.master.RegionState.State-org.apache.hadoop.hbase.master.RegionState.State...-">transitionState</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master">RegionState.State</a> [...]
                <a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master">RegionState.State</a>...&nbsp;expected)</code>
diff --git a/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html b/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html
index 127caa7..531254c 100644
--- a/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html
@@ -104,8 +104,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.executor.<a href="../../../../../org/apache/hadoop/hbase/executor/EventType.html" title="enum in org.apache.hadoop.hbase.executor"><span class="typeNameLink">EventType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.executor.<a href="../../../../../org/apache/hadoop/hbase/executor/ExecutorType.html" title="enum in org.apache.hadoop.hbase.executor"><span class="typeNameLink">ExecutorType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.executor.<a href="../../../../../org/apache/hadoop/hbase/executor/EventType.html" title="enum in org.apache.hadoop.hbase.executor"><span class="typeNameLink">EventType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html b/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
index a34e392..79553ec 100644
--- a/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
@@ -189,13 +189,13 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/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/RegexStringComparator.EngineType.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">RegexStringComparator.EngineType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.SatisfiesCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FuzzyRowFilter.SatisfiesCode</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/BitComparator.BitwiseOp.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">BitComparator.BitwiseOp</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FilterWrapper.FilterRowRetCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FilterWrapper.FilterRowRetCode</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/BitComparator.BitwiseOp.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">BitComparator.BitwiseOp</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.Order.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FuzzyRowFilter.Order</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/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/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/FilterList.Operator.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FilterList.Operator</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/http/package-tree.html b/devapidocs/org/apache/hadoop/hbase/http/package-tree.html
index e1a5d8d..8078bf2 100644
--- a/devapidocs/org/apache/hadoop/hbase/http/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/http/package-tree.html
@@ -138,9 +138,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.http.<a href="../../../../../org/apache/hadoop/hbase/http/ProfileServlet.Output.html" title="enum in org.apache.hadoop.hbase.http"><span class="typeNameLink">ProfileServlet.Output</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.http.<a href="../../../../../org/apache/hadoop/hbase/http/HttpConfig.Policy.html" title="enum in org.apache.hadoop.hbase.http"><span class="typeNameLink">HttpConfig.Policy</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.http.<a href="../../../../../org/apache/hadoop/hbase/http/ProfileServlet.Event.html" title="enum in org.apache.hadoop.hbase.http"><span class="typeNameLink">ProfileServlet.Event</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.http.<a href="../../../../../org/apache/hadoop/hbase/http/HttpConfig.Policy.html" title="enum in org.apache.hadoop.hbase.http"><span class="typeNameLink">HttpConfig.Policy</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.http.<a href="../../../../../org/apache/hadoop/hbase/http/ProfileServlet.Output.html" title="enum in org.apache.hadoop.hbase.http"><span class="typeNameLink">ProfileServlet.Output</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 853cdc1..37e5a49 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
@@ -283,8 +283,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/BlockType.BlockCategory.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockType.BlockCategory</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.Writer.State.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">HFileBlock.Writer.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.BlockCategory.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockType.BlockCategory</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockPriority.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockPriority</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCacheFactory.ExternalBlockCaches.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockCacheFactory.ExternalBlockCaches</span></a></li>
diff --git a/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html b/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
index 148fecd..53b29e4 100644
--- a/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
@@ -353,9 +353,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.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/BufferCallBeforeInitHandler.BufferCallAction.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">BufferCallBeforeInitHandler.BufferCallAction</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/MetricsHBaseServerSourceFactoryImpl.SourceStorage.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">MetricsHBaseServerSourceFactoryImpl.SourceStorage</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/CallEvent.Type.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">CallEvent.Type</span></a></li>
+<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>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html b/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
index 03452ce..5af518b 100644
--- a/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
@@ -297,10 +297,10 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/RowCounter.RowCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">RowCounter.RowCounterMapper.Counters</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableSplit.Version.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">TableSplit.Version</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">CellCounter.CellCounterMapper.Counters</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/SyncTable.SyncMapper.Counter.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">SyncTable.SyncMapper.Counter</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/RowCounter.RowCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">RowCounter.RowCounterMapper.Counters</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableSplit.Version.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">TableSplit.Version</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionChore.html b/devapidocs/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionChore.html
index d03432d..cef1ae8 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionChore.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionChore.html
@@ -127,7 +127,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1111">AssignmentManager.RegionInTransitionChore</a>
+<pre>private static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1112">AssignmentManager.RegionInTransitionChore</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureInMemoryChore.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureInMemoryChore</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&gt;</pre>
 </li>
 </ul>
@@ -240,7 +240,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureI
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RegionInTransitionChore</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionChore.html#line.1112">RegionInTransitionChore</a>(int&nbsp;timeoutMsec)</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionChore.html#line.1113">RegionInTransitionChore</a>(int&nbsp;timeoutMsec)</pre>
 </li>
 </ul>
 </li>
@@ -257,7 +257,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureI
 <ul class="blockListLast">
 <li class="blockList">
 <h4>periodicExecute</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionChore.html#line.1117">periodicExecute</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionChore.html#line.1118">periodicExecute</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureInMemoryChore.html#periodicExecute-TEnvironment-">periodicExecute</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureInMemoryChore.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureInMemoryChore</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.mas [...]
diff --git a/devapidocs/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html b/devapidocs/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html
index 8051082..191207d 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html
@@ -113,7 +113,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1138">AssignmentManager.RegionInTransitionStat</a>
+<pre>public static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1139">AssignmentManager.RegionInTransitionStat</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>
@@ -266,7 +266,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>ritThreshold</h4>
-<pre>private final&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html#line.1139">ritThreshold</a></pre>
+<pre>private final&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html#line.1140">ritThreshold</a></pre>
 </li>
 </ul>
 <a name="ritsOverThreshold">
@@ -275,7 +275,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>ritsOverThreshold</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="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.html" title="class in org.apache.hadoop.hbase.master">RegionState</a>&gt; <a href="../../../../../../src-html/org/a [...]
+<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="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.html" title="class in org.apache.hadoop.hbase.master">RegionState</a>&gt; <a href="../../../../../../src-html/org/a [...]
 </li>
 </ul>
 <a name="statTimestamp">
@@ -284,7 +284,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>statTimestamp</h4>
-<pre>private&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html#line.1142">statTimestamp</a></pre>
+<pre>private&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html#line.1143">statTimestamp</a></pre>
 </li>
 </ul>
 <a name="oldestRITTime">
@@ -293,7 +293,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>oldestRITTime</h4>
-<pre>private&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html#line.1143">oldestRITTime</a></pre>
+<pre>private&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html#line.1144">oldestRITTime</a></pre>
 </li>
 </ul>
 <a name="totalRITsTwiceThreshold">
@@ -302,7 +302,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>totalRITsTwiceThreshold</h4>
-<pre>private&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html#line.1144">totalRITsTwiceThreshold</a></pre>
+<pre>private&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html#line.1145">totalRITsTwiceThreshold</a></pre>
 </li>
 </ul>
 <a name="totalRITs">
@@ -311,7 +311,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>totalRITs</h4>
-<pre>private&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html#line.1145">totalRITs</a></pre>
+<pre>private&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html#line.1146">totalRITs</a></pre>
 </li>
 </ul>
 </li>
@@ -328,7 +328,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RegionInTransitionStat</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html#line.1148">RegionInTransitionStat</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html#line.1149">RegionInTransitionStat</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 </li>
 </ul>
 </li>
@@ -345,7 +345,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getRITThreshold</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html#line.1153">getRITThreshold</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html#line.1154">getRITThreshold</a>()</pre>
 </li>
 </ul>
 <a name="getTimestamp--">
@@ -354,7 +354,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getTimestamp</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html#line.1157">getTimestamp</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html#line.1158">getTimestamp</a>()</pre>
 </li>
 </ul>
 <a name="getTotalRITs--">
@@ -363,7 +363,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getTotalRITs</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html#line.1161">getTotalRITs</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html#line.1162">getTotalRITs</a>()</pre>
 </li>
 </ul>
 <a name="getOldestRITTime--">
@@ -372,7 +372,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getOldestRITTime</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html#line.1165">getOldestRITTime</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html#line.1166">getOldestRITTime</a>()</pre>
 </li>
 </ul>
 <a name="getTotalRITsOverThreshold--">
@@ -381,7 +381,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getTotalRITsOverThreshold</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html#line.1169">getTotalRITsOverThreshold</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html#line.1170">getTotalRITsOverThreshold</a>()</pre>
 </li>
 </ul>
 <a name="hasRegionsTwiceOverThreshold--">
@@ -390,7 +390,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>hasRegionsTwiceOverThreshold</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html#line.1174">hasRegionsTwiceOverThreshold</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html#line.1175">hasRegionsTwiceOverThreshold</a>()</pre>
 </li>
 </ul>
 <a name="hasRegionsOverThreshold--">
@@ -399,7 +399,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>hasRegionsOverThreshold</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html#line.1178">hasRegionsOverThreshold</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html#line.1179">hasRegionsOverThreshold</a>()</pre>
 </li>
 </ul>
 <a name="getRegionOverThreshold--">
@@ -408,7 +408,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionOverThreshold</h4>
-<pre>public&nbsp;<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/master/RegionState.html" title="class in org.apache.hadoop.hbase.master">RegionState</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html#line.1183">getRegionOverThreshold</a>()</pre>
+<pre>public&nbsp;<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/master/RegionState.html" title="class in org.apache.hadoop.hbase.master">RegionState</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html#line.1184">getRegionOverThreshold</a>()</pre>
 </li>
 </ul>
 <a name="isRegionOverThreshold-org.apache.hadoop.hbase.client.RegionInfo-">
@@ -417,7 +417,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>isRegionOverThreshold</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html#line.1188">isRegionOverThreshold</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;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html#line.1189">isRegionOverThreshold</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="isRegionTwiceOverThreshold-org.apache.hadoop.hbase.client.RegionInfo-">
@@ -426,7 +426,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>isRegionTwiceOverThreshold</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html#line.1193">isRegionTwiceOverThreshold</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;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html#line.1194">isRegionTwiceOverThreshold</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="update-org.apache.hadoop.hbase.master.assignment.AssignmentManager-">
@@ -435,7 +435,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>update</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html#line.1201">update</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master.assignment">AssignmentManager</a>&nbsp;am)</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html#line.1202">update</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master.assignment">AssignmentManager</a>&nbsp;am)</pre>
 </li>
 </ul>
 <a name="update-java.util.Collection-long-">
@@ -444,7 +444,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>update</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html#line.1208">update</a>(<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/master/RegionState.html" title="class in org.apache.hadoop.hbase.master">RegionState</a>&gt;&nbsp;regions,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html#line.1209">update</a>(<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/master/RegionState.html" title="class in org.apache.hadoop.hbase.master">RegionState</a>&gt;&nbsp;regions,
                     long&nbsp;currentTime)</pre>
 </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 9ab9012..4ed586e 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/assignment/AssignmentManager.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":9,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10,"i34":10,"i35":10,"i36":10,"i37":10,"i38":10,"i39":10,"i40":10,"i41":10,"i42":10,"i43":10,"i44":10,"i45":10,"i46":10,"i47":10,"i48":10,"i49":10,"i50":10,"i51":10,"i52":10,"i53":10,"i [...]
+var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":9,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10,"i34":10,"i35":10,"i36":10,"i37":10,"i38":10,"i39":10,"i40":10,"i41":10,"i42":10,"i43":10,"i44":10,"i45":10,"i46":10,"i47":10,"i48":10,"i49":10,"i50":10,"i51":10,"i52":10,"i53":10,"i [...]
 var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -680,73 +680,80 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
             <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="i68" class="altColor">
+<td class="colFirst"><code>(package private) void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#persistToMeta-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">persistToMeta</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode)</code>&nbsp;</td>
+</tr>
+<tr id="i69" class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#preTransitCheck-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.master.RegionState.State:A-">preTransitCheck</a></span>(<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;expectedStates)</code>&nbsp;</td>
 </tr>
-<tr id="i69" class="rowColor">
+<tr id="i70" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#processAssignmentPlans-java.util.HashMap-java.util.HashMap-java.util.List-java.util.List-">processAssignmentPlans</a></span>(<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 [...]
                       <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)</code>&nbsp;</td>
 </tr>
-<tr id="i70" class="altColor">
+<tr id="i71" class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#processAssignQueue--">processAssignQueue</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i71" class="rowColor">
+<tr id="i72" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#processOfflineRegions--">processOfflineRegions</a></span>()</code>
 <div class="block">Create assign procedure for offline regions.</div>
 </td>
 </tr>
-<tr id="i72" class="altColor">
+<tr id="i73" class="rowColor">
 <td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#queueAssign-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">queueAssign</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode)</code>
 <div class="block">Add the assign operation to the assignment queue.</div>
 </td>
 </tr>
-<tr id="i73" class="rowColor">
+<tr id="i74" class="altColor">
 <td class="colFirst"><code>(package private) void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#regionClosed-org.apache.hadoop.hbase.master.assignment.RegionStateNode-boolean-">regionClosed</a></span>(<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)</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#regionClosedAbnormally-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">regionClosedAbnormally</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode)</code>&nbsp;</td>
 </tr>
-<tr id="i74" class="altColor">
+<tr id="i75" class="rowColor">
+<td class="colFirst"><code>(package private) void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#regionClosedWithoutPersistingToMeta-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">regionClosedWithoutPersistingToMeta</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode)</code>&nbsp;</td>
+</tr>
+<tr id="i76" class="altColor">
 <td class="colFirst"><code>(package private) void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#regionClosing-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">regionClosing</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode)</code>&nbsp;</td>
 </tr>
-<tr id="i75" class="rowColor">
+<tr id="i77" class="rowColor">
 <td class="colFirst"><code>(package private) void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#regionFailedOpen-org.apache.hadoop.hbase.master.assignment.RegionStateNode-boolean-">regionFailedOpen</a></span>(<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)</code>&nbsp;</td>
 </tr>
-<tr id="i76" class="altColor">
+<tr id="i78" class="altColor">
 <td class="colFirst"><code>(package private) void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#regionOpened-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">regionOpened</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode)</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#regionOpenedWithoutPersistingToMeta-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">regionOpenedWithoutPersistingToMeta</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode)</code>&nbsp;</td>
 </tr>
-<tr id="i77" class="rowColor">
+<tr id="i79" class="rowColor">
 <td class="colFirst"><code>(package private) void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#regionOpening-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">regionOpening</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode)</code>&nbsp;</td>
 </tr>
-<tr id="i78" class="altColor">
+<tr id="i80" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#reportOnlineRegions-org.apache.hadoop.hbase.ServerName-java.util.Set-">reportOnlineRegions</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
                    <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;byte[]&gt;&nbsp;regionNames)</code>
 <div class="block">The master will call this method when the RS send the regionServerReport().</div>
 </td>
 </tr>
-<tr id="i79" class="rowColor">
+<tr id="i81" class="rowColor">
 <td class="colFirst"><code>org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.ReportRegionStateTransitionResponse</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#reportRegionStateTransition-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.ReportRegionStateTransitionRequest-">reportRegionStateTransition</a></span>(org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.ReportRegionStateTransitionRequest&nbsp;req)</code>&nbsp;</td>
 </tr>
-<tr id="i80" class="altColor">
+<tr id="i82" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#reportRegionStateTransition-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.ReportRegionStateTransitionResponse.Builder-org.apache.hadoop.hbase.ServerName-java.util.List-">reportRegionStateTransition</a></span>(org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.ReportRegionStateTransitionRespo [...]
                            <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
                            <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;org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition&gt;&nbsp;transitionList)</code>&nbsp;</td>
 </tr>
-<tr id="i81" class="rowColor">
+<tr id="i83" class="rowColor">
 <td class="colFirst"><code>private boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#reportTransition-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.master.assignment.ServerStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-long-">reportTransition</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/as [...]
                 <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/ServerStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">ServerStateNode</a>&nbsp;serverNode,
@@ -754,53 +761,53 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
                 long&nbsp;seqId,
                 long&nbsp;procId)</code>&nbsp;</td>
 </tr>
-<tr id="i82" class="altColor">
+<tr id="i84" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#setMetaAssigned-org.apache.hadoop.hbase.client.RegionInfo-boolean-">setMetaAssigned</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;metaRegionInfo,
                boolean&nbsp;assigned)</code>&nbsp;</td>
 </tr>
-<tr id="i83" class="rowColor">
+<tr id="i85" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#setupRIT-java.util.List-">setupRIT</a></span>(<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/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignme [...]
 <div class="block">Create RegionStateNode based on the TRSP list, and attach the TRSP to the RegionStateNode.</div>
 </td>
 </tr>
-<tr id="i84" class="altColor">
+<tr id="i86" class="altColor">
 <td class="colFirst"><code>private boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#shouldAssignFavoredNodes-org.apache.hadoop.hbase.client.RegionInfo-">shouldAssignFavoredNodes</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region)</code>&nbsp;</td>
 </tr>
-<tr id="i85" class="rowColor">
+<tr id="i87" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#start--">start</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i86" class="altColor">
+<tr id="i88" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#startAssignmentThread--">startAssignmentThread</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i87" class="rowColor">
+<tr id="i89" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#stop--">stop</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i88" class="altColor">
+<tr id="i90" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#stopAssignmentThread--">stopAssignmentThread</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i89" class="rowColor">
+<tr id="i91" class="rowColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#submitServerCrash-org.apache.hadoop.hbase.ServerName-boolean-">submitServerCrash</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
                  boolean&nbsp;shouldSplitWal)</code>&nbsp;</td>
 </tr>
-<tr id="i90" class="altColor">
+<tr id="i92" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#transitStateAndUpdate-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.master.RegionState.State-org.apache.hadoop.hbase.master.RegionState.State...-">transitStateAndUpdate</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbas [...]
                      <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)</code>&nbsp;</td>
 </tr>
-<tr id="i91" class="rowColor">
+<tr id="i93" class="rowColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#unassign-org.apache.hadoop.hbase.client.RegionInfo-">unassign</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr id="i92" class="altColor">
+<tr id="i94" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#updateRegionMergeTransition-org.apache.hadoop.hbase.ServerName-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.client.RegionInfo-">updateRegionMergeTransition</a></span>(<a  [...]
                            org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;state,
@@ -808,11 +815,11 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
                            <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;hriA,
                            <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;hriB)</code>&nbsp;</td>
 </tr>
-<tr id="i93" class="rowColor">
+<tr id="i95" class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#updateRegionsInTransitionMetrics-org.apache.hadoop.hbase.master.assignment.AssignmentManager.RegionInTransitionStat-">updateRegionsInTransitionMetrics</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html" title="class in org.apache.hadoop.hbase.master.assignment">Assignme [...]
 </tr>
-<tr id="i94" class="altColor">
+<tr id="i96" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#updateRegionSplitTransition-org.apache.hadoop.hbase.ServerName-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.client.RegionInfo-">updateRegionSplitTransition</a></span>(<a  [...]
                            org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;state,
@@ -820,7 +827,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
                            <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;hriA,
                            <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;hriB)</code>&nbsp;</td>
 </tr>
-<tr id="i95" class="rowColor">
+<tr id="i97" class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#updateRegionTransition-org.apache.hadoop.hbase.ServerName-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-org.apache.hadoop.hbase.client.RegionInfo-long-long-">updateRegionTransition</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org [...]
                       org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;state,
@@ -828,24 +835,24 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
                       long&nbsp;seqId,
                       long&nbsp;procId)</code>&nbsp;</td>
 </tr>
-<tr id="i96" class="altColor">
+<tr id="i98" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#waitMetaAssigned-org.apache.hadoop.hbase.procedure2.Procedure-org.apache.hadoop.hbase.client.RegionInfo-">waitMetaAssigned</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;proc,
                 <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</code>
 <div class="block">Notice that this event does not mean the AM has already finished region state rebuilding.</div>
 </td>
 </tr>
-<tr id="i97" class="rowColor">
+<tr id="i99" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#waitMetaLoaded-org.apache.hadoop.hbase.procedure2.Procedure-">waitMetaLoaded</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;proc)</code>
 <div class="block">Wait until AM finishes the meta loading, i.e, the region states rebuilding.</div>
 </td>
 </tr>
-<tr id="i98" class="altColor">
+<tr id="i100" class="altColor">
 <td class="colFirst"><code>private <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 [...]
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#waitOnAssignQueue--">waitOnAssignQueue</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i99" class="rowColor">
+<tr id="i101" class="rowColor">
 <td class="colFirst"><code>(package private) void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#wakeMetaLoadedEvent--">wakeMetaLoadedEvent</a></span>()</code>&nbsp;</td>
 </tr>
@@ -1191,7 +1198,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>META_REGION_SET</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.408">META_REGION_SET</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.409">META_REGION_SET</a></pre>
 </li>
 </ul>
 <a name="STATES_EXPECTED_ON_OPEN">
@@ -1200,7 +1207,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.1466">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.1469">STATES_EXPECTED_ON_OPEN</a></pre>
 </li>
 </ul>
 <a name="STATES_EXPECTED_ON_CLOSING">
@@ -1209,7 +1216,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.1471">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.1474">STATES_EXPECTED_ON_CLOSING</a></pre>
 </li>
 </ul>
 <a name="STATES_EXPECTED_ON_CLOSED">
@@ -1218,7 +1225,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.1478">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.1481">STATES_EXPECTED_ON_CLOSED</a></pre>
 </li>
 </ul>
 <a name="STATES_EXPECTED_ON_ASSIGN">
@@ -1227,7 +1234,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.1485">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.1488">STATES_EXPECTED_ON_ASSIGN</a></pre>
 </li>
 </ul>
 <a name="STATES_EXPECTED_ON_UNASSIGN_OR_MOVE">
@@ -1236,7 +1243,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.1488">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.1491">STATES_EXPECTED_ON_UNASSIGN_OR_MOVE</a></pre>
 </li>
 </ul>
 <a name="pendingAssignQueue">
@@ -1245,7 +1252,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.1663">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.1684">pendingAssignQueue</a></pre>
 </li>
 </ul>
 <a name="assignQueueLock">
@@ -1254,7 +1261,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.1664">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.1685">assignQueueLock</a></pre>
 </li>
 </ul>
 <a name="assignQueueFullCond">
@@ -1263,7 +1270,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.1665">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.1686">assignQueueFullCond</a></pre>
 </li>
 </ul>
 </li>
@@ -1323,7 +1330,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setupRIT</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.231">setupRIT</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/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a>&gt;&nb [...]
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.234">setupRIT</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/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a>&gt;&nb [...]
 <div class="block">Create RegionStateNode based on the TRSP list, and attach the TRSP to the RegionStateNode.
  <p>
  This is used to restore the RIT region list, so we do not need to restore it in the loadingMeta
@@ -1338,7 +1345,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>stop</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.259">stop</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.260">stop</a>()</pre>
 </li>
 </ul>
 <a name="isRunning--">
@@ -1347,7 +1354,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>isRunning</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.290">isRunning</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.291">isRunning</a>()</pre>
 </li>
 </ul>
 <a name="getConfiguration--">
@@ -1356,7 +1363,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getConfiguration</h4>
-<pre>public&nbsp;org.apache.hadoop.conf.Configuration&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.294">getConfiguration</a>()</pre>
+<pre>public&nbsp;org.apache.hadoop.conf.Configuration&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.295">getConfiguration</a>()</pre>
 </li>
 </ul>
 <a name="getAssignmentManagerMetrics--">
@@ -1365,7 +1372,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getAssignmentManagerMetrics</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/MetricsAssignmentManager.html" title="class in org.apache.hadoop.hbase.master">MetricsAssignmentManager</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.298">getAssignmentManagerMetrics</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/MetricsAssignmentManager.html" title="class in org.apache.hadoop.hbase.master">MetricsAssignmentManager</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.299">getAssignmentManagerMetrics</a>()</pre>
 </li>
 </ul>
 <a name="getBalancer--">
@@ -1374,7 +1381,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getBalancer</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html" title="interface in org.apache.hadoop.hbase.master">LoadBalancer</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.302">getBalancer</a>()</pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html" title="interface in org.apache.hadoop.hbase.master">LoadBalancer</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.303">getBalancer</a>()</pre>
 </li>
 </ul>
 <a name="getProcedureEnvironment--">
@@ -1383,7 +1390,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getProcedureEnvironment</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.306">getProcedureEnvironment</a>()</pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.307">getProcedureEnvironment</a>()</pre>
 </li>
 </ul>
 <a name="getProcedureScheduler--">
@@ -1392,7 +1399,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getProcedureScheduler</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureScheduler</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.310">getProcedureScheduler</a>()</pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureScheduler</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.311">getProcedureScheduler</a>()</pre>
 </li>
 </ul>
 <a name="getAssignMaxAttempts--">
@@ -1401,7 +1408,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getAssignMaxAttempts</h4>
-<pre>int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.314">getAssignMaxAttempts</a>()</pre>
+<pre>int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.315">getAssignMaxAttempts</a>()</pre>
 </li>
 </ul>
 <a name="getAssignRetryImmediatelyMaxAttempts--">
@@ -1410,7 +1417,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getAssignRetryImmediatelyMaxAttempts</h4>
-<pre>int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.318">getAssignRetryImmediatelyMaxAttempts</a>()</pre>
+<pre>int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.319">getAssignRetryImmediatelyMaxAttempts</a>()</pre>
 </li>
 </ul>
 <a name="getRegionStates--">
@@ -1419,7 +1426,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionStates</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.322">getRegionStates</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.323">getRegionStates</a>()</pre>
 </li>
 </ul>
 <a name="getRegionsOnServer-org.apache.hadoop.hbase.ServerName-">
@@ -1428,7 +1435,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionsOnServer</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.335">getRegionsOnServer</a>(<a href="../../../../../../org/apache/hadoop/hbas [...]
+<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.336">getRegionsOnServer</a>(<a href="../../../../../../org/apache/hadoop/hbas [...]
 <div class="block">Returns the regions hosted by the specified server.
  <p/>
  Notice that, for SCP, after we submit the SCP, no one can change the region list for the
@@ -1444,7 +1451,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionStateStore</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateStore.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateStore</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.343">getRegionStateStore</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateStore.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateStore</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.344">getRegionStateStore</a>()</pre>
 </li>
 </ul>
 <a name="getFavoredNodes-org.apache.hadoop.hbase.client.RegionInfo-">
@@ -1453,7 +1460,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getFavoredNodes</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.347">getFavoredNodes</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.h [...]
+<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.348">getFavoredNodes</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.h [...]
 </li>
 </ul>
 <a name="getTableStateManager--">
@@ -1462,7 +1469,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableStateManager</h4>
-<pre><a href="../../../../../../org/apache/hadoop/hbase/master/TableStateManager.html" title="class in org.apache.hadoop.hbase.master">TableStateManager</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.356">getTableStateManager</a>()</pre>
+<pre><a href="../../../../../../org/apache/hadoop/hbase/master/TableStateManager.html" title="class in org.apache.hadoop.hbase.master">TableStateManager</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.357">getTableStateManager</a>()</pre>
 </li>
 </ul>
 <a name="isTableEnabled-org.apache.hadoop.hbase.TableName-">
@@ -1471,7 +1478,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>isTableEnabled</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.360">isTableEnabled</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.361">isTableEnabled</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="isTableDisabled-org.apache.hadoop.hbase.TableName-">
@@ -1480,7 +1487,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>isTableDisabled</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.364">isTableDisabled</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.365">isTableDisabled</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="isMetaRegion-org.apache.hadoop.hbase.client.RegionInfo-">
@@ -1489,7 +1496,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>isMetaRegion</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.372">isMetaRegion</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;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.373">isMetaRegion</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="isMetaRegion-byte:A-">
@@ -1498,7 +1505,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>isMetaRegion</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.376">isMetaRegion</a>(byte[]&nbsp;regionName)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.377">isMetaRegion</a>(byte[]&nbsp;regionName)</pre>
 </li>
 </ul>
 <a name="getMetaRegionFromName-byte:A-">
@@ -1507,7 +1514,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getMetaRegionFromName</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.380">getMetaRegionFromName</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.381">getMetaRegionFromName</a>(byte[]&nbsp;regionName)</pre>
 </li>
 </ul>
 <a name="isCarryingMeta-org.apache.hadoop.hbase.ServerName-">
@@ -1516,7 +1523,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>isCarryingMeta</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.389">isCarryingMeta</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.390">isCarryingMeta</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="isCarryingRegion-org.apache.hadoop.hbase.ServerName-org.apache.hadoop.hbase.client.RegionInfo-">
@@ -1525,7 +1532,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>isCarryingRegion</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.394">isCarryingRegion</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.395">isCarryingRegion</a>(<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;regionInfo)</pre>
 </li>
 </ul>
@@ -1535,7 +1542,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getMetaForRegion</h4>
-<pre>private&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.400">getMetaForRegion</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;<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.401">getMetaForRegion</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="getMetaRegionSet--">
@@ -1544,7 +1551,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getMetaRegionSet</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</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.410">getMetaRegionSet</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</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.411">getMetaRegionSet</a>()</pre>
 </li>
 </ul>
 <a name="isMetaAssigned--">
@@ -1553,7 +1560,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>isMetaAssigned</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.424">isMetaAssigned</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.425">isMetaAssigned</a>()</pre>
 <div class="block">Notice that, this only means the meta region is available on a RS, but the AM may still be
  loading the region states from meta, so usually you need to check <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#isMetaLoaded--"><code>isMetaLoaded()</code></a> first
  before checking this method, unless you can make sure that your piece of code can only be
@@ -1570,7 +1577,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>isMetaRegionInTransition</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.428">isMetaRegionInTransition</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.429">isMetaRegionInTransition</a>()</pre>
 </li>
 </ul>
 <a name="waitMetaAssigned-org.apache.hadoop.hbase.procedure2.Procedure-org.apache.hadoop.hbase.client.RegionInfo-">
@@ -1579,7 +1586,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>waitMetaAssigned</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.437">waitMetaAssigned</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;proc,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.438">waitMetaAssigned</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;proc,
                                 <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</pre>
 <div class="block">Notice that this event does not mean the AM has already finished region state rebuilding. See
  the comment of <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#isMetaAssigned--"><code>isMetaAssigned()</code></a> for more details.</div>
@@ -1595,7 +1602,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setMetaAssigned</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.441">setMetaAssigned</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;metaRegionInfo,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.442">setMetaAssigned</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;metaRegionInfo,
                              boolean&nbsp;assigned)</pre>
 </li>
 </ul>
@@ -1605,7 +1612,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getMetaAssignEvent</h4>
-<pre>private&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/AssignmentManager.html#line.451">getMetaAssignEvent</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;metaRegionInfo)</pre>
+<pre>private&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/AssignmentManager.html#line.452">getMetaAssignEvent</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;metaRegionInfo)</pre>
 </li>
 </ul>
 <a name="waitMetaLoaded-org.apache.hadoop.hbase.procedure2.Procedure-">
@@ -1614,7 +1621,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>waitMetaLoaded</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.462">waitMetaLoaded</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;proc)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.463">waitMetaLoaded</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;proc)</pre>
 <div class="block">Wait until AM finishes the meta loading, i.e, the region states rebuilding.</div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
@@ -1629,7 +1636,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>wakeMetaLoadedEvent</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.467">wakeMetaLoadedEvent</a>()</pre>
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.468">wakeMetaLoadedEvent</a>()</pre>
 </li>
 </ul>
 <a name="isMetaLoaded--">
@@ -1638,7 +1645,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>isMetaLoaded</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.477">isMetaLoaded</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.478">isMetaLoaded</a>()</pre>
 <div class="block">Return whether AM finishes the meta loading, i.e, the region states rebuilding.</div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
@@ -1653,7 +1660,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>checkIfShouldMoveSystemRegionAsync</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.488">checkIfShouldMoveSystemRegionAsync</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.489">checkIfShouldMoveSystemRegionAsync</a>()</pre>
 <div class="block">Start a new thread to check if there are region servers whose versions are higher than others.
  If so, move all system table regions to RS with the highest version to keep compatibility.
  The reason is, RS in new version may not be able to access RS in old version when there are
@@ -1667,7 +1674,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getSystemTables</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../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.545">getSystemTables</a>(<a href="../../../../../../org/apache/hadoop/hbase/ [...]
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../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.546">getSystemTables</a>(<a href="../../../../../../org/apache/hadoop/hbase/ [...]
 </li>
 </ul>
 <a name="preTransitCheck-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.master.RegionState.State:A-">
@@ -1676,7 +1683,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>preTransitCheck</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.553">preTransitCheck</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.554">preTransitCheck</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;expectedStates)
                       throws <a href="../../../../../../org/apache/hadoop/hbase/HBaseIOException.html" title="class in org.apache.hadoop.hbase">HBaseIOException</a></pre>
 <dl>
@@ -1691,7 +1698,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>assign</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.568">assign</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;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.569">assign</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;sn)
             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>
@@ -1706,7 +1713,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>assign</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.584">assign</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;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.585">assign</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)
             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>
@@ -1720,7 +1727,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>unassign</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.588">unassign</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;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.589">unassign</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)
               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>
@@ -1734,7 +1741,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createMoveRegionProcedure</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/AssignmentManager.html#line.606">createMoveRegionProcedure</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionIn [...]
+<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/AssignmentManager.html#line.607">createMoveRegionProcedure</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionIn [...]
                                                              <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;targetServer)
                                                       throws <a href="../../../../../../org/apache/hadoop/hbase/HBaseIOException.html" title="class in org.apache.hadoop.hbase">HBaseIOException</a></pre>
 <dl>
@@ -1749,7 +1756,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>move</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.625">move</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.626">move</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)
           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>
@@ -1763,7 +1770,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>moveAsync</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html?is-external=true" title="class or interface in java.util.concurrent">Future</a>&lt;byte[]&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.630">moveAsync</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/RegionPlan.html" title="class in org.apache.hadoop.hbase.master">RegionPlan</a>&nbsp;regionPlan)
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html?is-external=true" title="class or interface in java.util.concurrent">Future</a>&lt;byte[]&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.631">moveAsync</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/RegionPlan.html" title="class in org.apache.hadoop.hbase.master">RegionPlan</a>&nbsp;regionPlan)
                          throws <a href="../../../../../../org/apache/hadoop/hbase/HBaseIOException.html" title="class in org.apache.hadoop.hbase">HBaseIOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -1777,7 +1784,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createRoundRobinAssignProcedures</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/AssignmentManager.html#line.647">createRoundRobinAssignProcedures</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.uti [...]
+<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/AssignmentManager.html#line.648">createRoundRobinAssignProcedures</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.uti [...]
                                                                       <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;serversToExclude)</pre>
 <div class="block">Create round-robin assigns. Use on table creation to distribute out regions across cluster.</div>
 <dl>
@@ -1795,7 +1802,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createRoundRobinAssignProcedures</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/AssignmentManager.html#line.679">createRoundRobinAssignProcedures</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.uti [...]
+<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/AssignmentManager.html#line.680">createRoundRobinAssignProcedures</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.uti [...]
 <div class="block">Create round-robin assigns. Use on table creation to distribute out regions across cluster.</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -1812,7 +1819,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>compare</h4>
-<pre>static&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.684">compare</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a>&nbsp;left,
+<pre>static&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.685">compare</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a>&nbsp;left,
                    <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a>&nbsp;right)</pre>
 </li>
 </ul>
@@ -1822,7 +1829,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createAssignProcedure</h4>
-<pre>private&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/AssignmentManager.html#line.704">createAssignProcedure</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master. [...]
+<pre>private&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/AssignmentManager.html#line.705">createAssignProcedure</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master. [...]
                                                           <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;targetServer,
                                                           boolean&nbsp;override)</pre>
 </li>
@@ -1833,7 +1840,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createUnassignProcedure</h4>
-<pre>private&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/AssignmentManager.html#line.722">createUnassignProcedure</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.maste [...]
+<pre>private&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/AssignmentManager.html#line.723">createUnassignProcedure</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.maste [...]
                                                             boolean&nbsp;override)</pre>
 </li>
 </ul>
@@ -1843,7 +1850,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createOneAssignProcedure</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/AssignmentManager.html#line.744">createOneAssignProcedure</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInf [...]
+<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/AssignmentManager.html#line.745">createOneAssignProcedure</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInf [...]
                                                             boolean&nbsp;override)</pre>
 <div class="block">Create one TransitRegionStateProcedure to assign a region w/o specifying a target server.
  This method is specified for HBCK2</div>
@@ -1855,7 +1862,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createOneUnassignProcedure</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/AssignmentManager.html#line.753">createOneUnassignProcedure</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionI [...]
+<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/AssignmentManager.html#line.754">createOneUnassignProcedure</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionI [...]
                                                               boolean&nbsp;override)</pre>
 <div class="block">Create one TransitRegionStateProcedure to unassign a region.
  This method is specified for HBCK2</div>
@@ -1867,7 +1874,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createAssignProcedures</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/AssignmentManager.html#line.767">createAssignProcedures</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 [...]
+<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/AssignmentManager.html#line.768">createAssignProcedures</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 [...]
 <div class="block">Create an array of TransitRegionStateProcedure w/o specifying a target server.
  <p/>
  If no target server, at assign time, we will try to use the former location of the region if
@@ -1883,7 +1890,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createAssignProcedures</h4>
-<pre>private&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/AssignmentManager.html#line.777">createAssignProcedures</a>(<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> [...]
+<pre>private&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/AssignmentManager.html#line.778">createAssignProcedures</a>(<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> [...]
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
 <dd><code>assignments</code> - Map of assignments from which we produce an array of AssignProcedures.</dd>
@@ -1898,7 +1905,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createUnassignProceduresForDisabling</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/AssignmentManager.html#line.788">createUnassignProceduresForDisabling</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>& [...]
+<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/AssignmentManager.html#line.789">createUnassignProceduresForDisabling</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>& [...]
 <div class="block">Called by DisableTableProcedure to unassign all the regions for a table.</div>
 </li>
 </ul>
@@ -1908,7 +1915,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createSplitProcedure</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/SplitTableRegionProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">SplitTableRegionProcedure</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.813">createSplitProcedure</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nb [...]
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/SplitTableRegionProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">SplitTableRegionProcedure</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.814">createSplitProcedure</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nb [...]
                                                       byte[]&nbsp;splitKey)
                                                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>
@@ -1923,7 +1930,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createMergeProcedure</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">MergeTableRegionsProcedure</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.818">createMergeProcedure</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>& [...]
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">MergeTableRegionsProcedure</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.819">createMergeProcedure</a>(<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/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionToMergeB)
                                                 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>
@@ -1938,7 +1945,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>deleteTable</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.826">deleteTable</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.827">deleteTable</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)
                  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">Delete the region states. This is called by "DeleteTable"</div>
 <dl>
@@ -1953,7 +1960,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>reportRegionStateTransition</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.840">reportRegionStateTransition</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.ReportRegionStateTransitionResponse.Builder&nbsp;builder,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.841">reportRegionStateTransition</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.ReportRegionStateTransitionResponse.Builder&nbsp;builder,
                                          <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
                                          <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;org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition&gt;&nbsp;transitionList)
                                   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>
@@ -1969,7 +1976,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>reportRegionStateTransition</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.ReportRegionStateTransitionResponse&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.878">reportRegionStateTransition</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.ReportRegionStateTransitionRequest&nbsp;req)
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.ReportRegionStateTransitionResponse&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.879">reportRegionStateTransition</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.ReportRegionStateTransitionRequest&nbsp;req)
                                                                                                                                            throws <a href="../../../../../../org/apache/hadoop/hbase/PleaseHoldException.html" title="class in org.apache.hadoop.hbase">PleaseHoldException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -1983,7 +1990,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>updateRegionTransition</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.918">updateRegionTransition</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.919">updateRegionTransition</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
                                     org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;state,
                                     <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
                                     long&nbsp;seqId,
@@ -2001,7 +2008,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>reportTransition</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.956">reportTransition</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;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.957">reportTransition</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/assignment/ServerStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">ServerStateNode</a>&nbsp;serverNode,
                                  org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;state,
                                  long&nbsp;seqId,
@@ -2019,7 +2026,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>updateRegionSplitTransition</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.968">updateRegionSplitTransition</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.969">updateRegionSplitTransition</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
                                          org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;state,
                                          <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/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;hriA,
@@ -2037,7 +2044,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>updateRegionMergeTransition</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1001">updateRegionMergeTransition</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1002">updateRegionMergeTransition</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
                                          org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;state,
                                          <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;merged,
                                          <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;hriA,
@@ -2055,7 +2062,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>reportOnlineRegions</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1038">reportOnlineRegions</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1039">reportOnlineRegions</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
                                 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;byte[]&gt;&nbsp;regionNames)</pre>
 <div class="block">The master will call this method when the RS send the regionServerReport(). The report will
  contains the "online regions". This method will check the the online regions against the
@@ -2073,7 +2080,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>checkOnlineRegionsReport</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1070">checkOnlineRegionsReport</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/ServerStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">ServerStateNode</a>&nbsp;serverNode,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1071">checkOnlineRegionsReport</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/ServerStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">ServerStateNode</a>&nbsp;serverNode,
                                       <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;byte[]&gt;&nbsp;regionNames)</pre>
 </li>
 </ul>
@@ -2083,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>computeRegionInTransitionStat</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html" title="class in org.apache.hadoop.hbase.master.assignment">AssignmentManager.RegionInTransitionStat</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1132">computeRegionInTransitionStat</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html" title="class in org.apache.hadoop.hbase.master.assignment">AssignmentManager.RegionInTransitionStat</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1133">computeRegionInTransitionStat</a>()</pre>
 </li>
 </ul>
 <a name="updateRegionsInTransitionMetrics-org.apache.hadoop.hbase.master.assignment.AssignmentManager.RegionInTransitionStat-">
@@ -2092,7 +2099,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.1232">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.1233">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-">
@@ -2101,7 +2108,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.1238">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.1239">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--">
@@ -2110,7 +2117,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.1247">joinCluster</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1248">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>
@@ -2124,7 +2131,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.1281">processOfflineRegions</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1282">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.
@@ -2140,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>loadMeta</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1291">loadMeta</a>()
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1292">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>
@@ -2154,7 +2161,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.1345">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.1348">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/>
@@ -2173,7 +2180,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.1360">getNumRegionsOpened</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1363">getNumRegionsOpened</a>()</pre>
 </li>
 </ul>
 <a name="submitServerCrash-org.apache.hadoop.hbase.ServerName-boolean-">
@@ -2182,7 +2189,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.1365">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.1368">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>
@@ -2192,7 +2199,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.1401">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.1404">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-">
@@ -2201,7 +2208,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.1409">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.1412">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>
@@ -2211,7 +2218,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-">
@@ -2220,7 +2227,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>
@@ -2238,7 +2245,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.1444">hasRegionsInTransition</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1447">hasRegionsInTransition</a>()</pre>
 </li>
 </ul>
 <a name="getRegionsInTransition--">
@@ -2247,7 +2254,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.1448">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.1451">getRegionsInTransition</a>()</pre>
 </li>
 </ul>
 <a name="getAssignedRegions--">
@@ -2256,7 +2263,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.1452">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.1455">getAssignedRegions</a>()</pre>
 </li>
 </ul>
 <a name="getRegionInfo-byte:A-">
@@ -2265,7 +2272,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.1456">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.1459">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...-">
@@ -2274,7 +2281,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.1494">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.1498">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>
@@ -2290,7 +2297,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.1511">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.1515">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>
@@ -2304,7 +2311,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.1524">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.1528">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>
@@ -2313,43 +2320,70 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </dl>
 </li>
 </ul>
-<a name="regionOpened-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">
+<a name="regionClosing-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">
 <!--   -->
 </a>
 <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.1548">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>
+<h4>regionClosing</h4>
+<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>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd>
 </dl>
 </li>
 </ul>
-<a name="regionClosing-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">
+<a name="regionOpenedWithoutPersistingToMeta-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">
 <!--   -->
 </a>
 <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.1565">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>
+<h4>regionOpenedWithoutPersistingToMeta</h4>
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1571">regionOpenedWithoutPersistingToMeta</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>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd>
+</dl>
+</li>
+</ul>
+<a name="regionClosedWithoutPersistingToMeta-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>regionClosedWithoutPersistingToMeta</h4>
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1579">regionClosedWithoutPersistingToMeta</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>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd>
 </dl>
 </li>
 </ul>
-<a name="regionClosed-org.apache.hadoop.hbase.master.assignment.RegionStateNode-boolean-">
+<a name="regionClosedAbnormally-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">
 <!--   -->
 </a>
 <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.1581">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>
+<h4>regionClosedAbnormally</h4>
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1591">regionClosedAbnormally</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>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd>
+</dl>
+</li>
+</ul>
+<a name="persistToMeta-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>persistToMeta</h4>
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1613">persistToMeta</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>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd>
@@ -2362,7 +2396,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.1608">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.1629">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)
@@ -2379,7 +2413,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.1638">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.1659">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)
@@ -2402,7 +2436,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.1655">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.1676">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-">
@@ -2411,7 +2445,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.1672">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.1693">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>
@@ -2423,7 +2457,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.1689">startAssignmentThread</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1710">startAssignmentThread</a>()</pre>
 </li>
 </ul>
 <a name="stopAssignmentThread--">
@@ -2432,7 +2466,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.1707">stopAssignmentThread</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1728">stopAssignmentThread</a>()</pre>
 </li>
 </ul>
 <a name="assignQueueSignal--">
@@ -2441,7 +2475,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.1720">assignQueueSignal</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1741">assignQueueSignal</a>()</pre>
 </li>
 </ul>
 <a name="waitOnAssignQueue--">
@@ -2450,7 +2484,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--">
@@ -2459,7 +2493,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.1755">processAssignQueue</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1776">processAssignQueue</a>()</pre>
 </li>
 </ul>
 <a name="processAssignmentPlans-java.util.HashMap-java.util.HashMap-java.util.List-java.util.List-">
@@ -2468,7 +2502,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.1817">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.1838">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>
@@ -2480,7 +2514,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.1855">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.1876">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>
@@ -2495,7 +2529,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.1884">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.1905">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>
@@ -2505,7 +2539,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.1900">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.1921">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>
@@ -2516,7 +2550,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.1920">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.1941">getMaster</a>()</pre>
 </li>
 </ul>
 </li>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.html b/devapidocs/org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.html
index add4eff..2752a88 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10};
 var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -124,7 +124,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.Private
-public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.html#line.39">CloseRegionProcedure</a>
+public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.html#line.40">CloseRegionProcedure</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionRemoteProcedureBase</a></pre>
 <div class="block">The remote procedure used to close a region.</div>
 </li>
@@ -232,50 +232,56 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/Reg
 </tr>
 <tr id="i0" class="altColor">
 <td class="colFirst"><code>protected void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.html#checkTransition-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">checkTransition</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hado [...]
+               org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;transitionCode,
+               long&nbsp;seqId)</code>&nbsp;</td>
+</tr>
+<tr id="i1" class="rowColor">
+<td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.html#deserializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">deserializeStateData</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a>&nbsp;serializer)</code>
 <div class="block">Called on store load to allow the user to decode the previously serialized
  state.</div>
 </td>
 </tr>
-<tr id="i1" class="rowColor">
+<tr id="i2" class="altColor">
 <td class="colFirst"><code>protected <a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureMetrics.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureMetrics</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.html#getProcedureMetrics-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">getProcedureMetrics</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</code>
 <div class="block">Override this method to provide procedure specific counters for submitted count, failed
  count and time histogram.</div>
 </td>
 </tr>
-<tr id="i2" class="altColor">
+<tr id="i3" class="rowColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.TableOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure">TableProcedureInterface.TableOperationType</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.html#getTableOperationType--">getTableOperationType</a></span>()</code>
 <div class="block">Given an operation type we can take decisions about what to do with pending operations.</div>
 </td>
 </tr>
-<tr id="i3" class="rowColor">
+<tr id="i4" class="altColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/RemoteProcedureDispatcher.RemoteOperation.html" title="class in org.apache.hadoop.hbase.procedure2">RemoteProcedureDispatcher.RemoteOperation</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.html#remoteCallBuild-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.ServerName-">remoteCallBuild</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;remote)</code>
 <div class="block">For building the remote operation.</div>
 </td>
 </tr>
-<tr id="i4" class="altColor">
+<tr id="i5" class="rowColor">
 <td class="colFirst"><code>protected void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.html#reportTransition-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">reportTransition</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.ha [...]
-                org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;transitionCode,
-                long&nbsp;seqId)</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.html#restoreSucceedState-org.apache.hadoop.hbase.master.assignment.AssignmentManager-org.apache.hadoop.hbase.master.assignment.RegionStateNode-long-">restoreSucceedState</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master.assignment">AssignmentMana [...]
+                   <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
+                   long&nbsp;seqId)</code>&nbsp;</td>
 </tr>
-<tr id="i5" class="rowColor">
+<tr id="i6" class="altColor">
 <td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.html#serializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">serializeStateData</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a>&nbsp;serializer)</code>
 <div class="block">The user-level code of the procedure may have some state to
  persist (e.g.</div>
 </td>
 </tr>
-<tr id="i6" class="altColor">
+<tr id="i7" class="rowColor">
 <td class="colFirst"><code>protected void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.html#updateTransition-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">updateTransition</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/pr [...]
-                <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
-                org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;transitionCode,
-                long&nbsp;seqId)</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.html#updateTransitionWithoutPersistingToMeta-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">updateTransitionWithoutPersistingToMeta</a></span>(<a href="../.. [...]
+                                       <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
+                                       org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;transitionCode,
+                                       long&nbsp;seqId)</code>&nbsp;</td>
 </tr>
 </table>
 <ul class="blockList">
@@ -283,7 +289,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/Reg
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.master.assignment.<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionRemoteProcedureBase</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#abort-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">abort</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#afterReplay-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">afterReplay</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#execute-org.apac [...]
+<code><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#abort-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">abort</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#afterReplay-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">afterReplay</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#execute-org.apac [...]
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.procedure2.Procedure">
@@ -319,7 +325,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/Reg
 <ul class="blockListLast">
 <li class="blockList">
 <h4>assignCandidate</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.html#line.45">assignCandidate</a></pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.html#line.46">assignCandidate</a></pre>
 </li>
 </ul>
 </li>
@@ -336,7 +342,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/Reg
 <ul class="blockList">
 <li class="blockList">
 <h4>CloseRegionProcedure</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.html#line.47">CloseRegionProcedure</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.html#line.48">CloseRegionProcedure</a>()</pre>
 </li>
 </ul>
 <a name="CloseRegionProcedure-org.apache.hadoop.hbase.master.assignment.TransitRegionStateProcedure-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.ServerName-org.apache.hadoop.hbase.ServerName-">
@@ -345,7 +351,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/Reg
 <ul class="blockListLast">
 <li class="blockList">
 <h4>CloseRegionProcedure</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.html#line.51">CloseRegionProcedure</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a>&nbsp;parent,
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.html#line.52">CloseRegionProcedure</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a>&nbsp;parent,
                             <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region,
                             <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;targetServer,
                             <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;assignCandidate)</pre>
@@ -365,7 +371,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/Reg
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableOperationType</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.TableOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure">TableProcedureInterface.TableOperationType</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.html#line.58">getTableOperationType</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.TableOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure">TableProcedureInterface.TableOperationType</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.html#line.59">getTableOperationType</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.html#getTableOperationType--">TableProcedureInterface</a></code></span></div>
 <div class="block">Given an operation type we can take decisions about what to do with pending operations.
  e.g. if we get a delete and we have some table operation pending (e.g. add column)
@@ -382,7 +388,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/Reg
 <ul class="blockList">
 <li class="blockList">
 <h4>remoteCallBuild</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/RemoteProcedureDispatcher.RemoteOperation.html" title="class in org.apache.hadoop.hbase.procedure2">RemoteProcedureDispatcher.RemoteOperation</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.html#line.63">remoteCallBuild</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hb [...]
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/RemoteProcedureDispatcher.RemoteOperation.html" title="class in org.apache.hadoop.hbase.procedure2">RemoteProcedureDispatcher.RemoteOperation</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.html#line.64">remoteCallBuild</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hb [...]
                                                                  <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;remote)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/RemoteProcedureDispatcher.RemoteProcedure.html#remoteCallBuild-TEnv-TRemote-">RemoteProcedureDispatcher.RemoteProcedure</a></code></span></div>
 <div class="block">For building the remote operation.</div>
@@ -394,7 +400,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/Reg
 <ul class="blockList">
 <li class="blockList">
 <h4>serializeStateData</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.html#line.68">serializeStateData</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a>&nbsp;serializer)
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.html#line.69">serializeStateData</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a>&nbsp;serializer)
                            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#serializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">Procedure</a></code></span></div>
 <div class="block">The user-level code of the procedure may have some state to
@@ -416,7 +422,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/Reg
 <ul class="blockList">
 <li class="blockList">
 <h4>deserializeStateData</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.html#line.78">deserializeStateData</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a>&nbsp;serializer)
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.html#line.79">deserializeStateData</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a>&nbsp;serializer)
                              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#deserializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">Procedure</a></code></span></div>
 <div class="block">Called on store load to allow the user to decode the previously serialized
@@ -437,7 +443,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/Reg
 <ul class="blockList">
 <li class="blockList">
 <h4>getProcedureMetrics</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureMetrics.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureMetrics</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.html#line.88">getProcedureMetrics</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEn [...]
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureMetrics.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureMetrics</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.html#line.89">getProcedureMetrics</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEn [...]
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#getProcedureMetrics-TEnvironment-">Procedure</a></code></span></div>
 <div class="block">Override this method to provide procedure specific counters for submitted count, failed
  count and time histogram.</div>
@@ -451,38 +457,56 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/Reg
 </dl>
 </li>
 </ul>
-<a name="reportTransition-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">
+<a name="checkTransition-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>checkTransition</h4>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.html#line.94">checkTransition</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
+                               org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;transitionCode,
+                               long&nbsp;seqId)
+                        throws <a href="../../../../../../org/apache/hadoop/hbase/exceptions/UnexpectedStateException.html" title="class in org.apache.hadoop.hbase.exceptions">UnexpectedStateException</a></pre>
+<dl>
+<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
+<dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#checkTransition-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">checkTransition</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html" title="class in org.apache.hadoop.hb [...]
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="../../../../../../org/apache/hadoop/hbase/exceptions/UnexpectedStateException.html" title="class in org.apache.hadoop.hbase.exceptions">UnexpectedStateException</a></code></dd>
+</dl>
+</li>
+</ul>
+<a name="updateTransitionWithoutPersistingToMeta-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>reportTransition</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.html#line.93">reportTransition</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
-                                org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;transitionCode,
-                                long&nbsp;seqId)
-                         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>
+<h4>updateTransitionWithoutPersistingToMeta</h4>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.html#line.103">updateTransitionWithoutPersistingToMeta</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
+                                                       <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
+                                                       org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;transitionCode,
+                                                       long&nbsp;seqId)
+                                                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="overrideSpecifyLabel">Specified by:</span></dt>
-<dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#reportTransition-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">reportTransition</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html" title="class in org.apache.hadoop. [...]
+<dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#updateTransitionWithoutPersistingToMeta-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">updateTransitionWithoutPersistingToMeta</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../or [...]
 <dt><span class="throwsLabel">Throws:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd>
 </dl>
 </li>
 </ul>
-<a name="updateTransition-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">
+<a name="restoreSucceedState-org.apache.hadoop.hbase.master.assignment.AssignmentManager-org.apache.hadoop.hbase.master.assignment.RegionStateNode-long-">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
-<h4>updateTransition</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.html#line.102">updateTransition</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
-                                <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
-                                org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;transitionCode,
-                                long&nbsp;seqId)
-                         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>
+<h4>restoreSucceedState</h4>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.html#line.110">restoreSucceedState</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master.assignment">AssignmentManager</a>&nbsp;am,
+                                   <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
+                                   long&nbsp;seqId)
+                            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="overrideSpecifyLabel">Specified by:</span></dt>
-<dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#updateTransition-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">updateTransition</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/Region [...]
+<dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#restoreSucceedState-org.apache.hadoop.hbase.master.assignment.AssignmentManager-org.apache.hadoop.hbase.master.assignment.RegionStateNode-long-">restoreSucceedState</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionRemoteProcedure [...]
 <dt><span class="throwsLabel">Throws:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd>
 </dl>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html b/devapidocs/org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html
index 2c620d4..be3890d 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10};
 var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -124,7 +124,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.Private
-public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html#line.40">OpenRegionProcedure</a>
+public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html#line.41">OpenRegionProcedure</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionRemoteProcedureBase</a></pre>
 <div class="block">The remote procedure used to open a region.</div>
 </li>
@@ -231,50 +231,63 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/Reg
 </tr>
 <tr id="i0" class="altColor">
 <td class="colFirst"><code>protected void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html#checkTransition-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">checkTransition</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoo [...]
+               org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;transitionCode,
+               long&nbsp;openSeqNum)</code>&nbsp;</td>
+</tr>
+<tr id="i1" class="rowColor">
+<td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html#deserializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">deserializeStateData</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a>&nbsp;serializer)</code>
 <div class="block">Called on store load to allow the user to decode the previously serialized
  state.</div>
 </td>
 </tr>
-<tr id="i1" class="rowColor">
+<tr id="i2" class="altColor">
 <td class="colFirst"><code>protected <a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureMetrics.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureMetrics</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html#getProcedureMetrics-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">getProcedureMetrics</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</code>
 <div class="block">Override this method to provide procedure specific counters for submitted count, failed
  count and time histogram.</div>
 </td>
 </tr>
-<tr id="i2" class="altColor">
+<tr id="i3" class="rowColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.TableOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure">TableProcedureInterface.TableOperationType</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html#getTableOperationType--">getTableOperationType</a></span>()</code>
 <div class="block">Given an operation type we can take decisions about what to do with pending operations.</div>
 </td>
 </tr>
-<tr id="i3" class="rowColor">
+<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/master/assignment/OpenRegionProcedure.html#regionOpenedWithoutPersistingToMeta-org.apache.hadoop.hbase.master.assignment.AssignmentManager-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">regionOpenedWithoutPersistingToMeta</a></span>(<a href="../../../../.. [...]
+                                   <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
+                                   org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;transitionCode,
+                                   long&nbsp;openSeqNum)</code>&nbsp;</td>
+</tr>
+<tr id="i5" class="rowColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/RemoteProcedureDispatcher.RemoteOperation.html" title="class in org.apache.hadoop.hbase.procedure2">RemoteProcedureDispatcher.RemoteOperation</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html#remoteCallBuild-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.ServerName-">remoteCallBuild</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;remote)</code>
 <div class="block">For building the remote operation.</div>
 </td>
 </tr>
-<tr id="i4" class="altColor">
+<tr id="i6" class="altColor">
 <td class="colFirst"><code>protected void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html#reportTransition-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">reportTransition</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.had [...]
-                org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;transitionCode,
-                long&nbsp;seqId)</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html#restoreSucceedState-org.apache.hadoop.hbase.master.assignment.AssignmentManager-org.apache.hadoop.hbase.master.assignment.RegionStateNode-long-">restoreSucceedState</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master.assignment">AssignmentManag [...]
+                   <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
+                   long&nbsp;openSeqNum)</code>&nbsp;</td>
 </tr>
-<tr id="i5" class="rowColor">
+<tr id="i7" class="rowColor">
 <td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html#serializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">serializeStateData</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a>&nbsp;serializer)</code>
 <div class="block">The user-level code of the procedure may have some state to
  persist (e.g.</div>
 </td>
 </tr>
-<tr id="i6" class="altColor">
+<tr id="i8" class="altColor">
 <td class="colFirst"><code>protected void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html#updateTransition-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">updateTransition</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/pro [...]
-                <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
-                org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;transitionCode,
-                long&nbsp;openSeqNum)</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html#updateTransitionWithoutPersistingToMeta-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">updateTransitionWithoutPersistingToMeta</a></span>(<a href="../../ [...]
+                                       <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
+                                       org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;transitionCode,
+                                       long&nbsp;openSeqNum)</code>&nbsp;</td>
 </tr>
 </table>
 <ul class="blockList">
@@ -282,7 +295,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/Reg
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.master.assignment.<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionRemoteProcedureBase</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#abort-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">abort</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#afterReplay-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">afterReplay</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#execute-org.apac [...]
+<code><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#abort-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">abort</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#afterReplay-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">afterReplay</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#execute-org.apac [...]
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.procedure2.Procedure">
@@ -318,7 +331,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/Reg
 <ul class="blockListLast">
 <li class="blockList">
 <h4>LOG</h4>
-<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html#line.42">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html#line.43">LOG</a></pre>
 </li>
 </ul>
 </li>
@@ -335,7 +348,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/Reg
 <ul class="blockList">
 <li class="blockList">
 <h4>OpenRegionProcedure</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html#line.44">OpenRegionProcedure</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html#line.45">OpenRegionProcedure</a>()</pre>
 </li>
 </ul>
 <a name="OpenRegionProcedure-org.apache.hadoop.hbase.master.assignment.TransitRegionStateProcedure-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.ServerName-">
@@ -344,7 +357,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/Reg
 <ul class="blockListLast">
 <li class="blockList">
 <h4>OpenRegionProcedure</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html#line.48">OpenRegionProcedure</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a>&nbsp;parent,
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html#line.49">OpenRegionProcedure</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a>&nbsp;parent,
                            <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region,
                            <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;targetServer)</pre>
 </li>
@@ -363,7 +376,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/Reg
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableOperationType</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.TableOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure">TableProcedureInterface.TableOperationType</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html#line.54">getTableOperationType</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.TableOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure">TableProcedureInterface.TableOperationType</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html#line.55">getTableOperationType</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.html#getTableOperationType--">TableProcedureInterface</a></code></span></div>
 <div class="block">Given an operation type we can take decisions about what to do with pending operations.
  e.g. if we get a delete and we have some table operation pending (e.g. add column)
@@ -380,7 +393,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/Reg
 <ul class="blockList">
 <li class="blockList">
 <h4>remoteCallBuild</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/RemoteProcedureDispatcher.RemoteOperation.html" title="class in org.apache.hadoop.hbase.procedure2">RemoteProcedureDispatcher.RemoteOperation</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html#line.59">remoteCallBuild</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hba [...]
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/RemoteProcedureDispatcher.RemoteOperation.html" title="class in org.apache.hadoop.hbase.procedure2">RemoteProcedureDispatcher.RemoteOperation</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html#line.60">remoteCallBuild</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hba [...]
                                                                  <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;remote)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/RemoteProcedureDispatcher.RemoteProcedure.html#remoteCallBuild-TEnv-TRemote-">RemoteProcedureDispatcher.RemoteProcedure</a></code></span></div>
 <div class="block">For building the remote operation.</div>
@@ -392,7 +405,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/Reg
 <ul class="blockList">
 <li class="blockList">
 <h4>serializeStateData</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html#line.64">serializeStateData</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a>&nbsp;serializer)
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html#line.65">serializeStateData</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a>&nbsp;serializer)
                            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#serializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">Procedure</a></code></span></div>
 <div class="block">The user-level code of the procedure may have some state to
@@ -414,7 +427,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/Reg
 <ul class="blockList">
 <li class="blockList">
 <h4>deserializeStateData</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html#line.70">deserializeStateData</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a>&nbsp;serializer)
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html#line.71">deserializeStateData</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a>&nbsp;serializer)
                              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#deserializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">Procedure</a></code></span></div>
 <div class="block">Called on store load to allow the user to decode the previously serialized
@@ -435,7 +448,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/Reg
 <ul class="blockList">
 <li class="blockList">
 <h4>getProcedureMetrics</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureMetrics.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureMetrics</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html#line.76">getProcedureMetrics</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv [...]
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureMetrics.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureMetrics</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html#line.77">getProcedureMetrics</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv [...]
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#getProcedureMetrics-TEnvironment-">Procedure</a></code></span></div>
 <div class="block">Override this method to provide procedure specific counters for submitted count, failed
  count and time histogram.</div>
@@ -449,38 +462,73 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/Reg
 </dl>
 </li>
 </ul>
-<a name="reportTransition-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">
+<a name="regionOpenedWithoutPersistingToMeta-org.apache.hadoop.hbase.master.assignment.AssignmentManager-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>regionOpenedWithoutPersistingToMeta</h4>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html#line.81">regionOpenedWithoutPersistingToMeta</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master.assignment">AssignmentManager</a>&nbsp;am,
+                                                 <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
+                                                 org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;transitionCode,
+                                                 long&nbsp;openSeqNum)
+                                          throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
+<dl>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd>
+</dl>
+</li>
+</ul>
+<a name="checkTransition-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>checkTransition</h4>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html#line.96">checkTransition</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
+                               org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;transitionCode,
+                               long&nbsp;openSeqNum)
+                        throws <a href="../../../../../../org/apache/hadoop/hbase/exceptions/UnexpectedStateException.html" title="class in org.apache.hadoop.hbase.exceptions">UnexpectedStateException</a></pre>
+<dl>
+<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
+<dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#checkTransition-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">checkTransition</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html" title="class in org.apache.hadoop.hb [...]
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="../../../../../../org/apache/hadoop/hbase/exceptions/UnexpectedStateException.html" title="class in org.apache.hadoop.hbase.exceptions">UnexpectedStateException</a></code></dd>
+</dl>
+</li>
+</ul>
+<a name="updateTransitionWithoutPersistingToMeta-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>reportTransition</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html#line.81">reportTransition</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
-                                org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;transitionCode,
-                                long&nbsp;seqId)
-                         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>
+<h4>updateTransitionWithoutPersistingToMeta</h4>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html#line.115">updateTransitionWithoutPersistingToMeta</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
+                                                       <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
+                                                       org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;transitionCode,
+                                                       long&nbsp;openSeqNum)
+                                                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="overrideSpecifyLabel">Specified by:</span></dt>
-<dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#reportTransition-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">reportTransition</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html" title="class in org.apache.hadoop. [...]
+<dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#updateTransitionWithoutPersistingToMeta-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">updateTransitionWithoutPersistingToMeta</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../or [...]
 <dt><span class="throwsLabel">Throws:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd>
 </dl>
 </li>
 </ul>
-<a name="updateTransition-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">
+<a name="restoreSucceedState-org.apache.hadoop.hbase.master.assignment.AssignmentManager-org.apache.hadoop.hbase.master.assignment.RegionStateNode-long-">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
-<h4>updateTransition</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html#line.102">updateTransition</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
-                                <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
-                                org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;transitionCode,
-                                long&nbsp;openSeqNum)
-                         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>
+<h4>restoreSucceedState</h4>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html#line.129">restoreSucceedState</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master.assignment">AssignmentManager</a>&nbsp;am,
+                                   <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
+                                   long&nbsp;openSeqNum)
+                            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="overrideSpecifyLabel">Specified by:</span></dt>
-<dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#updateTransition-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">updateTransition</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/Region [...]
+<dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#restoreSucceedState-org.apache.hadoop.hbase.master.assignment.AssignmentManager-org.apache.hadoop.hbase.master.assignment.RegionStateNode-long-">restoreSucceedState</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionRemoteProcedure [...]
 <dt><span class="throwsLabel">Throws:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd>
 </dl>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html b/devapidocs/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html
index 3d9e508..f13e078 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.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":6,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":6,"i19":10};
+var methods = {"i0":10,"i1":10,"i2":6,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":6,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":6,"i21":10};
 var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],4:["t3","Abstract Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -268,36 +268,42 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/T
 </td>
 </tr>
 <tr id="i2" class="altColor">
+<td class="colFirst"><code>protected abstract void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#checkTransition-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">checkTransition</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache [...]
+               org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;transitionCode,
+               long&nbsp;seqId)</code>&nbsp;</td>
+</tr>
+<tr id="i3" class="rowColor">
 <td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#deserializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">deserializeStateData</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a>&nbsp;serializer)</code>
 <div class="block">Called on store load to allow the user to decode the previously serialized
  state.</div>
 </td>
 </tr>
-<tr id="i3" class="rowColor">
+<tr id="i4" class="altColor">
 <td class="colFirst"><code>protected <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&gt;[]</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#execute-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">execute</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</code>
 <div class="block">The main code of the procedure.</div>
 </td>
 </tr>
-<tr id="i4" class="altColor">
+<tr id="i5" class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#getParent-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">getParent</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</code>&nbsp;</td>
 </tr>
-<tr id="i5" class="rowColor">
+<tr id="i6" class="altColor">
 <td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#getRegionNode-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">getRegionNode</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</code>&nbsp;</td>
 </tr>
-<tr id="i6" class="altColor">
+<tr id="i7" class="rowColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#getTableName--">getTableName</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i7" class="rowColor">
+<tr id="i8" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#persistAndWake-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">persistAndWake</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
               <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode)</code>&nbsp;</td>
 </tr>
-<tr id="i8" class="altColor">
+<tr id="i9" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#remoteCallFailed-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.ServerName-java.io.IOException-">remoteCallFailed</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&n [...]
                 <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;remote,
@@ -305,14 +311,14 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/T
 <div class="block">Called when the executeProcedure call is failed.</div>
 </td>
 </tr>
-<tr id="i9" class="rowColor">
+<tr id="i10" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#remoteOperationCompleted-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">remoteOperationCompleted</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</code>
 <div class="block">Called when RS tells the remote procedure is succeeded through the
  <code>reportProcedureDone</code> method.</div>
 </td>
 </tr>
-<tr id="i10" class="altColor">
+<tr id="i11" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#remoteOperationFailed-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.procedure2.RemoteProcedureException-">remoteOperationFailed</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterPro [...]
                      <a href="../../../../../../org/apache/hadoop/hbase/procedure2/RemoteProcedureException.html" title="class in org.apache.hadoop.hbase.procedure2">RemoteProcedureException</a>&nbsp;error)</code>
@@ -320,7 +326,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/T
  method.</div>
 </td>
 </tr>
-<tr id="i11" class="rowColor">
+<tr id="i12" class="altColor">
 <td class="colFirst"><code>(package private) void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#reportTransition-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.ServerName-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">reportTransition</a></span>(<a href="../../../.. [...]
                 <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
@@ -328,32 +334,37 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/T
                 org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;transitionCode,
                 long&nbsp;seqId)</code>&nbsp;</td>
 </tr>
-<tr id="i12" class="altColor">
+<tr id="i13" class="rowColor">
 <td class="colFirst"><code>protected abstract void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#reportTransition-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">reportTransition</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apac [...]
-                org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;transitionCode,
-                long&nbsp;seqId)</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#restoreSucceedState-org.apache.hadoop.hbase.master.assignment.AssignmentManager-org.apache.hadoop.hbase.master.assignment.RegionStateNode-long-">restoreSucceedState</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master.assignment">Assignmen [...]
+                   <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
+                   long&nbsp;seqId)</code>&nbsp;</td>
 </tr>
-<tr id="i13" class="rowColor">
+<tr id="i14" class="altColor">
 <td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#rollback-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">rollback</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</code>
 <div class="block">The code to undo what was done by the execute() code.</div>
 </td>
 </tr>
-<tr id="i14" class="altColor">
+<tr id="i15" class="rowColor">
 <td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#serializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">serializeStateData</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a>&nbsp;serializer)</code>
 <div class="block">The user-level code of the procedure may have some state to
  persist (e.g.</div>
 </td>
 </tr>
-<tr id="i15" class="rowColor">
+<tr id="i16" class="altColor">
 <td class="colFirst"><code>(package private) void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#serverCrashed-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.ServerName-">serverCrashed</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.pro [...]
              <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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</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/master/assignment/RegionRemoteProcedureBase.html#stateLoaded-org.apache.hadoop.hbase.master.assignment.AssignmentManager-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">stateLoaded</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master.assignment">AssignmentManager</a>&nbsp;am,
+           <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode)</code>&nbsp;</td>
+</tr>
+<tr id="i18" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#storeInDispatchedQueue--">storeInDispatchedQueue</a></span>()</code>
 <div class="block">Whether store this remote procedure in dispatched queue
@@ -361,18 +372,18 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/T
  not fully controlled by dispatcher</div>
 </td>
 </tr>
-<tr id="i17" class="rowColor">
+<tr id="i19" class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#unattach-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">unattach</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</code>&nbsp;</td>
 </tr>
-<tr id="i18" class="altColor">
+<tr id="i20" class="altColor">
 <td class="colFirst"><code>protected abstract void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#updateTransition-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">updateTransition</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/mast [...]
-                <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
-                org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;transitionCode,
-                long&nbsp;seqId)</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#updateTransitionWithoutPersistingToMeta-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">updateTransitionWithoutPersistingToMeta</a></span>(<a href=" [...]
+                                       <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
+                                       org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;transitionCode,
+                                       long&nbsp;seqId)</code>&nbsp;</td>
 </tr>
-<tr id="i19" class="rowColor">
+<tr id="i21" class="rowColor">
 <td class="colFirst"><code>protected boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#waitInitialized-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">waitInitialized</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</code>
 <div class="block">The <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#doAcquireLock-TEnvironment-org.apache.hadoop.hbase.procedure2.store.ProcedureStore-"><code>Procedure.doAcquireLock(Object, ProcedureStore)</code></a> will be split into two steps, first, it will
@@ -671,16 +682,33 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/T
 </dl>
 </li>
 </ul>
-<a name="reportTransition-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">
+<a name="checkTransition-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>reportTransition</h4>
-<pre>protected abstract&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.157">reportTransition</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
-                                         org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;transitionCode,
-                                         long&nbsp;seqId)
-                                  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>
+<h4>checkTransition</h4>
+<pre>protected abstract&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.157">checkTransition</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
+                                        org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;transitionCode,
+                                        long&nbsp;seqId)
+                                 throws <a href="../../../../../../org/apache/hadoop/hbase/exceptions/UnexpectedStateException.html" title="class in org.apache.hadoop.hbase.exceptions">UnexpectedStateException</a></pre>
+<dl>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="../../../../../../org/apache/hadoop/hbase/exceptions/UnexpectedStateException.html" title="class in org.apache.hadoop.hbase.exceptions">UnexpectedStateException</a></code></dd>
+</dl>
+</li>
+</ul>
+<a name="updateTransitionWithoutPersistingToMeta-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>updateTransitionWithoutPersistingToMeta</h4>
+<pre>protected abstract&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.161">updateTransitionWithoutPersistingToMeta</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
+                                                                <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
+                                                                org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;transitionCode,
+                                                                long&nbsp;seqId)
+                                                         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd>
@@ -693,7 +721,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/T
 <ul class="blockList">
 <li class="blockList">
 <h4>persistAndWake</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.162">persistAndWake</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.166">persistAndWake</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                             <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode)</pre>
 </li>
 </ul>
@@ -703,7 +731,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/T
 <ul class="blockList">
 <li class="blockList">
 <h4>reportTransition</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.168">reportTransition</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.172">reportTransition</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                       <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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
                       org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;transitionCode,
@@ -721,44 +749,53 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/T
 <ul class="blockList">
 <li class="blockList">
 <h4>serverCrashed</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.201">serverCrashed</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.210">serverCrashed</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                    <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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</pre>
 </li>
 </ul>
-<a name="getParent-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">
+<a name="restoreSucceedState-org.apache.hadoop.hbase.master.assignment.AssignmentManager-org.apache.hadoop.hbase.master.assignment.RegionStateNode-long-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getParent</h4>
-<pre>private&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/RegionRemoteProcedureBase.html#line.218">getParent</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.pr [...]
+<h4>restoreSucceedState</h4>
+<pre>protected abstract&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.233">restoreSucceedState</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master.assignment">AssignmentManager</a>&nbsp;am,
+                                            <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
+                                            long&nbsp;seqId)
+                                     throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
+<dl>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd>
+</dl>
 </li>
 </ul>
-<a name="unattach-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">
+<a name="stateLoaded-org.apache.hadoop.hbase.master.assignment.AssignmentManager-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>unattach</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.223">unattach</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</pre>
+<h4>stateLoaded</h4>
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.236">stateLoaded</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master.assignment">AssignmentManager</a>&nbsp;am,
+                 <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode)</pre>
 </li>
 </ul>
-<a name="updateTransition-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">
+<a name="getParent-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>updateTransition</h4>
-<pre>protected abstract&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.228">updateTransition</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
-                                         <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
-                                         org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;transitionCode,
-                                         long&nbsp;seqId)
-                                  throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
-<dl>
-<dt><span class="throwsLabel">Throws:</span></dt>
-<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd>
-</dl>
+<h4>getParent</h4>
+<pre>private&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/RegionRemoteProcedureBase.html#line.247">getParent</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.pr [...]
+</li>
+</ul>
+<a name="unattach-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>unattach</h4>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.252">unattach</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</pre>
 </li>
 </ul>
 <a name="execute-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">
@@ -767,7 +804,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/T
 <ul class="blockList">
 <li class="blockList">
 <h4>execute</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&gt;[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.232">execute</a>(<a href=" [...]
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&gt;[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.257">execute</a>(<a href=" [...]
                                            throws <a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureYieldException.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureYieldException</a>,
                                                   <a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureSuspendedException.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureSuspendedException</a>,
                                                   <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
@@ -798,7 +835,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/T
 <ul class="blockList">
 <li class="blockList">
 <h4>storeInDispatchedQueue</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.287">storeInDispatchedQueue</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.312">storeInDispatchedQueue</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/RemoteProcedureDispatcher.RemoteProcedure.html#storeInDispatchedQueue--">RemoteProcedureDispatcher.RemoteProcedure</a></code></span></div>
 <div class="block">Whether store this remote procedure in dispatched queue
  only OpenRegionProcedure and CloseRegionProcedure return false since they are
@@ -815,7 +852,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/T
 <ul class="blockList">
 <li class="blockList">
 <h4>serializeStateData</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.292">serializeStateData</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a>&nbsp;serializer)
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.317">serializeStateData</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a>&nbsp;serializer)
                            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#serializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">Procedure</a></code></span></div>
 <div class="block">The user-level code of the procedure may have some state to
@@ -837,7 +874,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/T
 <ul class="blockList">
 <li class="blockList">
 <h4>deserializeStateData</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.304">deserializeStateData</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a>&nbsp;serializer)
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.329">deserializeStateData</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a>&nbsp;serializer)
                              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#deserializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">Procedure</a></code></span></div>
 <div class="block">Called on store load to allow the user to decode the previously serialized
@@ -858,7 +895,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/T
 <ul class="blockListLast">
 <li class="blockList">
 <h4>afterReplay</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.317">afterReplay</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.342">afterReplay</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#afterReplay-TEnvironment-">Procedure</a></code></span></div>
 <div class="block">Called when the procedure is ready to be added to the queue after
  the loading/replay operation.</div>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.TransitionType.html b/devapidocs/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.TransitionType.html
index 5ef16cb..1838514 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.TransitionType.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.TransitionType.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static enum <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.530">TransitRegionStateProcedure.TransitionType</a>
+<pre>public static enum <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.539">TransitRegionStateProcedure.TransitionType</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang">Enum</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.TransitionType.html" title="enum in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure.TransitionType</a>&gt;</pre>
 </li>
 </ul>
@@ -216,7 +216,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>ASSIGN</h4>
-<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.TransitionType.html" title="enum in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure.TransitionType</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.TransitionType.html#line.531">ASSIGN</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.TransitionType.html" title="enum in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure.TransitionType</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.TransitionType.html#line.540">ASSIGN</a></pre>
 </li>
 </ul>
 <a name="UNASSIGN">
@@ -225,7 +225,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>UNASSIGN</h4>
-<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.TransitionType.html" title="enum in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure.TransitionType</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.TransitionType.html#line.531">UNASSIGN</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.TransitionType.html" title="enum in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure.TransitionType</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.TransitionType.html#line.540">UNASSIGN</a></pre>
 </li>
 </ul>
 <a name="MOVE">
@@ -234,7 +234,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>MOVE</h4>
-<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.TransitionType.html" title="enum in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure.TransitionType</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.TransitionType.html#line.531">MOVE</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.TransitionType.html" title="enum in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure.TransitionType</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.TransitionType.html#line.540">MOVE</a></pre>
 </li>
 </ul>
 <a name="REOPEN">
@@ -243,7 +243,7 @@ the order they are declared.</div>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>REOPEN</h4>
-<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.TransitionType.html" title="enum in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure.TransitionType</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.TransitionType.html#line.531">REOPEN</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.TransitionType.html" title="enum in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure.TransitionType</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.TransitionType.html#line.540">REOPEN</a></pre>
 </li>
 </ul>
 </li>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html b/devapidocs/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html
index 8feb5b3..e1d6acf 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":9,"i1":10,"i2":10,"i3":10,"i4":10,"i5":9,"i6":9,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":9,"i17":10,"i18":10,"i19":9,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":9,"i26":10,"i27":10,"i28":9,"i29":10,"i30":10};
+var methods = {"i0":9,"i1":10,"i2":10,"i3":10,"i4":10,"i5":9,"i6":9,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":9,"i17":10,"i18":10,"i19":9,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":9,"i26":10,"i27":10,"i28":10,"i29":9,"i30":10,"i31":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";
@@ -490,22 +490,27 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 </td>
 </tr>
 <tr id="i27" class="rowColor">
+<td class="colFirst"><code>(package private) void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#stateLoaded-org.apache.hadoop.hbase.master.assignment.AssignmentManager-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">stateLoaded</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master.assignment">AssignmentManager</a>&nbsp;am,
+           <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode)</code>&nbsp;</td>
+</tr>
+<tr id="i28" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#toStringClassDetails-java.lang.StringBuilder-">toStringClassDetails</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/StringBuilder.html?is-external=true" title="class or interface in java.lang">StringBuilder</a>&nbsp;sb)</code>
 <div class="block">Extend the toString() information with the procedure details
  e.g.</div>
 </td>
 </tr>
-<tr id="i28" class="altColor">
+<tr id="i29" class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#unassign-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.client.RegionInfo-">unassign</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
         <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region)</code>&nbsp;</td>
 </tr>
-<tr id="i29" class="rowColor">
+<tr id="i30" class="altColor">
 <td class="colFirst"><code>(package private) void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#unattachRemoteProc-org.apache.hadoop.hbase.master.assignment.RegionRemoteProcedureBase-">unattachRemoteProc</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionRemoteProcedureBase</a>&nbsp;proc)</code>&nbsp;</td>
 </tr>
-<tr id="i30" class="altColor">
+<tr id="i31" class="rowColor">
 <td class="colFirst"><code>protected boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#waitInitialized-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">waitInitialized</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</code>
 <div class="block">The <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#doAcquireLock-TEnvironment-org.apache.hadoop.hbase.procedure2.store.ProcedureStore-"><code>Procedure.doAcquireLock(Object, ProcedureStore)</code></a> will be split into two steps, first, it will
@@ -940,13 +945,23 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.414">unattachRemoteProc</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionRemoteProcedureBase</a>&nbsp;proc)</pre>
 </li>
 </ul>
+<a name="stateLoaded-org.apache.hadoop.hbase.master.assignment.AssignmentManager-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>stateLoaded</h4>
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.422">stateLoaded</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master.assignment">AssignmentManager</a>&nbsp;am,
+                 <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode)</pre>
+</li>
+</ul>
 <a name="rollbackState-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionState-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>rollbackState</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.420">rollbackState</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.429">rollbackState</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                              org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionState&nbsp;state)
                       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
                              <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
@@ -968,7 +983,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>getState</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.427">getState</a>(int&nbsp;stateId)</pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.436">getState</a>(int&nbsp;stateId)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#getState-int-">StateMachineProcedure</a></code></span></div>
 <div class="block">Convert an ordinal (or state id) to an Enum (or more descriptive) state object.</div>
 <dl>
@@ -987,7 +1002,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>getStateId</h4>
-<pre>protected&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.432">getStateId</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionState&nbsp;state)</pre>
+<pre>protected&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.441">getStateId</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionState&nbsp;state)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#getStateId-TState-">StateMachineProcedure</a></code></span></div>
 <div class="block">Convert the Enum (or more descriptive) state object to an ordinal (or state id).</div>
 <dl>
@@ -1006,7 +1021,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>getInitialState</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.437">getInitialState</a>()</pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.446">getInitialState</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#getInitialState--">StateMachineProcedure</a></code></span></div>
 <div class="block">Return the initial state object that will be used for the first call to executeFromState().</div>
 <dl>
@@ -1023,7 +1038,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>convert</h4>
-<pre>private static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.TransitionType.html" title="enum in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure.TransitionType</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.441">convert</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionTransitionType&nbsp;type)</pre>
+<pre>private static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.TransitionType.html" title="enum in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure.TransitionType</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.450">convert</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionTransitionType&nbsp;type)</pre>
 </li>
 </ul>
 <a name="convert-org.apache.hadoop.hbase.master.assignment.TransitRegionStateProcedure.TransitionType-">
@@ -1032,7 +1047,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>convert</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionTransitionType&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.456">convert</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.TransitionType.html" title="enum in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure.TransitionType</a>&nbsp;type)</pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionTransitionType&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.465">convert</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.TransitionType.html" title="enum in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure.TransitionType</a>&nbsp;type)</pre>
 </li>
 </ul>
 <a name="serializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">
@@ -1041,7 +1056,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>serializeStateData</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.472">serializeStateData</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a>&nbsp;serializer)
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.481">serializeStateData</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a>&nbsp;serializer)
                            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#serializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">Procedure</a></code></span></div>
 <div class="block">The user-level code of the procedure may have some state to
@@ -1063,7 +1078,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>deserializeStateData</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.483">deserializeStateData</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a>&nbsp;serializer)
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.492">deserializeStateData</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a>&nbsp;serializer)
                              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#deserializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">Procedure</a></code></span></div>
 <div class="block">Called on store load to allow the user to decode the previously serialized
@@ -1084,7 +1099,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>getProcedureMetrics</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureMetrics.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureMetrics</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.496">getProcedureMetrics</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterPro [...]
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureMetrics.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureMetrics</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.505">getProcedureMetrics</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterPro [...]
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#getProcedureMetrics-TEnvironment-">Procedure</a></code></span></div>
 <div class="block">Override this method to provide procedure specific counters for submitted count, failed
  count and time histogram.</div>
@@ -1104,7 +1119,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>toStringClassDetails</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.513">toStringClassDetails</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/StringBuilder.html?is-external=true" title="class or interface in java.lang">StringBuilder</a>&nbsp;sb)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.522">toStringClassDetails</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/StringBuilder.html?is-external=true" title="class or interface in java.lang">StringBuilder</a>&nbsp;sb)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#toStringClassDetails-java.lang.StringBuilder-">Procedure</a></code></span></div>
 <div class="block">Extend the toString() information with the procedure details
  e.g. className and parameters</div>
@@ -1122,7 +1137,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>setOwner</h4>
-<pre>private static&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/TransitRegionStateProcedure.html#line.524">setOwner</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.m [...]
+<pre>private static&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/TransitRegionStateProcedure.html#line.533">setOwner</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.m [...]
                                                     <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>
@@ -1132,7 +1147,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>assign</h4>
-<pre>public static&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/TransitRegionStateProcedure.html#line.537">assign</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.mast [...]
+<pre>public static&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/TransitRegionStateProcedure.html#line.546">assign</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.mast [...]
                                                  <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region,
                                                  @Nullable
                                                  <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;targetServer)</pre>
@@ -1144,7 +1159,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>unassign</h4>
-<pre>public static&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/TransitRegionStateProcedure.html#line.543">unassign</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.ma [...]
+<pre>public static&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/TransitRegionStateProcedure.html#line.552">unassign</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.ma [...]
                                                    <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region)</pre>
 </li>
 </ul>
@@ -1154,7 +1169,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>reopen</h4>
-<pre>public static&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/TransitRegionStateProcedure.html#line.548">reopen</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.mast [...]
+<pre>public static&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/TransitRegionStateProcedure.html#line.557">reopen</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.mast [...]
                                                  <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region)</pre>
 </li>
 </ul>
@@ -1164,7 +1179,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockListLast">
 <li class="blockList">
 <h4>move</h4>
-<pre>public static&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/TransitRegionStateProcedure.html#line.553">move</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master [...]
+<pre>public static&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/TransitRegionStateProcedure.html#line.562">move</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master [...]
                                                <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region,
                                                @Nullable
                                                <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;targetServer)</pre>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/assignment/class-use/AssignmentManager.html b/devapidocs/org/apache/hadoop/hbase/master/assignment/class-use/AssignmentManager.html
index 89fd888..f2af4a9 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/assignment/class-use/AssignmentManager.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/assignment/class-use/AssignmentManager.html
@@ -154,6 +154,41 @@
 </tr>
 <tbody>
 <tr class="altColor">
+<td class="colFirst"><code>private void</code></td>
+<td class="colLast"><span class="typeNameLabel">OpenRegionProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html#regionOpenedWithoutPersistingToMeta-org.apache.hadoop.hbase.master.assignment.AssignmentManager-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">regionOpened [...]
+                                   <a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
+                                   org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;transitionCode,
+                                   long&nbsp;openSeqNum)</code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>protected abstract void</code></td>
+<td class="colLast"><span class="typeNameLabel">RegionRemoteProcedureBase.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#restoreSucceedState-org.apache.hadoop.hbase.master.assignment.AssignmentManager-org.apache.hadoop.hbase.master.assignment.RegionStateNode-long-">restoreSucceedState</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html" t [...]
+                   <a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
+                   long&nbsp;seqId)</code>&nbsp;</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>protected void</code></td>
+<td class="colLast"><span class="typeNameLabel">CloseRegionProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.html#restoreSucceedState-org.apache.hadoop.hbase.master.assignment.AssignmentManager-org.apache.hadoop.hbase.master.assignment.RegionStateNode-long-">restoreSucceedState</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html" title="clas [...]
+                   <a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
+                   long&nbsp;seqId)</code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>protected void</code></td>
+<td class="colLast"><span class="typeNameLabel">OpenRegionProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html#restoreSucceedState-org.apache.hadoop.hbase.master.assignment.AssignmentManager-org.apache.hadoop.hbase.master.assignment.RegionStateNode-long-">restoreSucceedState</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html" title="class  [...]
+                   <a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
+                   long&nbsp;openSeqNum)</code>&nbsp;</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>(package private) void</code></td>
+<td class="colLast"><span class="typeNameLabel">RegionRemoteProcedureBase.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#stateLoaded-org.apache.hadoop.hbase.master.assignment.AssignmentManager-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">stateLoaded</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html" title="class in org.ap [...]
+           <a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode)</code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>(package private) void</code></td>
+<td class="colLast"><span class="typeNameLabel">TransitRegionStateProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#stateLoaded-org.apache.hadoop.hbase.master.assignment.AssignmentManager-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">stateLoaded</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html" title="class in or [...]
+           <a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode)</code>&nbsp;</td>
+</tr>
+<tr class="altColor">
 <td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><span class="typeNameLabel">AssignmentManager.RegionInTransitionStat.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html#update-org.apache.hadoop.hbase.master.assignment.AssignmentManager-">update</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master.assignment">A [...]
 </tr>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/assignment/class-use/RegionStateNode.html b/devapidocs/org/apache/hadoop/hbase/master/assignment/class-use/RegionStateNode.html
index 34c09fd..c8ac714 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/assignment/class-use/RegionStateNode.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/assignment/class-use/RegionStateNode.html
@@ -241,82 +241,104 @@
 <td class="colLast"><span class="typeNameLabel">RegionStates.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#addToOfflineRegions-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">addToOfflineRegions</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode [...]
 </tr>
 <tr class="altColor">
+<td class="colFirst"><code>protected abstract void</code></td>
+<td class="colLast"><span class="typeNameLabel">RegionRemoteProcedureBase.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#checkTransition-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">checkTransition</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase [...]
+               org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;transitionCode,
+               long&nbsp;seqId)</code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>protected void</code></td>
+<td class="colLast"><span class="typeNameLabel">CloseRegionProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.html#checkTransition-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">checkTransition</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/as [...]
+               org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;transitionCode,
+               long&nbsp;seqId)</code>&nbsp;</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>protected void</code></td>
+<td class="colLast"><span class="typeNameLabel">OpenRegionProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html#checkTransition-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">checkTransition</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/assi [...]
+               org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;transitionCode,
+               long&nbsp;openSeqNum)</code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><span class="typeNameLabel">TransitRegionStateProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#closeRegion-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">closeRegion</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in or [...]
            <a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>int</code></td>
 <td class="colLast"><span class="typeNameLabel">RegionStateNode.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html#compareTo-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">compareTo</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;other)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2">StateMachineProcedure.Flow</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TransitRegionStateProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#confirmClosed-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">confirmClosed</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class i [...]
              <a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2">StateMachineProcedure.Flow</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TransitRegionStateProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#confirmOpened-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">confirmOpened</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class i [...]
              <a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a></code></td>
 <td class="colLast"><span class="typeNameLabel">AssignmentManager.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#createAssignProcedure-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.ServerName-boolean-">createAssignProcedure</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hba [...]
                      <a href="../../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;targetServer,
                      boolean&nbsp;override)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <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"><span class="typeNameLabel">RegionStates.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#createRegionForReopen-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">createRegionForReopen</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;node)< [...]
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><span class="typeNameLabel">RegionStates.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#createSnapshot-org.apache.hadoop.hbase.master.assignment.RegionStateNode-java.util.Map-">createSnapshot</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;node,
               <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 [...]
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a></code></td>
 <td class="colLast"><span class="typeNameLabel">AssignmentManager.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#createUnassignProcedure-org.apache.hadoop.hbase.master.assignment.RegionStateNode-boolean-">createUnassignProcedure</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionSta [...]
                        boolean&nbsp;override)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><span class="typeNameLabel">UnassignProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/UnassignProcedure.html#finishTransition-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">finishTransition</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.h [...]
                 <a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode)</code>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;</div>
 &nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><span class="typeNameLabel">AssignProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/AssignProcedure.html#finishTransition-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">finishTransition</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoo [...]
                 <a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode)</code>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;</div>
 &nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>protected abstract void</code></td>
 <td class="colLast"><span class="typeNameLabel">RegionTransitionProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionTransitionProcedure.html#finishTransition-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">finishTransition</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class [...]
                 <a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode)</code>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;</div>
 &nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) boolean</code></td>
 <td class="colLast"><span class="typeNameLabel">RegionStates.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#include-org.apache.hadoop.hbase.master.assignment.RegionStateNode-boolean-">include</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;node,
        boolean&nbsp;offline)</code>
 <div class="block">Utility.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><span class="typeNameLabel">TransitRegionStateProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#openRegion-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">openRegion</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org. [...]
           <a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><span class="typeNameLabel">RegionRemoteProcedureBase.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#persistAndWake-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">persistAndWake</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in  [...]
               <a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode)</code>&nbsp;</td>
 </tr>
+<tr class="rowColor">
+<td class="colFirst"><code>(package private) void</code></td>
+<td class="colLast"><span class="typeNameLabel">AssignmentManager.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#persistToMeta-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">persistToMeta</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode)< [...]
+</tr>
 <tr class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><span class="typeNameLabel">AssignmentManager.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#preTransitCheck-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.master.RegionState.State:A-">preTransitCheck</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.m [...]
@@ -335,21 +357,31 @@
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>(package private) void</code></td>
-<td class="colLast"><span class="typeNameLabel">AssignmentManager.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#regionClosed-org.apache.hadoop.hbase.master.assignment.RegionStateNode-boolean-">regionClosed</a></span>(<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)</code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">AssignmentManager.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#regionClosedAbnormally-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">regionClosedAbnormally</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a> [...]
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>(package private) void</code></td>
-<td class="colLast"><span class="typeNameLabel">AssignmentManager.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#regionClosing-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">regionClosing</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode)< [...]
+<td class="colLast"><span class="typeNameLabel">AssignmentManager.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#regionClosedWithoutPersistingToMeta-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">regionClosedWithoutPersistingToMeta</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assig [...]
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>(package private) void</code></td>
+<td class="colLast"><span class="typeNameLabel">AssignmentManager.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#regionClosing-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">regionClosing</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode)< [...]
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>(package private) void</code></td>
 <td class="colLast"><span class="typeNameLabel">AssignmentManager.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#regionFailedOpen-org.apache.hadoop.hbase.master.assignment.RegionStateNode-boolean-">regionFailedOpen</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbs [...]
                 boolean&nbsp;giveUp)</code>&nbsp;</td>
 </tr>
+<tr class="rowColor">
+<td class="colFirst"><code>private void</code></td>
+<td class="colLast"><span class="typeNameLabel">OpenRegionProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html#regionOpenedWithoutPersistingToMeta-org.apache.hadoop.hbase.master.assignment.AssignmentManager-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">regionOpened [...]
+                                   <a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
+                                   org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;transitionCode,
+                                   long&nbsp;openSeqNum)</code>&nbsp;</td>
+</tr>
 <tr class="altColor">
 <td class="colFirst"><code>(package private) void</code></td>
-<td class="colLast"><span class="typeNameLabel">AssignmentManager.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#regionOpened-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">regionOpened</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode)</c [...]
+<td class="colLast"><span class="typeNameLabel">AssignmentManager.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#regionOpenedWithoutPersistingToMeta-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">regionOpenedWithoutPersistingToMeta</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assig [...]
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>(package private) void</code></td>
@@ -433,30 +465,30 @@
                 long&nbsp;procId)</code>&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><code>protected abstract void</code></td>
-<td class="colLast"><span class="typeNameLabel">RegionRemoteProcedureBase.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#reportTransition-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">reportTransition</a></span>(<a href="../../../../../../../org/apache/hadoop/hba [...]
-                org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;transitionCode,
-                long&nbsp;seqId)</code>&nbsp;</td>
+<td class="colFirst"><code>private boolean</code></td>
+<td class="colLast"><span class="typeNameLabel">AssignmentManager.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#reportTransition-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.master.assignment.ServerStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-long-">reportTransition</a></span>(<a h [...]
+                <a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/ServerStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">ServerStateNode</a>&nbsp;serverNode,
+                org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;state,
+                long&nbsp;seqId,
+                long&nbsp;procId)</code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><code>protected void</code></td>
-<td class="colLast"><span class="typeNameLabel">CloseRegionProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.html#reportTransition-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">reportTransition</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/ [...]
-                org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;transitionCode,
-                long&nbsp;seqId)</code>&nbsp;</td>
+<td class="colFirst"><code>protected abstract void</code></td>
+<td class="colLast"><span class="typeNameLabel">RegionRemoteProcedureBase.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#restoreSucceedState-org.apache.hadoop.hbase.master.assignment.AssignmentManager-org.apache.hadoop.hbase.master.assignment.RegionStateNode-long-">restoreSucceedState</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html" t [...]
+                   <a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
+                   long&nbsp;seqId)</code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>protected void</code></td>
-<td class="colLast"><span class="typeNameLabel">OpenRegionProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html#reportTransition-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">reportTransition</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/as [...]
-                org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;transitionCode,
-                long&nbsp;seqId)</code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">CloseRegionProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.html#restoreSucceedState-org.apache.hadoop.hbase.master.assignment.AssignmentManager-org.apache.hadoop.hbase.master.assignment.RegionStateNode-long-">restoreSucceedState</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html" title="clas [...]
+                   <a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
+                   long&nbsp;seqId)</code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><code>private boolean</code></td>
-<td class="colLast"><span class="typeNameLabel">AssignmentManager.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#reportTransition-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.master.assignment.ServerStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-long-">reportTransition</a></span>(<a h [...]
-                <a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/ServerStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">ServerStateNode</a>&nbsp;serverNode,
-                org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;state,
-                long&nbsp;seqId,
-                long&nbsp;procId)</code>&nbsp;</td>
+<td class="colFirst"><code>protected void</code></td>
+<td class="colLast"><span class="typeNameLabel">OpenRegionProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html#restoreSucceedState-org.apache.hadoop.hbase.master.assignment.AssignmentManager-org.apache.hadoop.hbase.master.assignment.RegionStateNode-long-">restoreSucceedState</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html" title="class  [...]
+                   <a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
+                   long&nbsp;openSeqNum)</code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>(package private) void</code></td>
@@ -492,6 +524,16 @@
 &nbsp;</td>
 </tr>
 <tr class="rowColor">
+<td class="colFirst"><code>(package private) void</code></td>
+<td class="colLast"><span class="typeNameLabel">RegionRemoteProcedureBase.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#stateLoaded-org.apache.hadoop.hbase.master.assignment.AssignmentManager-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">stateLoaded</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html" title="class in org.ap [...]
+           <a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode)</code>&nbsp;</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>(package private) void</code></td>
+<td class="colLast"><span class="typeNameLabel">TransitRegionStateProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#stateLoaded-org.apache.hadoop.hbase.master.assignment.AssignmentManager-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">stateLoaded</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html" title="class in or [...]
+           <a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode)</code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><span class="typeNameLabel">AssignmentManager.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#transitStateAndUpdate-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.master.RegionState.State-org.apache.hadoop.hbase.master.RegionState.State...-">transitStateAndUpdate</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/R [...]
                      <a href="../../../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master">RegionState.State</a>&nbsp;newState,
@@ -524,24 +566,24 @@
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>protected abstract void</code></td>
-<td class="colLast"><span class="typeNameLabel">RegionRemoteProcedureBase.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#updateTransition-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">updateTransition</a [...]
-                <a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
-                org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;transitionCode,
-                long&nbsp;seqId)</code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">RegionRemoteProcedureBase.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#updateTransitionWithoutPersistingToMeta-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-lon [...]
+                                       <a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
+                                       org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;transitionCode,
+                                       long&nbsp;seqId)</code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>protected void</code></td>
-<td class="colLast"><span class="typeNameLabel">CloseRegionProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.html#updateTransition-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">updateTransition</a></span>(< [...]
-                <a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
-                org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;transitionCode,
-                long&nbsp;seqId)</code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">CloseRegionProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.html#updateTransitionWithoutPersistingToMeta-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">update [...]
+                                       <a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
+                                       org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;transitionCode,
+                                       long&nbsp;seqId)</code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>protected void</code></td>
-<td class="colLast"><span class="typeNameLabel">OpenRegionProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html#updateTransition-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">updateTransition</a></span>(<a  [...]
-                <a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
-                org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;transitionCode,
-                long&nbsp;openSeqNum)</code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">OpenRegionProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html#updateTransitionWithoutPersistingToMeta-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">updateTr [...]
+                                       <a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
+                                       org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;transitionCode,
+                                       long&nbsp;openSeqNum)</code>&nbsp;</td>
 </tr>
 </tbody>
 </table>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/assignment/package-tree.html b/devapidocs/org/apache/hadoop/hbase/master/assignment/package-tree.html
index f63d55a..e0b322d 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/assignment/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/assignment/package-tree.html
@@ -148,8 +148,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.master.assignment.<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.TransitionType.html" title="enum in org.apache.hadoop.hbase.master.assignment"><span class="typeNameLink">TransitRegionStateProcedure.TransitionType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.assignment.<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/ServerState.html" title="enum in org.apache.hadoop.hbase.master.assignment"><span class="typeNameLink">ServerState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.assignment.<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.TransitionType.html" title="enum in org.apache.hadoop.hbase.master.assignment"><span class="typeNameLink">TransitRegionStateProcedure.TransitionType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html
index 848d41f..c49c655 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html
@@ -198,8 +198,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.master.balancer.<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.Type.html" title="enum in org.apache.hadoop.hbase.master.balancer"><span class="typeNameLink">BaseLoadBalancer.Cluster.Action.Type</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.balancer.<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.LocalityType.html" title="enum in org.apache.hadoop.hbase.master.balancer"><span class="typeNameLink">BaseLoadBalancer.Cluster.LocalityType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.balancer.<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.Type.html" title="enum in org.apache.hadoop.hbase.master.balancer"><span class="typeNameLink">BaseLoadBalancer.Cluster.Action.Type</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/package-tree.html b/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
index 9faf92b..181f83b 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
@@ -355,11 +355,11 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/MetricsMasterSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">MetricsMasterSourceFactoryImpl.FactoryStorage</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.TerminationStatus.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">SplitLogManager.TerminationStatus</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.ResubmitDirective.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">SplitLogManager.ResubmitDirective</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/MasterRpcServices.BalanceSwitchMode.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">MasterRpcServices.BalanceSwitchMode</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">RegionState.State</span></a></li>
+<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>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/procedure/class-use/MasterProcedureEnv.html b/devapidocs/org/apache/hadoop/hbase/master/procedure/class-use/MasterProcedureEnv.html
index 3a5f96c..529cd23 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/procedure/class-use/MasterProcedureEnv.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/procedure/class-use/MasterProcedureEnv.html
@@ -946,24 +946,24 @@
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>protected abstract void</code></td>
-<td class="colLast"><span class="typeNameLabel">RegionRemoteProcedureBase.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#updateTransition-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">updateTransition</a [...]
-                <a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
-                org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;transitionCode,
-                long&nbsp;seqId)</code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">RegionRemoteProcedureBase.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#updateTransitionWithoutPersistingToMeta-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-lon [...]
+                                       <a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
+                                       org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;transitionCode,
+                                       long&nbsp;seqId)</code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>protected void</code></td>
-<td class="colLast"><span class="typeNameLabel">CloseRegionProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.html#updateTransition-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">updateTransition</a></span>(< [...]
-                <a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
-                org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;transitionCode,
-                long&nbsp;seqId)</code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">CloseRegionProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.html#updateTransitionWithoutPersistingToMeta-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">update [...]
+                                       <a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
+                                       org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;transitionCode,
+                                       long&nbsp;seqId)</code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>protected void</code></td>
-<td class="colLast"><span class="typeNameLabel">OpenRegionProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html#updateTransition-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">updateTransition</a></span>(<a  [...]
-                <a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
-                org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;transitionCode,
-                long&nbsp;openSeqNum)</code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">OpenRegionProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.html#updateTransitionWithoutPersistingToMeta-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">updateTr [...]
+                                       <a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
+                                       org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;transitionCode,
+                                       long&nbsp;openSeqNum)</code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>protected boolean</code></td>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html b/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
index a8186f6..b0c994a 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
@@ -216,10 +216,10 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/PeerProcedureInterface.PeerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">PeerProcedureInterface.PeerOperationType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.TableOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">TableProcedureInterface.TableOperationType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MetaProcedureInterface.MetaOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">MetaProcedureInterface.MetaOperationType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ServerProcedureInterface.ServerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">ServerProcedureInterface.ServerOperationType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/PeerProcedureInterface.PeerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">PeerProcedureInterface.PeerOperationType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/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 5ab3a08..3c9a6f8 100644
--- a/devapidocs/org/apache/hadoop/hbase/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/package-tree.html
@@ -433,19 +433,19 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CellBuilderType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CellBuilderType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HealthChecker.HealthCheckerExitStatus.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HealthChecker.HealthCheckerExitStatus</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ClusterMetrics.Option.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ClusterMetrics.Option</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/KeyValue.Type.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeyValue.Type</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Coprocessor.State.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Coprocessor.State</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CompatibilitySingletonFactory.SingletonStorage.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompatibilitySingletonFactory.SingletonStorage</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MetaTableAccessor.QueryType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/KeepDeletedCells.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeepDeletedCells</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/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/CompareOperator.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompareOperator</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HConstants.OperationStatusCode.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HConstants.OperationStatusCode</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/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/Coprocessor.State.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Coprocessor.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CompatibilitySingletonFactory.SingletonStorage.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompatibilitySingletonFactory.SingletonStorage</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/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/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/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/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/CellBuilderType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CellBuilderType</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 da2c424..4b00cd5 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/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">StateMachineProcedure.Flow</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/LockType.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">LockType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/RootProcedureState.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">RootProcedureState.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/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/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/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">StateMachineProcedure.Flow</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 ddc2ebc..762d3a8 100644
--- a/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
@@ -240,12 +240,12 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.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/OperationQuota.OperationType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">OperationQuota.OperationType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/RpcThrottlingException.Type.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">RpcThrottlingException.Type</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/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/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/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/RpcThrottlingException.Type.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">RpcThrottlingException.Type</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html b/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
index 05b65de..013c526 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -715,20 +715,20 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/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/DefaultHeapMemoryTuner.StepDirection.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">DefaultHeapMemoryTuner.StepDirection</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">HRegion.FlushResult.Result</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.LimitScope.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScannerContext.LimitScope</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ChunkCreator.ChunkType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ChunkCreator.ChunkType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/CompactingMemStore.IndexType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">CompactingMemStore.IndexType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TimeRangeTracker.Type.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TimeRangeTracker.Type</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScanType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.NextState.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScannerContext.NextState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.Operation.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">Region.Operation</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">FlushType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/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/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/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/BloomType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">BloomType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsRegionServerSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MetricsRegionServerSourceFactoryImpl.FactoryStorage</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/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/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/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/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/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/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/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/ChunkCreator.ChunkType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ChunkCreator.ChunkType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html b/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html
index b195b74..dc05e9f 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html
@@ -130,9 +130,9 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.regionserver.querymatcher.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/StripeCompactionScanQueryMatcher.DropDeletesInOutput.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">StripeCompactionScanQueryMatcher.DropDeletesInOutput</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.querymatcher.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">ScanQueryMatcher.MatchCode</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.querymatcher.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/DeleteTracker.DeleteResult.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">DeleteTracker.DeleteResult</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.querymatcher.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">ScanQueryMatcher.MatchCode</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.querymatcher.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/StripeCompactionScanQueryMatcher.DropDeletesInOutput.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">StripeCompactionScanQueryMatcher.DropDeletesInOutput</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 5ef6472..7291aff 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
@@ -247,10 +247,10 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/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>
-<li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/WALActionsListener.RollRequestReason.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">WALActionsListener.RollRequestReason</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/CompressionContext.DictionaryIndex.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">CompressionContext.DictionaryIndex</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/WALActionsListener.RollRequestReason.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">WALActionsListener.RollRequestReason</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/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>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html b/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html
index 19d2ff4..9a2ed16 100644
--- a/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html
@@ -208,8 +208,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.replication.regionserver.<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.WorkerState.html" title="enum in org.apache.hadoop.hbase.replication.regionserver"><span class="typeNameLink">ReplicationSourceShipper.WorkerState</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.replication.regionserver.<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceFactoryImpl.SourceHolder.html" title="enum in org.apache.hadoop.hbase.replication.regionserver"><span class="typeNameLink">MetricsReplicationSourceFactoryImpl.SourceHolder</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.replication.regionserver.<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.WorkerState.html" title="enum in org.apache.hadoop.hbase.replication.regionserver"><span class="typeNameLink">ReplicationSourceShipper.WorkerState</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/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 fe5966a..db71036 100644
--- a/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
@@ -143,10 +143,10 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">AccessController.OpType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/Permission.Action.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">Permission.Action</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/Permission.Scope.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">Permission.Scope</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessControlFilter.Strategy.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">AccessControlFilter.Strategy</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">AccessController.OpType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/security/package-tree.html b/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
index 3e32f6b..bd591e2 100644
--- a/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
@@ -192,9 +192,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.security.<a href="../../../../../org/apache/hadoop/hbase/security/AuthMethod.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">AuthMethod</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslUtil.QualityOfProtection.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">SaslUtil.QualityOfProtection</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslStatus.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">SaslStatus</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslUtil.QualityOfProtection.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">SaslUtil.QualityOfProtection</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/AuthMethod.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">AuthMethod</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/util/package-tree.html b/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
index d6a0001..8914264 100644
--- a/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
@@ -542,14 +542,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/Order.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Order</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PrettyPrinter.Unit.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PrettyPrinter.Unit</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/IdReadWriteLock.ReferenceType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">IdReadWriteLock.ReferenceType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PoolMap.PoolType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PoolMap.PoolType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/ChecksumType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">ChecksumType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Order.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Order</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/HBaseFsck.ErrorReporter.ERROR_CODE.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">HBaseFsck.ErrorReporter.ERROR_CODE</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.LexicographicalComparerHolder.PureJavaComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Bytes.LexicographicalComparerHolder.PureJavaComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PoolMap.PoolType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PoolMap.PoolType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.LexicographicalComparerHolder.UnsafeComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Bytes.LexicographicalComparerHolder.UnsafeComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/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/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>
 </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 e9b5616..7960fff 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
@@ -18,9 +18,9 @@
 <span class="sourceLineNo">010</span>  public static final String version = "3.0.0-SNAPSHOT";<a name="line.10"></a>
 <span class="sourceLineNo">011</span>  public static final String revision = "Unknown";<a name="line.11"></a>
 <span class="sourceLineNo">012</span>  public static final String user = "jenkins";<a name="line.12"></a>
-<span class="sourceLineNo">013</span>  public static final String date = "Sat May 11 14:34:49 UTC 2019";<a name="line.13"></a>
+<span class="sourceLineNo">013</span>  public static final String date = "Mon May 13 14:34:49 UTC 2019";<a name="line.13"></a>
 <span class="sourceLineNo">014</span>  public static final String url = "file:///home/jenkins/jenkins-slave/workspace/hbase_generate_website/hbase";<a name="line.14"></a>
-<span class="sourceLineNo">015</span>  public static final String srcChecksum = "07462550979c5f1c2a6e0a5b8b0f4caa";<a name="line.15"></a>
+<span class="sourceLineNo">015</span>  public static final String srcChecksum = "571d6868a121c249bdcff0e1f7675c34";<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/master/assignment/AssignmentManager.RegionInTransitionChore.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionChore.html
index f7cfdf8..f2f276f 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
@@ -221,1101 +221,1101 @@
 <span class="sourceLineNo">213</span>      try {<a name="line.213"></a>
 <span class="sourceLineNo">214</span>        regionNode.setRegionLocation(regionState.getServerName());<a name="line.214"></a>
 <span class="sourceLineNo">215</span>        regionNode.setState(regionState.getState());<a name="line.215"></a>
-<span class="sourceLineNo">216</span>        setMetaAssigned(regionState.getRegion(), regionState.getState() == State.OPEN);<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      } finally {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>        regionNode.unlock();<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>  }<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>  /**<a name="line.223"></a>
-<span class="sourceLineNo">224</span>   * Create RegionStateNode based on the TRSP list, and attach the TRSP to the RegionStateNode.<a name="line.224"></a>
-<span class="sourceLineNo">225</span>   * &lt;p&gt;<a name="line.225"></a>
-<span class="sourceLineNo">226</span>   * This is used to restore the RIT region list, so we do not need to restore it in the loadingMeta<a name="line.226"></a>
-<span class="sourceLineNo">227</span>   * method below. And it is also very important as now before submitting a TRSP, we need to attach<a name="line.227"></a>
-<span class="sourceLineNo">228</span>   * it to the RegionStateNode, which acts like a guard, so we need to restore this information at<a name="line.228"></a>
-<span class="sourceLineNo">229</span>   * the very beginning, before we start processing any procedures.<a name="line.229"></a>
-<span class="sourceLineNo">230</span>   */<a name="line.230"></a>
-<span class="sourceLineNo">231</span>  public void setupRIT(List&lt;TransitRegionStateProcedure&gt; procs) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    procs.forEach(proc -&gt; {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>      RegionInfo regionInfo = proc.getRegion();<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      RegionStateNode regionNode = regionStates.getOrCreateRegionStateNode(regionInfo);<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      TransitRegionStateProcedure existingProc = regionNode.getProcedure();<a name="line.235"></a>
-<span class="sourceLineNo">236</span>      if (existingProc != null) {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>        // This is possible, as we will detach the procedure from the RSN before we<a name="line.237"></a>
-<span class="sourceLineNo">238</span>        // actually finish the procedure. This is because that, we will update the region state<a name="line.238"></a>
-<span class="sourceLineNo">239</span>        // directly in the reportTransition method for TRSP, and theoretically the region transition<a name="line.239"></a>
-<span class="sourceLineNo">240</span>        // has been done, so we need to detach the procedure from the RSN. But actually the<a name="line.240"></a>
-<span class="sourceLineNo">241</span>        // procedure has not been marked as done in the pv2 framework yet, so it is possible that we<a name="line.241"></a>
-<span class="sourceLineNo">242</span>        // schedule a new TRSP immediately and when arriving here, we will find out that there are<a name="line.242"></a>
-<span class="sourceLineNo">243</span>        // multiple TRSPs for the region. But we can make sure that, only the last one can take the<a name="line.243"></a>
-<span class="sourceLineNo">244</span>        // charge, the previous ones should have all been finished already.<a name="line.244"></a>
-<span class="sourceLineNo">245</span>        // So here we will compare the proc id, the greater one will win.<a name="line.245"></a>
-<span class="sourceLineNo">246</span>        if (existingProc.getProcId() &lt; proc.getProcId()) {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>          // the new one wins, unset and set it to the new one below<a name="line.247"></a>
-<span class="sourceLineNo">248</span>          regionNode.unsetProcedure(existingProc);<a name="line.248"></a>
-<span class="sourceLineNo">249</span>        } else {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>          // the old one wins, skip<a name="line.250"></a>
-<span class="sourceLineNo">251</span>          return;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>        }<a name="line.252"></a>
-<span class="sourceLineNo">253</span>      }<a name="line.253"></a>
-<span class="sourceLineNo">254</span>      LOG.info("Attach {} to {} to restore RIT", proc, regionNode);<a name="line.254"></a>
-<span class="sourceLineNo">255</span>      regionNode.setProcedure(proc);<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><a name="line.258"></a>
-<span class="sourceLineNo">259</span>  public void stop() {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    if (!running.compareAndSet(true, false)) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      return;<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    }<a name="line.262"></a>
-<span class="sourceLineNo">263</span><a name="line.263"></a>
-<span class="sourceLineNo">264</span>    LOG.info("Stopping assignment manager");<a name="line.264"></a>
-<span class="sourceLineNo">265</span><a name="line.265"></a>
-<span class="sourceLineNo">266</span>    // The AM is started before the procedure executor,<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    // but the actual work will be loaded/submitted only once we have the executor<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    final boolean hasProcExecutor = master.getMasterProcedureExecutor() != null;<a name="line.268"></a>
-<span class="sourceLineNo">269</span><a name="line.269"></a>
-<span class="sourceLineNo">270</span>    // Remove the RIT chore<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    if (hasProcExecutor) {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>      master.getMasterProcedureExecutor().removeChore(this.ritChore);<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    }<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    // Stop the Assignment Thread<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    stopAssignmentThread();<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>    // Stop the RegionStateStore<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    regionStates.clear();<a name="line.279"></a>
-<span class="sourceLineNo">280</span><a name="line.280"></a>
-<span class="sourceLineNo">281</span>    // Update meta events (for testing)<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    if (hasProcExecutor) {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      metaLoadEvent.suspend();<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      for (RegionInfo hri: getMetaRegionSet()) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        setMetaAssigned(hri, false);<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>  }<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span>  public boolean isRunning() {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>    return running.get();<a name="line.291"></a>
-<span class="sourceLineNo">292</span>  }<a name="line.292"></a>
-<span class="sourceLineNo">293</span><a name="line.293"></a>
-<span class="sourceLineNo">294</span>  public Configuration getConfiguration() {<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    return master.getConfiguration();<a name="line.295"></a>
-<span class="sourceLineNo">296</span>  }<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>  public MetricsAssignmentManager getAssignmentManagerMetrics() {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    return metrics;<a name="line.299"></a>
-<span class="sourceLineNo">300</span>  }<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>  private LoadBalancer getBalancer() {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    return master.getLoadBalancer();<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  }<a name="line.304"></a>
-<span class="sourceLineNo">305</span><a name="line.305"></a>
-<span class="sourceLineNo">306</span>  private MasterProcedureEnv getProcedureEnvironment() {<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    return master.getMasterProcedureExecutor().getEnvironment();<a name="line.307"></a>
-<span class="sourceLineNo">308</span>  }<a name="line.308"></a>
-<span class="sourceLineNo">309</span><a name="line.309"></a>
-<span class="sourceLineNo">310</span>  private MasterProcedureScheduler getProcedureScheduler() {<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    return getProcedureEnvironment().getProcedureScheduler();<a name="line.311"></a>
-<span class="sourceLineNo">312</span>  }<a name="line.312"></a>
-<span class="sourceLineNo">313</span><a name="line.313"></a>
-<span class="sourceLineNo">314</span>  int getAssignMaxAttempts() {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    return assignMaxAttempts;<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
-<span class="sourceLineNo">317</span><a name="line.317"></a>
-<span class="sourceLineNo">318</span>  int getAssignRetryImmediatelyMaxAttempts() {<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    return assignRetryImmediatelyMaxAttempts;<a name="line.319"></a>
-<span class="sourceLineNo">320</span>  }<a name="line.320"></a>
-<span class="sourceLineNo">321</span><a name="line.321"></a>
-<span class="sourceLineNo">322</span>  public RegionStates getRegionStates() {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    return regionStates;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>  }<a name="line.324"></a>
-<span class="sourceLineNo">325</span><a name="line.325"></a>
-<span class="sourceLineNo">326</span>  /**<a name="line.326"></a>
-<span class="sourceLineNo">327</span>   * Returns the regions hosted by the specified server.<a name="line.327"></a>
-<span class="sourceLineNo">328</span>   * &lt;p/&gt;<a name="line.328"></a>
-<span class="sourceLineNo">329</span>   * Notice that, for SCP, after we submit the SCP, no one can change the region list for the<a name="line.329"></a>
-<span class="sourceLineNo">330</span>   * ServerStateNode so we do not need any locks here. And for other usage, this can only give you a<a name="line.330"></a>
-<span class="sourceLineNo">331</span>   * snapshot of the current region list for this server, which means, right after you get the<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * region list, new regions may be moved to this server or some regions may be moved out from this<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * server, so you should not use it critically if you need strong consistency.<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   */<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  public List&lt;RegionInfo&gt; getRegionsOnServer(ServerName serverName) {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    ServerStateNode serverInfo = regionStates.getServerNode(serverName);<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    if (serverInfo == null) {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      return Collections.emptyList();<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    }<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    return serverInfo.getRegionInfoList();<a name="line.340"></a>
-<span class="sourceLineNo">341</span>  }<a name="line.341"></a>
-<span class="sourceLineNo">342</span><a name="line.342"></a>
-<span class="sourceLineNo">343</span>  public RegionStateStore getRegionStateStore() {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    return regionStateStore;<a name="line.344"></a>
-<span class="sourceLineNo">345</span>  }<a name="line.345"></a>
-<span class="sourceLineNo">346</span><a name="line.346"></a>
-<span class="sourceLineNo">347</span>  public List&lt;ServerName&gt; getFavoredNodes(final RegionInfo regionInfo) {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    return this.shouldAssignRegionsWithFavoredNodes<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      ? ((FavoredStochasticBalancer) getBalancer()).getFavoredNodes(regionInfo)<a name="line.349"></a>
-<span class="sourceLineNo">350</span>      : ServerName.EMPTY_SERVER_LIST;<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  }<a name="line.351"></a>
-<span class="sourceLineNo">352</span><a name="line.352"></a>
-<span class="sourceLineNo">353</span>  // ============================================================================================<a name="line.353"></a>
-<span class="sourceLineNo">354</span>  //  Table State Manager helpers<a name="line.354"></a>
-<span class="sourceLineNo">355</span>  // ============================================================================================<a name="line.355"></a>
-<span class="sourceLineNo">356</span>  TableStateManager getTableStateManager() {<a name="line.356"></a>
-<span class="sourceLineNo">357</span>    return master.getTableStateManager();<a name="line.357"></a>
-<span class="sourceLineNo">358</span>  }<a name="line.358"></a>
-<span class="sourceLineNo">359</span><a name="line.359"></a>
-<span class="sourceLineNo">360</span>  public boolean isTableEnabled(final TableName tableName) {<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    return getTableStateManager().isTableState(tableName, TableState.State.ENABLED);<a name="line.361"></a>
-<span class="sourceLineNo">362</span>  }<a name="line.362"></a>
-<span class="sourceLineNo">363</span><a name="line.363"></a>
-<span class="sourceLineNo">364</span>  public boolean isTableDisabled(final TableName tableName) {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>    return getTableStateManager().isTableState(tableName,<a name="line.365"></a>
-<span class="sourceLineNo">366</span>      TableState.State.DISABLED, TableState.State.DISABLING);<a name="line.366"></a>
-<span class="sourceLineNo">367</span>  }<a name="line.367"></a>
-<span class="sourceLineNo">368</span><a name="line.368"></a>
-<span class="sourceLineNo">369</span>  // ============================================================================================<a name="line.369"></a>
-<span class="sourceLineNo">370</span>  //  META Helpers<a name="line.370"></a>
-<span class="sourceLineNo">371</span>  // ============================================================================================<a name="line.371"></a>
-<span class="sourceLineNo">372</span>  private boolean isMetaRegion(final RegionInfo regionInfo) {<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    return regionInfo.isMetaRegion();<a name="line.373"></a>
-<span class="sourceLineNo">374</span>  }<a name="line.374"></a>
-<span class="sourceLineNo">375</span><a name="line.375"></a>
-<span class="sourceLineNo">376</span>  public boolean isMetaRegion(final byte[] regionName) {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    return getMetaRegionFromName(regionName) != null;<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  }<a name="line.378"></a>
-<span class="sourceLineNo">379</span><a name="line.379"></a>
-<span class="sourceLineNo">380</span>  public RegionInfo getMetaRegionFromName(final byte[] regionName) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    for (RegionInfo hri: getMetaRegionSet()) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>      if (Bytes.equals(hri.getRegionName(), regionName)) {<a name="line.382"></a>
-<span class="sourceLineNo">383</span>        return hri;<a name="line.383"></a>
-<span class="sourceLineNo">384</span>      }<a name="line.384"></a>
-<span class="sourceLineNo">385</span>    }<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    return null;<a name="line.386"></a>
-<span class="sourceLineNo">387</span>  }<a name="line.387"></a>
-<span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>  public boolean isCarryingMeta(final ServerName serverName) {<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    // TODO: handle multiple meta<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    return isCarryingRegion(serverName, RegionInfoBuilder.FIRST_META_REGIONINFO);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>  }<a name="line.392"></a>
-<span class="sourceLineNo">393</span><a name="line.393"></a>
-<span class="sourceLineNo">394</span>  private boolean isCarryingRegion(final ServerName serverName, final RegionInfo regionInfo) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    // TODO: check for state?<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    final RegionStateNode node = regionStates.getRegionStateNode(regionInfo);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    return(node != null &amp;&amp; serverName.equals(node.getRegionLocation()));<a name="line.397"></a>
-<span class="sourceLineNo">398</span>  }<a name="line.398"></a>
-<span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>  private RegionInfo getMetaForRegion(final RegionInfo regionInfo) {<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    //if (regionInfo.isMetaRegion()) return regionInfo;<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    // TODO: handle multiple meta. if the region provided is not meta lookup<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    // which meta the region belongs to.<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    return RegionInfoBuilder.FIRST_META_REGIONINFO;<a name="line.404"></a>
-<span class="sourceLineNo">405</span>  }<a name="line.405"></a>
-<span class="sourceLineNo">406</span><a name="line.406"></a>
-<span class="sourceLineNo">407</span>  // TODO: handle multiple meta.<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  private static final Set&lt;RegionInfo&gt; META_REGION_SET =<a name="line.408"></a>
-<span class="sourceLineNo">409</span>      Collections.singleton(RegionInfoBuilder.FIRST_META_REGIONINFO);<a name="line.409"></a>
-<span class="sourceLineNo">410</span>  public Set&lt;RegionInfo&gt; getMetaRegionSet() {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    return META_REGION_SET;<a name="line.411"></a>
-<span class="sourceLineNo">412</span>  }<a name="line.412"></a>
-<span class="sourceLineNo">413</span><a name="line.413"></a>
-<span class="sourceLineNo">414</span>  // ============================================================================================<a name="line.414"></a>
-<span class="sourceLineNo">415</span>  //  META Event(s) helpers<a name="line.415"></a>
-<span class="sourceLineNo">416</span>  // ============================================================================================<a name="line.416"></a>
-<span class="sourceLineNo">417</span>  /**<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   * Notice that, this only means the meta region is available on a RS, but the AM may still be<a name="line.418"></a>
-<span class="sourceLineNo">419</span>   * loading the region states from meta, so usually you need to check {@link #isMetaLoaded()} first<a name="line.419"></a>
-<span class="sourceLineNo">420</span>   * before checking this method, unless you can make sure that your piece of code can only be<a name="line.420"></a>
-<span class="sourceLineNo">421</span>   * executed after AM builds the region states.<a name="line.421"></a>
-<span class="sourceLineNo">422</span>   * @see #isMetaLoaded()<a name="line.422"></a>
-<span class="sourceLineNo">423</span>   */<a name="line.423"></a>
-<span class="sourceLineNo">424</span>  public boolean isMetaAssigned() {<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    return metaAssignEvent.isReady();<a name="line.425"></a>
-<span class="sourceLineNo">426</span>  }<a name="line.426"></a>
-<span class="sourceLineNo">427</span><a name="line.427"></a>
-<span class="sourceLineNo">428</span>  public boolean isMetaRegionInTransition() {<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return !isMetaAssigned();<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  }<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  /**<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   * Notice that this event does not mean the AM has already finished region state rebuilding. See<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   * the comment of {@link #isMetaAssigned()} for more details.<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   * @see #isMetaAssigned()<a name="line.435"></a>
-<span class="sourceLineNo">436</span>   */<a name="line.436"></a>
-<span class="sourceLineNo">437</span>  public boolean waitMetaAssigned(Procedure&lt;?&gt; proc, RegionInfo regionInfo) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    return getMetaAssignEvent(getMetaForRegion(regionInfo)).suspendIfNotReady(proc);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>  }<a name="line.439"></a>
-<span class="sourceLineNo">440</span><a name="line.440"></a>
-<span class="sourceLineNo">441</span>  private void setMetaAssigned(RegionInfo metaRegionInfo, boolean assigned) {<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    assert isMetaRegion(metaRegionInfo) : "unexpected non-meta region " + metaRegionInfo;<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    ProcedureEvent&lt;?&gt; metaAssignEvent = getMetaAssignEvent(metaRegionInfo);<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    if (assigned) {<a name="line.444"></a>
-<span class="sourceLineNo">445</span>      metaAssignEvent.wake(getProcedureScheduler());<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    } else {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      metaAssignEvent.suspend();<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    }<a name="line.448"></a>
-<span class="sourceLineNo">449</span>  }<a name="line.449"></a>
-<span class="sourceLineNo">450</span><a name="line.450"></a>
-<span class="sourceLineNo">451</span>  private ProcedureEvent&lt;?&gt; getMetaAssignEvent(RegionInfo metaRegionInfo) {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    assert isMetaRegion(metaRegionInfo) : "unexpected non-meta region " + metaRegionInfo;<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    // TODO: handle multiple meta.<a name="line.453"></a>
-<span class="sourceLineNo">454</span>    return metaAssignEvent;<a name="line.454"></a>
-<span class="sourceLineNo">455</span>  }<a name="line.455"></a>
-<span class="sourceLineNo">456</span><a name="line.456"></a>
-<span class="sourceLineNo">457</span>  /**<a name="line.457"></a>
-<span class="sourceLineNo">458</span>   * Wait until AM finishes the meta loading, i.e, the region states rebuilding.<a name="line.458"></a>
-<span class="sourceLineNo">459</span>   * @see #isMetaLoaded()<a name="line.459"></a>
-<span class="sourceLineNo">460</span>   * @see #waitMetaAssigned(Procedure, RegionInfo)<a name="line.460"></a>
-<span class="sourceLineNo">461</span>   */<a name="line.461"></a>
-<span class="sourceLineNo">462</span>  public boolean waitMetaLoaded(Procedure&lt;?&gt; proc) {<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    return metaLoadEvent.suspendIfNotReady(proc);<a name="line.463"></a>
-<span class="sourceLineNo">464</span>  }<a name="line.464"></a>
-<span class="sourceLineNo">465</span><a name="line.465"></a>
-<span class="sourceLineNo">466</span>  @VisibleForTesting<a name="line.466"></a>
-<span class="sourceLineNo">467</span>  void wakeMetaLoadedEvent() {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>    metaLoadEvent.wake(getProcedureScheduler());<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    assert isMetaLoaded() : "expected meta to be loaded";<a name="line.469"></a>
-<span class="sourceLineNo">470</span>  }<a name="line.470"></a>
-<span class="sourceLineNo">471</span><a name="line.471"></a>
-<span class="sourceLineNo">472</span>  /**<a name="line.472"></a>
-<span class="sourceLineNo">473</span>   * Return whether AM finishes the meta loading, i.e, the region states rebuilding.<a name="line.473"></a>
-<span class="sourceLineNo">474</span>   * @see #isMetaAssigned()<a name="line.474"></a>
-<span class="sourceLineNo">475</span>   * @see #waitMetaLoaded(Procedure)<a name="line.475"></a>
-<span class="sourceLineNo">476</span>   */<a name="line.476"></a>
-<span class="sourceLineNo">477</span>  public boolean isMetaLoaded() {<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    return metaLoadEvent.isReady();<a name="line.478"></a>
-<span class="sourceLineNo">479</span>  }<a name="line.479"></a>
-<span class="sourceLineNo">480</span><a name="line.480"></a>
-<span class="sourceLineNo">481</span>  /**<a name="line.481"></a>
-<span class="sourceLineNo">482</span>   * Start a new thread to check if there are region servers whose versions are higher than others.<a name="line.482"></a>
-<span class="sourceLineNo">483</span>   * If so, move all system table regions to RS with the highest version to keep compatibility.<a name="line.483"></a>
-<span class="sourceLineNo">484</span>   * The reason is, RS in new version may not be able to access RS in old version when there are<a name="line.484"></a>
-<span class="sourceLineNo">485</span>   * some incompatible changes.<a name="line.485"></a>
-<span class="sourceLineNo">486</span>   * &lt;p&gt;This method is called when a new RegionServer is added to cluster only.&lt;/p&gt;<a name="line.486"></a>
-<span class="sourceLineNo">487</span>   */<a name="line.487"></a>
-<span class="sourceLineNo">488</span>  public void checkIfShouldMoveSystemRegionAsync() {<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    // TODO: Fix this thread. If a server is killed and a new one started, this thread thinks that<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    // it should 'move' the system tables from the old server to the new server but<a name="line.490"></a>
-<span class="sourceLineNo">491</span>    // ServerCrashProcedure is on it; and it will take care of the assign without dataloss.<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    if (this.master.getServerManager().countOfRegionServers() &lt;= 1) {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      return;<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    }<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    // This thread used to run whenever there was a change in the cluster. The ZooKeeper<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    // childrenChanged notification came in before the nodeDeleted message and so this method<a name="line.496"></a>
-<span class="sourceLineNo">497</span>    // cold run before a ServerCrashProcedure could run. That meant that this thread could see<a name="line.497"></a>
-<span class="sourceLineNo">498</span>    // a Crashed Server before ServerCrashProcedure and it could find system regions on the<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    // crashed server and go move them before ServerCrashProcedure had a chance; could be<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    // dataloss too if WALs were not recovered.<a name="line.500"></a>
-<span class="sourceLineNo">501</span>    new Thread(() -&gt; {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      try {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>        synchronized (checkIfShouldMoveSystemRegionLock) {<a name="line.503"></a>
-<span class="sourceLineNo">504</span>          List&lt;RegionPlan&gt; plans = new ArrayList&lt;&gt;();<a name="line.504"></a>
-<span class="sourceLineNo">505</span>          // TODO: I don't think this code does a good job if all servers in cluster have same<a name="line.505"></a>
-<span class="sourceLineNo">506</span>          // version. It looks like it will schedule unnecessary moves.<a name="line.506"></a>
-<span class="sourceLineNo">507</span>          for (ServerName server : getExcludedServersForSystemTable()) {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>            if (master.getServerManager().isServerDead(server)) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>              // TODO: See HBASE-18494 and HBASE-18495. Though getExcludedServersForSystemTable()<a name="line.509"></a>
-<span class="sourceLineNo">510</span>              // considers only online servers, the server could be queued for dead server<a name="line.510"></a>
-<span class="sourceLineNo">511</span>              // processing. As region assignments for crashed server is handled by<a name="line.511"></a>
-<span class="sourceLineNo">512</span>              // ServerCrashProcedure, do NOT handle them here. The goal is to handle this through<a name="line.512"></a>
-<span class="sourceLineNo">513</span>              // regular flow of LoadBalancer as a favored node and not to have this special<a name="line.513"></a>
-<span class="sourceLineNo">514</span>              // handling.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>              continue;<a name="line.515"></a>
-<span class="sourceLineNo">516</span>            }<a name="line.516"></a>
-<span class="sourceLineNo">517</span>            List&lt;RegionInfo&gt; regionsShouldMove = getSystemTables(server);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>            if (!regionsShouldMove.isEmpty()) {<a name="line.518"></a>
-<span class="sourceLineNo">519</span>              for (RegionInfo regionInfo : regionsShouldMove) {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>                // null value for dest forces destination server to be selected by balancer<a name="line.520"></a>
-<span class="sourceLineNo">521</span>                RegionPlan plan = new RegionPlan(regionInfo, server, null);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>                if (regionInfo.isMetaRegion()) {<a name="line.522"></a>
-<span class="sourceLineNo">523</span>                  // Must move meta region first.<a name="line.523"></a>
-<span class="sourceLineNo">524</span>                  LOG.info("Async MOVE of {} to newer Server={}",<a name="line.524"></a>
-<span class="sourceLineNo">525</span>                      regionInfo.getEncodedName(), server);<a name="line.525"></a>
-<span class="sourceLineNo">526</span>                  moveAsync(plan);<a name="line.526"></a>
-<span class="sourceLineNo">527</span>                } else {<a name="line.527"></a>
-<span class="sourceLineNo">528</span>                  plans.add(plan);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>                }<a name="line.529"></a>
-<span class="sourceLineNo">530</span>              }<a name="line.530"></a>
-<span class="sourceLineNo">531</span>            }<a name="line.531"></a>
-<span class="sourceLineNo">532</span>            for (RegionPlan plan : plans) {<a name="line.532"></a>
-<span class="sourceLineNo">533</span>              LOG.info("Async MOVE of {} to newer Server={}",<a name="line.533"></a>
-<span class="sourceLineNo">534</span>                  plan.getRegionInfo().getEncodedName(), server);<a name="line.534"></a>
-<span class="sourceLineNo">535</span>              moveAsync(plan);<a name="line.535"></a>
-<span class="sourceLineNo">536</span>            }<a name="line.536"></a>
-<span class="sourceLineNo">537</span>          }<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        }<a name="line.538"></a>
-<span class="sourceLineNo">539</span>      } catch (Throwable t) {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        LOG.error(t.toString(), t);<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      }<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    }).start();<a name="line.542"></a>
-<span class="sourceLineNo">543</span>  }<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>  private List&lt;RegionInfo&gt; getSystemTables(ServerName serverName) {<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    ServerStateNode serverNode = regionStates.getServerNode(serverName);<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    if (serverNode == null) {<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      return Collections.emptyList();<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    }<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    return serverNode.getSystemRegionInfoList();<a name="line.550"></a>
-<span class="sourceLineNo">551</span>  }<a name="line.551"></a>
-<span class="sourceLineNo">552</span><a name="line.552"></a>
-<span class="sourceLineNo">553</span>  private void preTransitCheck(RegionStateNode regionNode, RegionState.State[] expectedStates)<a name="line.553"></a>
-<span class="sourceLineNo">554</span>      throws HBaseIOException {<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    if (regionNode.getProcedure() != null) {<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      throw new HBaseIOException(regionNode + " is currently in transition");<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    if (!regionNode.isInState(expectedStates)) {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      throw new DoNotRetryRegionException("Unexpected state for " + regionNode);<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    }<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    if (getTableStateManager().isTableState(regionNode.getTable(), TableState.State.DISABLING,<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      TableState.State.DISABLED)) {<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      throw new DoNotRetryIOException(regionNode.getTable() + " is disabled for " + regionNode);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    }<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  }<a name="line.565"></a>
-<span class="sourceLineNo">566</span><a name="line.566"></a>
-<span class="sourceLineNo">567</span>  // TODO: Need an async version of this for hbck2.<a name="line.567"></a>
-<span class="sourceLineNo">568</span>  public long assign(RegionInfo regionInfo, ServerName sn) throws IOException {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    // TODO: should we use getRegionStateNode?<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    RegionStateNode regionNode = regionStates.getOrCreateRegionStateNode(regionInfo);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    TransitRegionStateProcedure proc;<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    regionNode.lock();<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    try {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      preTransitCheck(regionNode, STATES_EXPECTED_ON_ASSIGN);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      proc = TransitRegionStateProcedure.assign(getProcedureEnvironment(), regionInfo, sn);<a name="line.575"></a>
-<span class="sourceLineNo">576</span>      regionNode.setProcedure(proc);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>    } finally {<a name="line.577"></a>
-<span class="sourceLineNo">578</span>      regionNode.unlock();<a name="line.578"></a>
-<span class="sourceLineNo">579</span>    }<a name="line.579"></a>
-<span class="sourceLineNo">580</span>    ProcedureSyncWait.submitAndWaitProcedure(master.getMasterProcedureExecutor(), proc);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>    return proc.getProcId();<a name="line.581"></a>
-<span class="sourceLineNo">582</span>  }<a name="line.582"></a>
-<span class="sourceLineNo">583</span><a name="line.583"></a>
-<span class="sourceLineNo">584</span>  public long assign(RegionInfo regionInfo) throws IOException {<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    return assign(regionInfo, null);<a name="line.585"></a>
-<span class="sourceLineNo">586</span>  }<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>  public long unassign(RegionInfo regionInfo) throws IOException {<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    RegionStateNode regionNode = regionStates.getRegionStateNode(regionInfo);<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    if (regionNode == null) {<a name="line.590"></a>
-<span class="sourceLineNo">591</span>      throw new UnknownRegionException("No RegionState found for " + regionInfo.getEncodedName());<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    }<a name="line.592"></a>
-<span class="sourceLineNo">593</span>    TransitRegionStateProcedure proc;<a name="line.593"></a>
-<span class="sourceLineNo">594</span>    regionNode.lock();<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    try {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>      preTransitCheck(regionNode, STATES_EXPECTED_ON_UNASSIGN_OR_MOVE);<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      proc = TransitRegionStateProcedure.unassign(getProcedureEnvironment(), regionInfo);<a name="line.597"></a>
-<span class="sourceLineNo">598</span>      regionNode.setProcedure(proc);<a name="line.598"></a>
-<span class="sourceLineNo">599</span>    } finally {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      regionNode.unlock();<a name="line.600"></a>
-<span class="sourceLineNo">601</span>    }<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    ProcedureSyncWait.submitAndWaitProcedure(master.getMasterProcedureExecutor(), proc);<a name="line.602"></a>
-<span class="sourceLineNo">603</span>    return proc.getProcId();<a name="line.603"></a>
-<span class="sourceLineNo">604</span>  }<a name="line.604"></a>
-<span class="sourceLineNo">605</span><a name="line.605"></a>
-<span class="sourceLineNo">606</span>  public TransitRegionStateProcedure createMoveRegionProcedure(RegionInfo regionInfo,<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      ServerName targetServer) throws HBaseIOException {<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    RegionStateNode regionNode = this.regionStates.getRegionStateNode(regionInfo);<a name="line.608"></a>
-<span class="sourceLineNo">609</span>    if (regionNode == null) {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>      throw new UnknownRegionException("No RegionState found for " + regionInfo.getEncodedName());<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    TransitRegionStateProcedure proc;<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    regionNode.lock();<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    try {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>      preTransitCheck(regionNode, STATES_EXPECTED_ON_UNASSIGN_OR_MOVE);<a name="line.615"></a>
-<span class="sourceLineNo">616</span>      regionNode.checkOnline();<a name="line.616"></a>
-<span class="sourceLineNo">617</span>      proc = TransitRegionStateProcedure.move(getProcedureEnvironment(), regionInfo, targetServer);<a name="line.617"></a>
-<span class="sourceLineNo">618</span>      regionNode.setProcedure(proc);<a name="line.618"></a>
-<span class="sourceLineNo">619</span>    } finally {<a name="line.619"></a>
-<span class="sourceLineNo">620</span>      regionNode.unlock();<a name="line.620"></a>
-<span class="sourceLineNo">621</span>    }<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    return proc;<a name="line.622"></a>
-<span class="sourceLineNo">623</span>  }<a name="line.623"></a>
-<span class="sourceLineNo">624</span><a name="line.624"></a>
-<span class="sourceLineNo">625</span>  public void move(RegionInfo regionInfo) throws IOException {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    TransitRegionStateProcedure proc = createMoveRegionProcedure(regionInfo, null);<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    ProcedureSyncWait.submitAndWaitProcedure(master.getMasterProcedureExecutor(), proc);<a name="line.627"></a>
-<span class="sourceLineNo">628</span>  }<a name="line.628"></a>
-<span class="sourceLineNo">629</span><a name="line.629"></a>
-<span class="sourceLineNo">630</span>  public Future&lt;byte[]&gt; moveAsync(RegionPlan regionPlan) throws HBaseIOException {<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    TransitRegionStateProcedure proc =<a name="line.631"></a>
-<span class="sourceLineNo">632</span>      createMoveRegionProcedure(regionPlan.getRegionInfo(), regionPlan.getDestination());<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    return ProcedureSyncWait.submitProcedure(master.getMasterProcedureExecutor(), proc);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>  }<a name="line.634"></a>
-<span class="sourceLineNo">635</span><a name="line.635"></a>
-<span class="sourceLineNo">636</span>  // ============================================================================================<a name="line.636"></a>
-<span class="sourceLineNo">637</span>  //  RegionTransition procedures helpers<a name="line.637"></a>
-<span class="sourceLineNo">638</span>  // ============================================================================================<a name="line.638"></a>
-<span class="sourceLineNo">639</span><a name="line.639"></a>
-<span class="sourceLineNo">640</span>  /**<a name="line.640"></a>
-<span class="sourceLineNo">641</span>   * Create round-robin assigns. Use on table creation to distribute out regions across cluster.<a name="line.641"></a>
-<span class="sourceLineNo">642</span>   * @return AssignProcedures made out of the passed in &lt;code&gt;hris&lt;/code&gt; and a call to the balancer<a name="line.642"></a>
-<span class="sourceLineNo">643</span>   *         to populate the assigns with targets chosen using round-robin (default balancer<a name="line.643"></a>
-<span class="sourceLineNo">644</span>   *         scheme). If at assign-time, the target chosen is no longer up, thats fine, the<a name="line.644"></a>
-<span class="sourceLineNo">645</span>   *         AssignProcedure will ask the balancer for a new target, and so on.<a name="line.645"></a>
-<span class="sourceLineNo">646</span>   */<a name="line.646"></a>
-<span class="sourceLineNo">647</span>  public TransitRegionStateProcedure[] createRoundRobinAssignProcedures(List&lt;RegionInfo&gt; hris,<a name="line.647"></a>
-<span class="sourceLineNo">648</span>      List&lt;ServerName&gt; serversToExclude) {<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    if (hris.isEmpty()) {<a name="line.649"></a>
-<span class="sourceLineNo">650</span>      return new TransitRegionStateProcedure[0];<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    }<a name="line.651"></a>
-<span class="sourceLineNo">652</span><a name="line.652"></a>
-<span class="sourceLineNo">653</span>    if (serversToExclude != null<a name="line.653"></a>
-<span class="sourceLineNo">654</span>        &amp;&amp; this.master.getServerManager().getOnlineServersList().size() == 1) {<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      LOG.debug("Only one region server found and hence going ahead with the assignment");<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      serversToExclude = null;<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    }<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    try {<a name="line.658"></a>
-<span class="sourceLineNo">659</span>      // Ask the balancer to assign our regions. Pass the regions en masse. The balancer can do<a name="line.659"></a>
-<span class="sourceLineNo">660</span>      // a better job if it has all the assignments in the one lump.<a name="line.660"></a>
-<span class="sourceLineNo">661</span>      Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = getBalancer().roundRobinAssignment(hris,<a name="line.661"></a>
-<span class="sourceLineNo">662</span>        this.master.getServerManager().createDestinationServersList(serversToExclude));<a name="line.662"></a>
-<span class="sourceLineNo">663</span>      // Return mid-method!<a name="line.663"></a>
-<span class="sourceLineNo">664</span>      return createAssignProcedures(assignments);<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    } catch (HBaseIOException hioe) {<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      LOG.warn("Failed roundRobinAssignment", hioe);<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    }<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    // If an error above, fall-through to this simpler assign. Last resort.<a name="line.668"></a>
-<span class="sourceLineNo">669</span>    return createAssignProcedures(hris);<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  }<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>  /**<a name="line.672"></a>
-<span class="sourceLineNo">673</span>   * Create round-robin assigns. Use on table creation to distribute out regions across cluster.<a name="line.673"></a>
-<span class="sourceLineNo">674</span>   * @return AssignProcedures made out of the passed in &lt;code&gt;hris&lt;/code&gt; and a call to the balancer<a name="line.674"></a>
-<span class="sourceLineNo">675</span>   *         to populate the assigns with targets chosen using round-robin (default balancer<a name="line.675"></a>
-<span class="sourceLineNo">676</span>   *         scheme). If at assign-time, the target chosen is no longer up, thats fine, the<a name="line.676"></a>
-<span class="sourceLineNo">677</span>   *         AssignProcedure will ask the balancer for a new target, and so on.<a name="line.677"></a>
-<span class="sourceLineNo">678</span>   */<a name="line.678"></a>
-<span class="sourceLineNo">679</span>  public TransitRegionStateProcedure[] createRoundRobinAssignProcedures(List&lt;RegionInfo&gt; hris) {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>    return createRoundRobinAssignProcedures(hris, null);<a name="line.680"></a>
-<span class="sourceLineNo">681</span>  }<a name="line.681"></a>
-<span class="sourceLineNo">682</span><a name="line.682"></a>
-<span class="sourceLineNo">683</span>  @VisibleForTesting<a name="line.683"></a>
-<span class="sourceLineNo">684</span>  static int compare(TransitRegionStateProcedure left, TransitRegionStateProcedure right) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>    if (left.getRegion().isMetaRegion()) {<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      if (right.getRegion().isMetaRegion()) {<a name="line.686"></a>
-<span class="sourceLineNo">687</span>        return RegionInfo.COMPARATOR.compare(left.getRegion(), right.getRegion());<a name="line.687"></a>
-<span class="sourceLineNo">688</span>      }<a name="line.688"></a>
-<span class="sourceLineNo">689</span>      return -1;<a name="line.689"></a>
-<span class="sourceLineNo">690</span>    } else if (right.getRegion().isMetaRegion()) {<a name="line.690"></a>
-<span class="sourceLineNo">691</span>      return +1;<a name="line.691"></a>
-<span class="sourceLineNo">692</span>    }<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    if (left.getRegion().getTable().isSystemTable()) {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>      if (right.getRegion().getTable().isSystemTable()) {<a name="line.694"></a>
-<span class="sourceLineNo">695</span>        return RegionInfo.COMPARATOR.compare(left.getRegion(), right.getRegion());<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      }<a name="line.696"></a>
-<span class="sourceLineNo">697</span>      return -1;<a name="line.697"></a>
-<span class="sourceLineNo">698</span>    } else if (right.getRegion().getTable().isSystemTable()) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      return +1;<a name="line.699"></a>
-<span class="sourceLineNo">700</span>    }<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    return RegionInfo.COMPARATOR.compare(left.getRegion(), right.getRegion());<a name="line.701"></a>
-<span class="sourceLineNo">702</span>  }<a name="line.702"></a>
-<span class="sourceLineNo">703</span><a name="line.703"></a>
-<span class="sourceLineNo">704</span>  private TransitRegionStateProcedure createAssignProcedure(RegionStateNode regionNode,<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      ServerName targetServer, boolean override) {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>    TransitRegionStateProcedure proc;<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    regionNode.lock();<a name="line.707"></a>
-<span class="sourceLineNo">708</span>    try {<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      if(override &amp;&amp; regionNode.getProcedure() != null) {<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        regionNode.unsetProcedure(regionNode.getProcedure());<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      }<a name="line.711"></a>
-<span class="sourceLineNo">712</span>      assert regionNode.getProcedure() == null;<a name="line.712"></a>
-<span class="sourceLineNo">713</span>      proc = TransitRegionStateProcedure.assign(getProcedureEnvironment(),<a name="line.713"></a>
-<span class="sourceLineNo">714</span>        regionNode.getRegionInfo(), targetServer);<a name="line.714"></a>
-<span class="sourceLineNo">715</span>      regionNode.setProcedure(proc);<a name="line.715"></a>
-<span class="sourceLineNo">716</span>    } finally {<a name="line.716"></a>
-<span class="sourceLineNo">717</span>      regionNode.unlock();<a name="line.717"></a>
-<span class="sourceLineNo">718</span>    }<a name="line.718"></a>
-<span class="sourceLineNo">719</span>    return proc;<a name="line.719"></a>
-<span class="sourceLineNo">720</span>  }<a name="line.720"></a>
-<span class="sourceLineNo">721</span><a name="line.721"></a>
-<span class="sourceLineNo">722</span>  private TransitRegionStateProcedure createUnassignProcedure(RegionStateNode regionNode,<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      boolean override) {<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    TransitRegionStateProcedure proc;<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    regionNode.lock();<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    try {<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      if(override &amp;&amp; regionNode.getProcedure() != null) {<a name="line.727"></a>
-<span class="sourceLineNo">728</span>        regionNode.unsetProcedure(regionNode.getProcedure());<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      }<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      assert regionNode.getProcedure() == null;<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      proc = TransitRegionStateProcedure.unassign(getProcedureEnvironment(),<a name="line.731"></a>
-<span class="sourceLineNo">732</span>          regionNode.getRegionInfo());<a name="line.732"></a>
-<span class="sourceLineNo">733</span>      regionNode.setProcedure(proc);<a name="line.733"></a>
-<span class="sourceLineNo">734</span>    } finally {<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      regionNode.unlock();<a name="line.735"></a>
-<span class="sourceLineNo">736</span>    }<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    return proc;<a name="line.737"></a>
-<span class="sourceLineNo">738</span>  }<a name="line.738"></a>
-<span class="sourceLineNo">739</span><a name="line.739"></a>
-<span class="sourceLineNo">740</span>  /**<a name="line.740"></a>
-<span class="sourceLineNo">741</span>   * Create one TransitRegionStateProcedure to assign a region w/o specifying a target server.<a name="line.741"></a>
-<span class="sourceLineNo">742</span>   * This method is specified for HBCK2<a name="line.742"></a>
-<span class="sourceLineNo">743</span>   */<a name="line.743"></a>
-<span class="sourceLineNo">744</span>  public TransitRegionStateProcedure createOneAssignProcedure(RegionInfo hri, boolean override) {<a name="line.744"></a>
-<span class="sourceLineNo">745</span>    RegionStateNode regionNode = regionStates.getOrCreateRegionStateNode(hri);<a name="line.745"></a>
-<span class="sourceLineNo">746</span>    return createAssignProcedure(regionNode, null, override);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>  }<a name="line.747"></a>
-<span class="sourceLineNo">748</span><a name="line.748"></a>
-<span class="sourceLineNo">749</span>  /**<a name="line.749"></a>
-<span class="sourceLineNo">750</span>   * Create one TransitRegionStateProcedure to unassign a region.<a name="line.750"></a>
-<span class="sourceLineNo">751</span>   * This method is specified for HBCK2<a name="line.751"></a>
-<span class="sourceLineNo">752</span>   */<a name="line.752"></a>
-<span class="sourceLineNo">753</span>  public TransitRegionStateProcedure createOneUnassignProcedure(RegionInfo hri, boolean override) {<a name="line.753"></a>
-<span class="sourceLineNo">754</span>    RegionStateNode regionNode = regionStates.getOrCreateRegionStateNode(hri);<a name="line.754"></a>
-<span class="sourceLineNo">755</span>    return createUnassignProcedure(regionNode, override);<a name="line.755"></a>
-<span class="sourceLineNo">756</span>  }<a name="line.756"></a>
-<span class="sourceLineNo">757</span><a name="line.757"></a>
-<span class="sourceLineNo">758</span>  /**<a name="line.758"></a>
-<span class="sourceLineNo">759</span>   * Create an array of TransitRegionStateProcedure w/o specifying a target server.<a name="line.759"></a>
-<span class="sourceLineNo">760</span>   * &lt;p/&gt;<a name="line.760"></a>
-<span class="sourceLineNo">761</span>   * If no target server, at assign time, we will try to use the former location of the region if<a name="line.761"></a>
-<span class="sourceLineNo">762</span>   * one exists. This is how we 'retain' the old location across a server restart.<a name="line.762"></a>
-<span class="sourceLineNo">763</span>   * &lt;p/&gt;<a name="line.763"></a>
-<span class="sourceLineNo">764</span>   * Should only be called when you can make sure that no one can touch these regions other than<a name="line.764"></a>
-<span class="sourceLineNo">765</span>   * you. For example, when you are creating table.<a name="line.765"></a>
-<span class="sourceLineNo">766</span>   */<a name="line.766"></a>
-<span class="sourceLineNo">767</span>  public TransitRegionStateProcedure[] createAssignProcedures(List&lt;RegionInfo&gt; hris) {<a name="line.767"></a>
-<span class="sourceLineNo">768</span>    return hris.stream().map(hri -&gt; regionStates.getOrCreateRegionStateNode(hri))<a name="line.768"></a>
-<span class="sourceLineNo">769</span>        .map(regionNode -&gt; createAssignProcedure(regionNode, null, false))<a name="line.769"></a>
-<span class="sourceLineNo">770</span>        .sorted(AssignmentManager::compare).toArray(TransitRegionStateProcedure[]::new);<a name="line.770"></a>
-<span class="sourceLineNo">771</span>  }<a name="line.771"></a>
-<span class="sourceLineNo">772</span><a name="line.772"></a>
-<span class="sourceLineNo">773</span>  /**<a name="line.773"></a>
-<span class="sourceLineNo">774</span>   * @param assignments Map of assignments from which we produce an array of AssignProcedures.<a name="line.774"></a>
-<span class="sourceLineNo">775</span>   * @return Assignments made from the passed in &lt;code&gt;assignments&lt;/code&gt;<a name="line.775"></a>
-<span class="sourceLineNo">776</span>   */<a name="line.776"></a>
-<span class="sourceLineNo">777</span>  private TransitRegionStateProcedure[] createAssignProcedures(<a name="line.777"></a>
-<span class="sourceLineNo">778</span>      Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments) {<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    return assignments.entrySet().stream()<a name="line.779"></a>
-<span class="sourceLineNo">780</span>      .flatMap(e -&gt; e.getValue().stream().map(hri -&gt; regionStates.getOrCreateRegionStateNode(hri))<a name="line.780"></a>
-<span class="sourceLineNo">781</span>        .map(regionNode -&gt; createAssignProcedure(regionNode, e.getKey(), false)))<a name="line.781"></a>
-<span class="sourceLineNo">782</span>      .sorted(AssignmentManager::compare).toArray(TransitRegionStateProcedure[]::new);<a name="line.782"></a>
-<span class="sourceLineNo">783</span>  }<a name="line.783"></a>
-<span class="sourceLineNo">784</span><a name="line.784"></a>
-<span class="sourceLineNo">785</span>  /**<a name="line.785"></a>
-<span class="sourceLineNo">786</span>   * Called by DisableTableProcedure to unassign all the regions for a table.<a name="line.786"></a>
-<span class="sourceLineNo">787</span>   */<a name="line.787"></a>
-<span class="sourceLineNo">788</span>  public TransitRegionStateProcedure[] createUnassignProceduresForDisabling(TableName tableName) {<a name="line.788"></a>
-<span class="sourceLineNo">789</span>    return regionStates.getTableRegionStateNodes(tableName).stream().map(regionNode -&gt; {<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      regionNode.lock();<a name="line.790"></a>
-<span class="sourceLineNo">791</span>      try {<a name="line.791"></a>
-<span class="sourceLineNo">792</span>        if (!regionStates.include(regionNode, false) ||<a name="line.792"></a>
-<span class="sourceLineNo">793</span>          regionStates.isRegionOffline(regionNode.getRegionInfo())) {<a name="line.793"></a>
-<span class="sourceLineNo">794</span>          return null;<a name="line.794"></a>
-<span class="sourceLineNo">795</span>        }<a name="line.795"></a>
-<span class="sourceLineNo">796</span>        // As in DisableTableProcedure, we will hold the xlock for table, so we can make sure that<a name="line.796"></a>
-<span class="sourceLineNo">797</span>        // this procedure has not been executed yet, as TRSP will hold the shared lock for table all<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        // the time. So here we will unset it and when it is actually executed, it will find that<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        // the attach procedure is not itself and quit immediately.<a name="line.799"></a>
-<span class="sourceLineNo">800</span>        if (regionNode.getProcedure() != null) {<a name="line.800"></a>
-<span class="sourceLineNo">801</span>          regionNode.unsetProcedure(regionNode.getProcedure());<a name="line.801"></a>
-<span class="sourceLineNo">802</span>        }<a name="line.802"></a>
-<span class="sourceLineNo">803</span>        TransitRegionStateProcedure proc = TransitRegionStateProcedure<a name="line.803"></a>
-<span class="sourceLineNo">804</span>          .unassign(getProcedureEnvironment(), regionNode.getRegionInfo());<a name="line.804"></a>
-<span class="sourceLineNo">805</span>        regionNode.setProcedure(proc);<a name="line.805"></a>
-<span class="sourceLineNo">806</span>        return proc;<a name="line.806"></a>
-<span class="sourceLineNo">807</span>      } finally {<a name="line.807"></a>
-<span class="sourceLineNo">808</span>        regionNode.unlock();<a name="line.808"></a>
-<span class="sourceLineNo">809</span>      }<a name="line.809"></a>
-<span class="sourceLineNo">810</span>    }).filter(p -&gt; p != null).toArray(TransitRegionStateProcedure[]::new);<a name="line.810"></a>
-<span class="sourceLineNo">811</span>  }<a name="line.811"></a>
-<span class="sourceLineNo">812</span><a name="line.812"></a>
-<span class="sourceLineNo">813</span>  public SplitTableRegionProcedure createSplitProcedure(final RegionInfo regionToSplit,<a name="line.813"></a>
-<span class="sourceLineNo">814</span>      final byte[] splitKey) throws IOException {<a name="line.814"></a>
-<span class="sourceLineNo">815</span>    return new SplitTableRegionProcedure(getProcedureEnvironment(), regionToSplit, splitKey);<a name="line.815"></a>
-<span class="sourceLineNo">816</span>  }<a name="line.816"></a>
-<span class="sourceLineNo">817</span><a name="line.817"></a>
-<span class="sourceLineNo">818</span>  public MergeTableRegionsProcedure createMergeProcedure(final RegionInfo regionToMergeA,<a name="line.818"></a>
-<span class="sourceLineNo">819</span>      final RegionInfo regionToMergeB) throws IOException {<a name="line.819"></a>
-<span class="sourceLineNo">820</span>    return new MergeTableRegionsProcedure(getProcedureEnvironment(), regionToMergeA,regionToMergeB);<a name="line.820"></a>
-<span class="sourceLineNo">821</span>  }<a name="line.821"></a>
-<span class="sourceLineNo">822</span><a name="line.822"></a>
-<span class="sourceLineNo">823</span>  /**<a name="line.823"></a>
-<span class="sourceLineNo">824</span>   * Delete the region states. This is called by "DeleteTable"<a name="line.824"></a>
-<span class="sourceLineNo">825</span>   */<a name="line.825"></a>
-<span class="sourceLineNo">826</span>  public void deleteTable(final TableName tableName) throws IOException {<a name="line.826"></a>
-<span class="sourceLineNo">827</span>    final ArrayList&lt;RegionInfo&gt; regions = regionStates.getTableRegionsInfo(tableName);<a name="line.827"></a>
-<span class="sourceLineNo">828</span>    regionStateStore.deleteRegions(regions);<a name="line.828"></a>
-<span class="sourceLineNo">829</span>    for (int i = 0; i &lt; regions.size(); ++i) {<a name="line.829"></a>
-<span class="sourceLineNo">830</span>      final RegionInfo regionInfo = regions.get(i);<a name="line.830"></a>
-<span class="sourceLineNo">831</span>      // we expect the region to be offline<a name="line.831"></a>
-<span class="sourceLineNo">832</span>      regionStates.removeFromOfflineRegions(regionInfo);<a name="line.832"></a>
-<span class="sourceLineNo">833</span>      regionStates.deleteRegion(regionInfo);<a name="line.833"></a>
-<span class="sourceLineNo">834</span>    }<a name="line.834"></a>
-<span class="sourceLineNo">835</span>  }<a name="line.835"></a>
-<span class="sourceLineNo">836</span><a name="line.836"></a>
-<span class="sourceLineNo">837</span>  // ============================================================================================<a name="line.837"></a>
-<span class="sourceLineNo">838</span>  //  RS Region Transition Report helpers<a name="line.838"></a>
-<span class="sourceLineNo">839</span>  // ============================================================================================<a name="line.839"></a>
-<span class="sourceLineNo">840</span>  private void reportRegionStateTransition(ReportRegionStateTransitionResponse.Builder builder,<a name="line.840"></a>
-<span class="sourceLineNo">841</span>      ServerName serverName, List&lt;RegionStateTransition&gt; transitionList) throws IOException {<a name="line.841"></a>
-<span class="sourceLineNo">842</span>    for (RegionStateTransition transition : transitionList) {<a name="line.842"></a>
-<span class="sourceLineNo">843</span>      switch (transition.getTransitionCode()) {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>        case OPENED:<a name="line.844"></a>
-<span class="sourceLineNo">845</span>        case FAILED_OPEN:<a name="line.845"></a>
-<span class="sourceLineNo">846</span>        case CLOSED:<a name="line.846"></a>
-<span class="sourceLineNo">847</span>          assert transition.getRegionInfoCount() == 1 : transition;<a name="line.847"></a>
-<span class="sourceLineNo">848</span>          final RegionInfo hri = ProtobufUtil.toRegionInfo(transition.getRegionInfo(0));<a name="line.848"></a>
-<span class="sourceLineNo">849</span>          long procId =<a name="line.849"></a>
-<span class="sourceLineNo">850</span>            transition.getProcIdCount() &gt; 0 ? transition.getProcId(0) : Procedure.NO_PROC_ID;<a name="line.850"></a>
-<span class="sourceLineNo">851</span>          updateRegionTransition(serverName, transition.getTransitionCode(), hri,<a name="line.851"></a>
-<span class="sourceLineNo">852</span>            transition.hasOpenSeqNum() ? transition.getOpenSeqNum() : HConstants.NO_SEQNUM, procId);<a name="line.852"></a>
-<span class="sourceLineNo">853</span>          break;<a name="line.853"></a>
-<span class="sourceLineNo">854</span>        case READY_TO_SPLIT:<a name="line.854"></a>
-<span class="sourceLineNo">855</span>        case SPLIT:<a name="line.855"></a>
-<span class="sourceLineNo">856</span>        case SPLIT_REVERTED:<a name="line.856"></a>
-<span class="sourceLineNo">857</span>          assert transition.getRegionInfoCount() == 3 : transition;<a name="line.857"></a>
-<span class="sourceLineNo">858</span>          final RegionInfo parent = ProtobufUtil.toRegionInfo(transition.getRegionInfo(0));<a name="line.858"></a>
-<span class="sourceLineNo">859</span>          final RegionInfo splitA = ProtobufUtil.toRegionInfo(transition.getRegionInfo(1));<a name="line.859"></a>
-<span class="sourceLineNo">860</span>          final RegionInfo splitB = ProtobufUtil.toRegionInfo(transition.getRegionInfo(2));<a name="line.860"></a>
-<span class="sourceLineNo">861</span>          updateRegionSplitTransition(serverName, transition.getTransitionCode(), parent, splitA,<a name="line.861"></a>
-<span class="sourceLineNo">862</span>            splitB);<a name="line.862"></a>
-<span class="sourceLineNo">863</span>          break;<a name="line.863"></a>
-<span class="sourceLineNo">864</span>        case READY_TO_MERGE:<a name="line.864"></a>
-<span class="sourceLineNo">865</span>        case MERGED:<a name="line.865"></a>
-<span class="sourceLineNo">866</span>        case MERGE_REVERTED:<a name="line.866"></a>
-<span class="sourceLineNo">867</span>          assert transition.getRegionInfoCount() == 3 : transition;<a name="line.867"></a>
-<span class="sourceLineNo">868</span>          final RegionInfo merged = ProtobufUtil.toRegionInfo(transition.getRegionInfo(0));<a name="line.868"></a>
-<span class="sourceLineNo">869</span>          final RegionInfo mergeA = ProtobufUtil.toRegionInfo(transition.getRegionInfo(1));<a name="line.869"></a>
-<span class="sourceLineNo">870</span>          final RegionInfo mergeB = ProtobufUtil.toRegionInfo(transition.getRegionInfo(2));<a name="line.870"></a>
-<span class="sourceLineNo">871</span>          updateRegionMergeTransition(serverName, transition.getTransitionCode(), merged, mergeA,<a name="line.871"></a>
-<span class="sourceLineNo">872</span>            mergeB);<a name="line.872"></a>
-<span class="sourceLineNo">873</span>          break;<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      }<a name="line.874"></a>
-<span class="sourceLineNo">875</span>    }<a name="line.875"></a>
-<span class="sourceLineNo">876</span>  }<a name="line.876"></a>
-<span class="sourceLineNo">877</span><a name="line.877"></a>
-<span class="sourceLineNo">878</span>  public ReportRegionStateTransitionResponse reportRegionStateTransition(<a name="line.878"></a>
-<span class="sourceLineNo">879</span>      final ReportRegionStateTransitionRequest req) throws PleaseHoldException {<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    ReportRegionStateTransitionResponse.Builder builder =<a name="line.880"></a>
-<span class="sourceLineNo">881</span>        ReportRegionStateTransitionResponse.newBuilder();<a name="line.881"></a>
-<span class="sourceLineNo">882</span>    ServerName serverName = ProtobufUtil.toServerName(req.getServer());<a name="line.882"></a>
-<span class="sourceLineNo">883</span>    ServerStateNode serverNode = regionStates.getOrCreateServer(serverName);<a name="line.883"></a>
-<span class="sourceLineNo">884</span>    // here we have to acquire a read lock instead of a simple exclusive lock. This is because that<a name="line.884"></a>
-<span class="sourceLineNo">885</span>    // we should not block other reportRegionStateTransition call from the same region server. This<a name="line.885"></a>
-<span class="sourceLineNo">886</span>    // is not only about performance, but also to prevent dead lock. Think of the meta region is<a name="line.886"></a>
-<span class="sourceLineNo">887</span>    // also on the same region server and you hold the lock which blocks the<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    // reportRegionStateTransition for meta, and since meta is not online, you will block inside the<a name="line.888"></a>
-<span class="sourceLineNo">889</span>    // lock protection to wait for meta online...<a name="line.889"></a>
-<span class="sourceLineNo">890</span>    serverNode.readLock().lock();<a name="line.890"></a>
-<span class="sourceLineNo">891</span>    try {<a name="line.891"></a>
-<span class="sourceLineNo">892</span>      // we only accept reportRegionStateTransition if the region server is online, see the comment<a name="line.892"></a>
-<span class="sourceLineNo">893</span>      // above in submitServerCrash method and HBASE-21508 for more details.<a name="line.893"></a>
-<span class="sourceLineNo">894</span>      if (serverNode.isInState(ServerState.ONLINE)) {<a name="line.894"></a>
-<span class="sourceLineNo">895</span>        try {<a name="line.895"></a>
-<span class="sourceLineNo">896</span>          reportRegionStateTransition(builder, serverName, req.getTransitionList());<a name="line.896"></a>
-<span class="sourceLineNo">897</span>        } catch (PleaseHoldException e) {<a name="line.897"></a>
-<span class="sourceLineNo">898</span>          LOG.trace("Failed transition ", e);<a name="line.898"></a>
-<span class="sourceLineNo">899</span>          throw e;<a name="line.899"></a>
-<span class="sourceLineNo">900</span>        } catch (UnsupportedOperationException | IOException e) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>          // TODO: at the moment we have a single error message and the RS will abort<a name="line.901"></a>
-<span class="sourceLineNo">902</span>          // if the master says that one of the region transitions failed.<a name="line.902"></a>
-<span class="sourceLineNo">903</span>          LOG.warn("Failed transition", e);<a name="line.903"></a>
-<span class="sourceLineNo">904</span>          builder.setErrorMessage("Failed transition " + e.getMessage());<a name="line.904"></a>
-<span class="sourceLineNo">905</span>        }<a name="line.905"></a>
-<span class="sourceLineNo">906</span>      } else {<a name="line.906"></a>
-<span class="sourceLineNo">907</span>        LOG.warn("The region server {} is already dead, skip reportRegionStateTransition call",<a name="line.907"></a>
-<span class="sourceLineNo">908</span>          serverName);<a name="line.908"></a>
-<span class="sourceLineNo">909</span>        builder.setErrorMessage("You are dead");<a name="line.909"></a>
-<span class="sourceLineNo">910</span>      }<a name="line.910"></a>
-<span class="sourceLineNo">911</span>    } finally {<a name="line.911"></a>
-<span class="sourceLineNo">912</span>      serverNode.readLock().unlock();<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    }<a name="line.913"></a>
-<span class="sourceLineNo">914</span><a name="line.914"></a>
-<span class="sourceLineNo">915</span>    return builder.build();<a name="line.915"></a>
-<span class="sourceLineNo">916</span>  }<a name="line.916"></a>
-<span class="sourceLineNo">917</span><a name="line.917"></a>
-<span class="sourceLineNo">918</span>  private void updateRegionTransition(ServerName serverName, TransitionCode state,<a name="line.918"></a>
-<span class="sourceLineNo">919</span>      RegionInfo regionInfo, long seqId, long procId) throws IOException {<a name="line.919"></a>
-<span class="sourceLineNo">920</span>    checkMetaLoaded(regionInfo);<a name="line.920"></a>
-<span class="sourceLineNo">921</span><a name="line.921"></a>
-<span class="sourceLineNo">922</span>    RegionStateNode regionNode = regionStates.getRegionStateNode(regionInfo);<a name="line.922"></a>
-<span class="sourceLineNo">923</span>    if (regionNode == null) {<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      // the table/region is gone. maybe a delete, split, merge<a name="line.924"></a>
-<span class="sourceLineNo">925</span>      throw new UnexpectedStateException(String.format(<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        "Server %s was trying to transition region %s to %s. but the region was removed.",<a name="line.926"></a>
-<span class="sourceLineNo">927</span>        serverName, regionInfo, state));<a name="line.927"></a>
-<span class="sourceLineNo">928</span>    }<a name="line.928"></a>
-<span class="sourceLineNo">929</span>    LOG.trace("Update region transition serverName={} region={} regionState={}", serverName,<a name="line.929"></a>
-<span class="sourceLineNo">930</span>      regionNode, state);<a name="line.930"></a>
-<span class="sourceLineNo">931</span><a name="line.931"></a>
-<span class="sourceLineNo">932</span>    ServerStateNode serverNode = regionStates.getOrCreateServer(serverName);<a name="line.932"></a>
-<span class="sourceLineNo">933</span>    regionNode.lock();<a name="line.933"></a>
-<span class="sourceLineNo">934</span>    try {<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      if (!reportTransition(regionNode, serverNode, state, seqId, procId)) {<a name="line.935"></a>
-<span class="sourceLineNo">936</span>        // Don't log WARN if shutting down cluster; during shutdown. Avoid the below messages:<a name="line.936"></a>
-<span class="sourceLineNo">937</span>        // 2018-08-13 10:45:10,551 WARN ...AssignmentManager: No matching procedure found for<a name="line.937"></a>
-<span class="sourceLineNo">938</span>        // rit=OPEN, location=ve0538.halxg.cloudera.com,16020,1533493000958,<a name="line.938"></a>
-<span class="sourceLineNo">939</span>        // table=IntegrationTestBigLinkedList, region=65ab289e2fc1530df65f6c3d7cde7aa5 transition<a name="line.939"></a>
-<span class="sourceLineNo">940</span>        // to CLOSED<a name="line.940"></a>
-<span class="sourceLineNo">941</span>        // These happen because on cluster shutdown, we currently let the RegionServers close<a name="line.941"></a>
-<span class="sourceLineNo">942</span>        // regions. This is the only time that region close is not run by the Master (so cluster<a name="line.942"></a>
-<span class="sourceLineNo">943</span>        // goes down fast). Consider changing it so Master runs all shutdowns.<a name="line.943"></a>
-<span class="sourceLineNo">944</span>        if (this.master.getServerManager().isClusterShutdown() &amp;&amp;<a name="line.944"></a>
-<span class="sourceLineNo">945</span>          state.equals(TransitionCode.CLOSED)) {<a name="line.945"></a>
-<span class="sourceLineNo">946</span>          LOG.info("RegionServer {} {}", state, regionNode.getRegionInfo().getEncodedName());<a name="line.946"></a>
-<span class="sourceLineNo">947</span>        } else {<a name="line.947"></a>
-<span class="sourceLineNo">948</span>          LOG.warn("No matching procedure found for {} transition to {}", regionNode, state);<a name="line.948"></a>
-<span class="sourceLineNo">949</span>        }<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      }<a name="line.950"></a>
-<span class="sourceLineNo">951</span>    } finally {<a name="line.951"></a>
-<span class="sourceLineNo">952</span>      regionNode.unlock();<a name="line.952"></a>
-<span class="sourceLineNo">953</span>    }<a name="line.953"></a>
-<span class="sourceLineNo">954</span>  }<a name="line.954"></a>
-<span class="sourceLineNo">955</span><a name="line.955"></a>
-<span class="sourceLineNo">956</span>  private boolean reportTransition(RegionStateNode regionNode, ServerStateNode serverNode,<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      TransitionCode state, long seqId, long procId) throws IOException {<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    ServerName serverName = serverNode.getServerName();<a name="line.958"></a>
-<span class="sourceLineNo">959</span>    TransitRegionStateProcedure proc = regionNode.getProcedure();<a name="line.959"></a>
-<span class="sourceLineNo">960</span>    if (proc == null) {<a name="line.960"></a>
-<span class="sourceLineNo">961</span>      return false;<a name="line.961"></a>
-<span class="sourceLineNo">962</span>    }<a name="line.962"></a>
-<span class="sourceLineNo">963</span>    proc.reportTransition(master.getMasterProcedureExecutor().getEnvironment(), regionNode,<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      serverName, state, seqId, procId);<a name="line.964"></a>
-<span class="sourceLineNo">965</span>    return true;<a name="line.965"></a>
-<span class="sourceLineNo">966</span>  }<a name="line.966"></a>
-<span class="sourceLineNo">967</span><a name="line.967"></a>
-<span class="sourceLineNo">968</span>  private void updateRegionSplitTransition(final ServerName serverName, final TransitionCode state,<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      final RegionInfo parent, final RegionInfo hriA, final RegionInfo hriB)<a name="line.969"></a>
-<span class="sourceLineNo">970</span>      throws IOException {<a name="line.970"></a>
-<span class="sourceLineNo">971</span>    checkMetaLoaded(parent);<a name="line.971"></a>
-<span class="sourceLineNo">972</span><a name="line.972"></a>
-<span class="sourceLineNo">973</span>    if (state != TransitionCode.READY_TO_SPLIT) {<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      throw new UnexpectedStateException("unsupported split regionState=" + state +<a name="line.974"></a>
-<span class="sourceLineNo">975</span>        " for parent region " + parent +<a name="line.975"></a>
-<span class="sourceLineNo">976</span>        " maybe an old RS (&lt; 2.0) had the operation in progress");<a name="line.976"></a>
-<span class="sourceLineNo">977</span>    }<a name="line.977"></a>
-<span class="sourceLineNo">978</span><a name="line.978"></a>
-<span class="sourceLineNo">979</span>    // sanity check on the request<a name="line.979"></a>
-<span class="sourceLineNo">980</span>    if (!Bytes.equals(hriA.getEndKey(), hriB.getStartKey())) {<a name="line.980"></a>
-<span class="sourceLineNo">981</span>      throw new UnsupportedOperationException(<a name="line.981"></a>
-<span class="sourceLineNo">982</span>        "unsupported split request with bad keys: parent=" + parent +<a name="line.982"></a>
-<span class="sourceLineNo">983</span>        " hriA=" + hriA + " hriB=" + hriB);<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    }<a name="line.984"></a>
-<span class="sourceLineNo">985</span><a name="line.985"></a>
-<span class="sourceLineNo">986</span>    // Submit the Split procedure<a name="line.986"></a>
-<span class="sourceLineNo">987</span>    final byte[] splitKey = hriB.getStartKey();<a name="line.987"></a>
-<span class="sourceLineNo">988</span>    if (LOG.isDebugEnabled()) {<a name="line.988"></a>
-<span class="sourceLineNo">989</span>      LOG.debug("Split request from " + serverName +<a name="line.989"></a>
-<span class="sourceLineNo">990</span>          ", parent=" + parent + " splitKey=" + Bytes.toStringBinary(splitKey));<a name="line.990"></a>
-<span class="sourceLineNo">991</span>    }<a name="line.991"></a>
-<span class="sourceLineNo">992</span>    master.getMasterProcedureExecutor().submitProcedure(createSplitProcedure(parent, splitKey));<a name="line.992"></a>
-<span class="sourceLineNo">993</span><a name="line.993"></a>
-<span class="sourceLineNo">994</span>    // If the RS is &lt; 2.0 throw an exception to abort the operation, we are handling the split<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    if (master.getServerManager().getVersionNumber(serverName) &lt; 0x0200000) {<a name="line.995"></a>
-<span class="sourceLineNo">996</span>      throw new UnsupportedOperationException(String.format(<a name="line.996"></a>
-<span class="sourceLineNo">997</span>        "Split handled by the master: parent=%s hriA=%s hriB=%s", parent.getShortNameToLog(), hriA, hriB));<a name="line.997"></a>
-<span class="sourceLineNo">998</span>    }<a name="line.998"></a>
-<span class="sourceLineNo">999</span>  }<a name="line.999"></a>
-<span class="sourceLineNo">1000</span><a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>  private void updateRegionMergeTransition(final ServerName serverName, final TransitionCode state,<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>      final RegionInfo merged, final RegionInfo hriA, final RegionInfo hriB) throws IOException {<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    checkMetaLoaded(merged);<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span><a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>    if (state != TransitionCode.READY_TO_MERGE) {<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      throw new UnexpectedStateException("Unsupported merge regionState=" + state +<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>        " for regionA=" + hriA + " regionB=" + hriB + " merged=" + merged +<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        " maybe an old RS (&lt; 2.0) had the operation in progress");<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>    }<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span><a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>    // Submit the Merge procedure<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>    if (LOG.isDebugEnabled()) {<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>      LOG.debug("Handling merge request from RS=" + merged + ", merged=" + merged);<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>    }<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>    master.getMasterProcedureExecutor().submitProcedure(createMergeProcedure(hriA, hriB));<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span><a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>    // If the RS is &lt; 2.0 throw an exception to abort the operation, we are handling the merge<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>    if (master.getServerManager().getVersionNumber(serverName) &lt; 0x0200000) {<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>      throw new UnsupportedOperationException(String.format(<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>        "Merge not handled yet: regionState=%s merged=%s hriA=%s hriB=%s", state, merged, hriA,<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>          hriB));<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>  }<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span><a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>  // ============================================================================================<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>  //  RS Status update (report online regions) helpers<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>  // ============================================================================================<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>  /**<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>   * The master will call this method when the RS send the regionServerReport(). The report will<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>   * contains the "online regions". This method will check the the online regions against the<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>   * in-memory state of the AM, and we will log a warn message if there is a mismatch. This is<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>   * because that there is no fencing between the reportRegionStateTransition method and<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>   * regionServerReport method, so there could be race and introduce inconsistency here, but<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>   * actually there is no problem.<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>   * &lt;p/&gt;<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>   * Please see HBASE-21421 and HBASE-21463 for more details.<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>   */<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>  public void reportOnlineRegions(ServerName serverName, Set&lt;byte[]&gt; regionNames) {<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>    if (!isRunning()) {<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>      return;<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>    }<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>    if (LOG.isTraceEnabled()) {<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>      LOG.trace("ReportOnlineRegions {} regionCount={}, metaLoaded={} {}", serverName,<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>        regionNames.size(), isMetaLoaded(),<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>        regionNames.stream().map(Bytes::toStringBinary).collect(Collectors.toList()));<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>    }<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span><a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>    ServerStateNode serverNode = regionStates.getOrCreateServer(serverName);<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span><a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    synchronized (serverNode) {<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>      if (!serverNode.isInState(ServerState.ONLINE)) {<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>        LOG.warn("Got a report from a server result in state " + serverNode.getState());<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>        return;<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>      }<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>    }<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    if (regionNames.isEmpty()) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      // nothing to do if we don't have regions<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      LOG.trace("no online region found on {}", serverName);<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      return;<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>    }<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>    if (!isMetaLoaded()) {<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>      // we are still on startup, skip checking<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>      return;<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    }<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>    // The Heartbeat tells us of what regions are on the region serve, check the state.<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>    checkOnlineRegionsReport(serverNode, regionNames);<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>  }<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span><a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>  // just check and output possible inconsistency, without actually doing anything<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>  private void checkOnlineRegionsReport(ServerStateNode serverNode, Set&lt;byte[]&gt; regionNames) {<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    ServerName serverName = serverNode.getServerName();<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>    for (byte[] regionName : regionNames) {<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      if (!isRunning()) {<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        return;<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>      RegionStateNode regionNode = regionStates.getRegionStateNodeFromName(regionName);<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>      if (regionNode == null) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>        LOG.warn("No region state node for {}, it should already be on {}",<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>          Bytes.toStringBinary(regionName), serverName);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>        continue;<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      }<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      regionNode.lock();<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>      try {<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>        long diff = EnvironmentEdgeManager.currentTime() - regionNode.getLastUpdate();<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>        if (regionNode.isInState(State.OPENING, State.OPEN)) {<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>          // This is possible as a region server has just closed a region but the region server<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>          // report is generated before the closing, but arrive after the closing. Make sure there<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>          // is some elapsed time so less false alarms.<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>          if (!regionNode.getRegionLocation().equals(serverName) &amp;&amp; diff &gt; 1000) {<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>            LOG.warn("{} reported OPEN on server={} but state has otherwise", regionNode,<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>              serverName);<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>          }<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>        } else if (!regionNode.isInState(State.CLOSING, State.SPLITTING)) {<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>          // So, we can get report that a region is CLOSED or SPLIT because a heartbeat<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>          // came in at about same time as a region transition. Make sure there is some<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>          // elapsed time so less false alarms.<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>          if (diff &gt; 1000) {<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>            LOG.warn("{} reported an unexpected OPEN on {}; time since last update={}ms",<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>              regionNode, serverName, diff);<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>          }<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>        }<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      } finally {<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>        regionNode.unlock();<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>      }<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    }<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>  }<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span><a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>  // ============================================================================================<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>  //  RIT chore<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>  // ============================================================================================<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>  private static class RegionInTransitionChore extends ProcedureInMemoryChore&lt;MasterProcedureEnv&gt; {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>    public RegionInTransitionChore(final int timeoutMsec) {<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>      super(timeoutMsec);<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>    }<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span><a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>    @Override<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    protected void periodicExecute(final MasterProcedureEnv env) {<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>      final AssignmentManager am = env.getAssignmentManager();<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span><a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>      final RegionInTransitionStat ritStat = am.computeRegionInTransitionStat();<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>      if (ritStat.hasRegionsOverThreshold()) {<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>        for (RegionState hri: ritStat.getRegionOverThreshold()) {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>          am.handleRegionOverStuckWarningThreshold(hri.getRegion());<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>        }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>      }<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span><a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      // update metrics<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>      am.updateRegionsInTransitionMetrics(ritStat);<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>    }<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>  }<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span><a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>  public RegionInTransitionStat computeRegionInTransitionStat() {<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    final RegionInTransitionStat rit = new RegionInTransitionStat(getConfiguration());<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>    rit.update(this);<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    return rit;<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>  }<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span><a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>  public static class RegionInTransitionStat {<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    private final int ritThreshold;<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span><a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>    private HashMap&lt;String, RegionState&gt; ritsOverThreshold = null;<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>    private long statTimestamp;<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>    private long oldestRITTime = 0;<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    private int totalRITsTwiceThreshold = 0;<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>    private int totalRITs = 0;<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span><a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>    @VisibleForTesting<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    public RegionInTransitionStat(final Configuration conf) {<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>      this.ritThreshold =<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>        conf.getInt(METRICS_RIT_STUCK_WARNING_THRESHOLD, DEFAULT_RIT_STUCK_WARNING_THRESHOLD);<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>    }<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span><a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>    public int getRITThreshold() {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      return ritThreshold;<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    }<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span><a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    public long getTimestamp() {<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      return statTimestamp;<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>    }<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span><a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    public int getTotalRITs() {<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>      return totalRITs;<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>    }<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span><a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>    public long getOldestRITTime() {<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>      return oldestRITTime;<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>    }<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span><a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>    public int getTotalRITsOverThreshold() {<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>      Map&lt;String, RegionState&gt; m = this.ritsOverThreshold;<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>      return m != null ? m.size() : 0;<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>    }<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span><a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>    public boolean hasRegionsTwiceOverThreshold() {<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      return totalRITsTwiceThreshold &gt; 0;<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>    }<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span><a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>    public boolean hasRegionsOverThreshold() {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>      Map&lt;String, RegionState&gt; m = this.ritsOverThreshold;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>      return m != null &amp;&amp; !m.isEmpty();<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>    }<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span><a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>    public Collection&lt;RegionState&gt; getRegionOverThreshold() {<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      Map&lt;String, RegionState&gt; m = this.ritsOverThreshold;<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>      return m != null? m.values(): Collections.emptySet();<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    }<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span><a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>    public boolean isRegionOverThreshold(final RegionInfo regionInfo) {<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>      Map&lt;String, RegionState&gt; m = this.ritsOverThreshold;<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      return m != null &amp;&amp; m.containsKey(regionInfo.getEncodedName());<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>    }<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span><a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>    public boolean isRegionTwiceOverThreshold(final RegionInfo regionInfo) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      Map&lt;String, RegionState&gt; m = this.ritsOverThreshold;<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>      if (m == null) return false;<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>      final RegionState state = m.get(regionInfo.getEncodedName());<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>      if (state == null) return false;<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>      return (statTimestamp - state.getStamp()) &gt; (ritThreshold * 2);<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>    }<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span><a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>    protected void update(final AssignmentManager am) {<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>      final RegionStates regionStates = am.getRegionStates();<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      this.statTimestamp = EnvironmentEdgeManager.currentTime();<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>      update(regionStates.getRegionsStateInTransition(), statTimestamp);<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>      update(regionStates.getRegionFailedOpen(), statTimestamp);<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>    }<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span><a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    private void update(final Collection&lt;RegionState&gt; regions, final long currentTime) {<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>      for (RegionState state: regions) {<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>        totalRITs++;<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>        final long ritStartedMs = state.getStamp();<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>        if (ritStartedMs == 0) {<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>          // Don't output bogus values to metrics if they accidentally make it here.<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>          LOG.warn("The RIT {} has no start time", state.getRegion());<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>          continue;<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>        }<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>        final long ritTime = currentTime - ritStartedMs;<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>        if (ritTime &gt; ritThreshold) {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>          if (ritsOverThreshold == null) {<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>            ritsOverThreshold = new HashMap&lt;String, RegionState&gt;();<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>          }<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>          ritsOverThreshold.put(state.getRegion().getEncodedName(), state);<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>          totalRITsTwiceThreshold += (ritTime &gt; (ritThreshold * 2)) ? 1 : 0;<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>        }<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>        if (oldestRITTime &lt; ritTime) {<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>          oldestRITTime = ritTime;<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>        }<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      }<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>  private void updateRegionsInTransitionMetrics(final RegionInTransitionStat ritStat) {<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    metrics.updateRITOldestAge(ritStat.getOldestRITTime());<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    metrics.updateRITCount(ritStat.getTotalRITs());<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    metrics.updateRITCountOverThreshold(ritStat.getTotalRITsOverThreshold());<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>  }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span><a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>  private void handleRegionOverStuckWarningThreshold(final RegionInfo regionInfo) {<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    final RegionStateNode regionNode = regionStates.getRegionStateNode(regionInfo);<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>    //if (regionNode.isStuck()) {<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    LOG.warn("STUCK Region-In-Transition {}", regionNode);<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>  }<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span><a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>  // ============================================================================================<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>  //  TODO: Master load/bootstrap<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>  // ============================================================================================<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>  public void joinCluster() throws IOException {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>    long startTime = System.nanoTime();<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>    LOG.debug("Joining cluster...");<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span><a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>    // Scan hbase:meta to build list of existing regions, servers, and assignment.<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    // hbase:meta is online now or will be. Inside loadMeta, we keep trying. Can't make progress<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    // w/o  meta.<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    loadMeta();<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span><a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    while (master.getServerManager().countOfRegionServers() &lt; 1) {<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      LOG.info("Waiting for RegionServers to join; current count={}",<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>        master.getServerManager().countOfRegionServers());<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>      Threads.sleep(250);<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>    }<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    LOG.info("Number of RegionServers={}", master.getServerManager().countOfRegionServers());<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span><a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    // Start the RIT chore<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    master.getMasterProcedureExecutor().addChore(this.ritChore);<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span><a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    long costMs = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startTime);<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    LOG.info("Joined the cluster in {}", StringUtils.humanTimeDiff(costMs));<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>  }<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span><a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>  /**<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>   * Create assign procedure for offline regions.<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>   * Just follow the old processofflineServersWithOnlineRegions method. Since now we do not need to<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>   * deal with dead server any more, we only deal with the regions in OFFLINE state in this method.<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>   * And this is a bit strange, that for new regions, we will add it in CLOSED state instead of<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>   * OFFLINE state, and usually there will be a procedure to track them. The<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>   * processofflineServersWithOnlineRegions is a legacy from long ago, as things are going really<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>   * different now, maybe we do not need this method any more. Need to revisit later.<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>   */<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>  // Public so can be run by the Master as part of the startup. Needs hbase:meta to be online.<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>  // Needs to be done after the table state manager has been started.<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>  public void processOfflineRegions() {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>    List&lt;RegionInfo&gt; offlineRegions = regionStates.getRegionStates().stream()<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      .filter(RegionState::isOffline).filter(s -&gt; isTableEnabled(s.getRegion().getTable()))<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>      .map(RegionState::getRegion).collect(Collectors.toList());<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>    if (!offlineRegions.isEmpty()) {<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>      master.getMasterProcedureExecutor().submitProcedures(<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>        master.getAssignmentManager().createRoundRobinAssignProcedures(offlineRegions));<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>    }<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>  }<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span><a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>  private void loadMeta() throws IOException {<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>    // TODO: use a thread pool<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    regionStateStore.visitMeta(new RegionStateStore.RegionStateVisitor() {<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>      @Override<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>      public void visitRegionState(Result result, final RegionInfo regionInfo, final State state,<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>          final ServerName regionLocation, final ServerName lastHost, final long openSeqNum) {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>        if (state == null &amp;&amp; regionLocation == null &amp;&amp; lastHost == null &amp;&amp;<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>            openSeqNum == SequenceId.NO_SEQUENCE_ID) {<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>          // This is a row with nothing in it.<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>          LOG.warn("Skipping empty row={}", result);<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>          return;<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>        }<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>        State localState = state;<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>        if (localState == null) {<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>          // No region state column data in hbase:meta table! Are I doing a rolling upgrade from<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>          // hbase1 to hbase2? Am I restoring a SNAPSHOT or otherwise adding a region to hbase:meta?<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>          // In any of these cases, state is empty. For now, presume OFFLINE but there are probably<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>          // cases where we need to probe more to be sure this correct; TODO informed by experience.<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>          LOG.info(regionInfo.getEncodedName() + " regionState=null; presuming " + State.OFFLINE);<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span><a name="line.1310"></a>
+<span class="sourceLineNo">216</span>        if (regionNode.getProcedure() != null) {<a name="line.216"></a>
+<span class="sourceLineNo">217</span>          regionNode.getProcedure().stateLoaded(this, regionNode);<a name="line.217"></a>
+<span class="sourceLineNo">218</span>        }<a name="line.218"></a>
+<span class="sourceLineNo">219</span>        setMetaAssigned(regionState.getRegion(), regionState.getState() == State.OPEN);<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      } finally {<a name="line.220"></a>
+<span class="sourceLineNo">221</span>        regionNode.unlock();<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      }<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    }<a name="line.223"></a>
+<span class="sourceLineNo">224</span>  }<a name="line.224"></a>
+<span class="sourceLineNo">225</span><a name="line.225"></a>
+<span class="sourceLineNo">226</span>  /**<a name="line.226"></a>
+<span class="sourceLineNo">227</span>   * Create RegionStateNode based on the TRSP list, and attach the TRSP to the RegionStateNode.<a name="line.227"></a>
+<span class="sourceLineNo">228</span>   * &lt;p&gt;<a name="line.228"></a>
+<span class="sourceLineNo">229</span>   * This is used to restore the RIT region list, so we do not need to restore it in the loadingMeta<a name="line.229"></a>
+<span class="sourceLineNo">230</span>   * method below. And it is also very important as now before submitting a TRSP, we need to attach<a name="line.230"></a>
+<span class="sourceLineNo">231</span>   * it to the RegionStateNode, which acts like a guard, so we need to restore this information at<a name="line.231"></a>
+<span class="sourceLineNo">232</span>   * the very beginning, before we start processing any procedures.<a name="line.232"></a>
+<span class="sourceLineNo">233</span>   */<a name="line.233"></a>
+<span class="sourceLineNo">234</span>  public void setupRIT(List&lt;TransitRegionStateProcedure&gt; procs) {<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    procs.forEach(proc -&gt; {<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      RegionInfo regionInfo = proc.getRegion();<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      RegionStateNode regionNode = regionStates.getOrCreateRegionStateNode(regionInfo);<a name="line.237"></a>
+<span class="sourceLineNo">238</span>      TransitRegionStateProcedure existingProc = regionNode.getProcedure();<a name="line.238"></a>
+<span class="sourceLineNo">239</span>      if (existingProc != null) {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>        // This is possible, as we will detach the procedure from the RSN before we<a name="line.240"></a>
+<span class="sourceLineNo">241</span>        // actually finish the procedure. This is because that, we will detach the TRSP from the RSN<a name="line.241"></a>
+<span class="sourceLineNo">242</span>        // during execution, at that time, the procedure has not been marked as done in the pv2<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        // framework yet, so it is possible that we schedule a new TRSP immediately and when<a name="line.243"></a>
+<span class="sourceLineNo">244</span>        // arriving here, we will find out that there are multiple TRSPs for the region. But we can<a name="line.244"></a>
+<span class="sourceLineNo">245</span>        // make sure that, only the last one can take the charge, the previous ones should have all<a name="line.245"></a>
+<span class="sourceLineNo">246</span>        // been finished already. So here we will compare the proc id, the greater one will win.<a name="line.246"></a>
+<span class="sourceLineNo">247</span>        if (existingProc.getProcId() &lt; proc.getProcId()) {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>          // the new one wins, unset and set it to the new one below<a name="line.248"></a>
+<span class="sourceLineNo">249</span>          regionNode.unsetProcedure(existingProc);<a name="line.249"></a>
+<span class="sourceLineNo">250</span>        } else {<a name="line.250"></a>
+<span class="sourceLineNo">251</span>          // the old one wins, skip<a name="line.251"></a>
+<span class="sourceLineNo">252</span>          return;<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>      LOG.info("Attach {} to {} to restore RIT", proc, regionNode);<a name="line.255"></a>
+<span class="sourceLineNo">256</span>      regionNode.setProcedure(proc);<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    });<a name="line.257"></a>
+<span class="sourceLineNo">258</span>  }<a name="line.258"></a>
+<span class="sourceLineNo">259</span><a name="line.259"></a>
+<span class="sourceLineNo">260</span>  public void stop() {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    if (!running.compareAndSet(true, false)) {<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      return;<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    }<a name="line.263"></a>
+<span class="sourceLineNo">264</span><a name="line.264"></a>
+<span class="sourceLineNo">265</span>    LOG.info("Stopping assignment manager");<a name="line.265"></a>
+<span class="sourceLineNo">266</span><a name="line.266"></a>
+<span class="sourceLineNo">267</span>    // The AM is started before the procedure executor,<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    // but the actual work will be loaded/submitted only once we have the executor<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    final boolean hasProcExecutor = master.getMasterProcedureExecutor() != null;<a name="line.269"></a>
+<span class="sourceLineNo">270</span><a name="line.270"></a>
+<span class="sourceLineNo">271</span>    // Remove the RIT chore<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    if (hasProcExecutor) {<a name="line.272"></a>
+<span class="sourceLineNo">273</span>      master.getMasterProcedureExecutor().removeChore(this.ritChore);<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    }<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>    // Stop the Assignment Thread<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    stopAssignmentThread();<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>    // Stop the RegionStateStore<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    regionStates.clear();<a name="line.280"></a>
+<span class="sourceLineNo">281</span><a name="line.281"></a>
+<span class="sourceLineNo">282</span>    // Update meta events (for testing)<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    if (hasProcExecutor) {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      metaLoadEvent.suspend();<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      for (RegionInfo hri: getMetaRegionSet()) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>        setMetaAssigned(hri, false);<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>  }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>  public boolean isRunning() {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    return running.get();<a name="line.292"></a>
+<span class="sourceLineNo">293</span>  }<a name="line.293"></a>
+<span class="sourceLineNo">294</span><a name="line.294"></a>
+<span class="sourceLineNo">295</span>  public Configuration getConfiguration() {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    return master.getConfiguration();<a name="line.296"></a>
+<span class="sourceLineNo">297</span>  }<a name="line.297"></a>
+<span class="sourceLineNo">298</span><a name="line.298"></a>
+<span class="sourceLineNo">299</span>  public MetricsAssignmentManager getAssignmentManagerMetrics() {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    return metrics;<a name="line.300"></a>
+<span class="sourceLineNo">301</span>  }<a name="line.301"></a>
+<span class="sourceLineNo">302</span><a name="line.302"></a>
+<span class="sourceLineNo">303</span>  private LoadBalancer getBalancer() {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    return master.getLoadBalancer();<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>  private MasterProcedureEnv getProcedureEnvironment() {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    return master.getMasterProcedureExecutor().getEnvironment();<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>  private MasterProcedureScheduler getProcedureScheduler() {<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    return getProcedureEnvironment().getProcedureScheduler();<a name="line.312"></a>
+<span class="sourceLineNo">313</span>  }<a name="line.313"></a>
+<span class="sourceLineNo">314</span><a name="line.314"></a>
+<span class="sourceLineNo">315</span>  int getAssignMaxAttempts() {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    return assignMaxAttempts;<a name="line.316"></a>
+<span class="sourceLineNo">317</span>  }<a name="line.317"></a>
+<span class="sourceLineNo">318</span><a name="line.318"></a>
+<span class="sourceLineNo">319</span>  int getAssignRetryImmediatelyMaxAttempts() {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    return assignRetryImmediatelyMaxAttempts;<a name="line.320"></a>
+<span class="sourceLineNo">321</span>  }<a name="line.321"></a>
+<span class="sourceLineNo">322</span><a name="line.322"></a>
+<span class="sourceLineNo">323</span>  public RegionStates getRegionStates() {<a name="line.323"></a>
+<span class="sourceLineNo">324</span>    return regionStates;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  }<a name="line.325"></a>
+<span class="sourceLineNo">326</span><a name="line.326"></a>
+<span class="sourceLineNo">327</span>  /**<a name="line.327"></a>
+<span class="sourceLineNo">328</span>   * Returns the regions hosted by the specified server.<a name="line.328"></a>
+<span class="sourceLineNo">329</span>   * &lt;p/&gt;<a name="line.329"></a>
+<span class="sourceLineNo">330</span>   * Notice that, for SCP, after we submit the SCP, no one can change the region list for the<a name="line.330"></a>
+<span class="sourceLineNo">331</span>   * ServerStateNode so we do not need any locks here. And for other usage, this can only give you a<a name="line.331"></a>
+<span class="sourceLineNo">332</span>   * snapshot of the current region list for this server, which means, right after you get the<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   * region list, new regions may be moved to this server or some regions may be moved out from this<a name="line.333"></a>
+<span class="sourceLineNo">334</span>   * server, so you should not use it critically if you need strong consistency.<a name="line.334"></a>
+<span class="sourceLineNo">335</span>   */<a name="line.335"></a>
+<span class="sourceLineNo">336</span>  public List&lt;RegionInfo&gt; getRegionsOnServer(ServerName serverName) {<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    ServerStateNode serverInfo = regionStates.getServerNode(serverName);<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    if (serverInfo == null) {<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      return Collections.emptyList();<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    }<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    return serverInfo.getRegionInfoList();<a name="line.341"></a>
+<span class="sourceLineNo">342</span>  }<a name="line.342"></a>
+<span class="sourceLineNo">343</span><a name="line.343"></a>
+<span class="sourceLineNo">344</span>  public RegionStateStore getRegionStateStore() {<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    return regionStateStore;<a name="line.345"></a>
+<span class="sourceLineNo">346</span>  }<a name="line.346"></a>
+<span class="sourceLineNo">347</span><a name="line.347"></a>
+<span class="sourceLineNo">348</span>  public List&lt;ServerName&gt; getFavoredNodes(final RegionInfo regionInfo) {<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    return this.shouldAssignRegionsWithFavoredNodes<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      ? ((FavoredStochasticBalancer) getBalancer()).getFavoredNodes(regionInfo)<a name="line.350"></a>
+<span class="sourceLineNo">351</span>      : ServerName.EMPTY_SERVER_LIST;<a name="line.351"></a>
+<span class="sourceLineNo">352</span>  }<a name="line.352"></a>
+<span class="sourceLineNo">353</span><a name="line.353"></a>
+<span class="sourceLineNo">354</span>  // ============================================================================================<a name="line.354"></a>
+<span class="sourceLineNo">355</span>  //  Table State Manager helpers<a name="line.355"></a>
+<span class="sourceLineNo">356</span>  // ============================================================================================<a name="line.356"></a>
+<span class="sourceLineNo">357</span>  TableStateManager getTableStateManager() {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    return master.getTableStateManager();<a name="line.358"></a>
+<span class="sourceLineNo">359</span>  }<a name="line.359"></a>
+<span class="sourceLineNo">360</span><a name="line.360"></a>
+<span class="sourceLineNo">361</span>  public boolean isTableEnabled(final TableName tableName) {<a name="line.361"></a>
+<span class="sourceLineNo">362</span>    return getTableStateManager().isTableState(tableName, TableState.State.ENABLED);<a name="line.362"></a>
+<span class="sourceLineNo">363</span>  }<a name="line.363"></a>
+<span class="sourceLineNo">364</span><a name="line.364"></a>
+<span class="sourceLineNo">365</span>  public boolean isTableDisabled(final TableName tableName) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>    return getTableStateManager().isTableState(tableName,<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      TableState.State.DISABLED, TableState.State.DISABLING);<a name="line.367"></a>
+<span class="sourceLineNo">368</span>  }<a name="line.368"></a>
+<span class="sourceLineNo">369</span><a name="line.369"></a>
+<span class="sourceLineNo">370</span>  // ============================================================================================<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  //  META Helpers<a name="line.371"></a>
+<span class="sourceLineNo">372</span>  // ============================================================================================<a name="line.372"></a>
+<span class="sourceLineNo">373</span>  private boolean isMetaRegion(final RegionInfo regionInfo) {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>    return regionInfo.isMetaRegion();<a name="line.374"></a>
+<span class="sourceLineNo">375</span>  }<a name="line.375"></a>
+<span class="sourceLineNo">376</span><a name="line.376"></a>
+<span class="sourceLineNo">377</span>  public boolean isMetaRegion(final byte[] regionName) {<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    return getMetaRegionFromName(regionName) != null;<a name="line.378"></a>
+<span class="sourceLineNo">379</span>  }<a name="line.379"></a>
+<span class="sourceLineNo">380</span><a name="line.380"></a>
+<span class="sourceLineNo">381</span>  public RegionInfo getMetaRegionFromName(final byte[] regionName) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>    for (RegionInfo hri: getMetaRegionSet()) {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      if (Bytes.equals(hri.getRegionName(), regionName)) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        return hri;<a name="line.384"></a>
+<span class="sourceLineNo">385</span>      }<a name="line.385"></a>
+<span class="sourceLineNo">386</span>    }<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    return null;<a name="line.387"></a>
+<span class="sourceLineNo">388</span>  }<a name="line.388"></a>
+<span class="sourceLineNo">389</span><a name="line.389"></a>
+<span class="sourceLineNo">390</span>  public boolean isCarryingMeta(final ServerName serverName) {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    // TODO: handle multiple meta<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    return isCarryingRegion(serverName, RegionInfoBuilder.FIRST_META_REGIONINFO);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>  }<a name="line.393"></a>
+<span class="sourceLineNo">394</span><a name="line.394"></a>
+<span class="sourceLineNo">395</span>  private boolean isCarryingRegion(final ServerName serverName, final RegionInfo regionInfo) {<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    // TODO: check for state?<a name="line.396"></a>
+<span class="sourceLineNo">397</span>    final RegionStateNode node = regionStates.getRegionStateNode(regionInfo);<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    return(node != null &amp;&amp; serverName.equals(node.getRegionLocation()));<a name="line.398"></a>
+<span class="sourceLineNo">399</span>  }<a name="line.399"></a>
+<span class="sourceLineNo">400</span><a name="line.400"></a>
+<span class="sourceLineNo">401</span>  private RegionInfo getMetaForRegion(final RegionInfo regionInfo) {<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    //if (regionInfo.isMetaRegion()) return regionInfo;<a name="line.402"></a>
+<span class="sourceLineNo">403</span>    // TODO: handle multiple meta. if the region provided is not meta lookup<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    // which meta the region belongs to.<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    return RegionInfoBuilder.FIRST_META_REGIONINFO;<a name="line.405"></a>
+<span class="sourceLineNo">406</span>  }<a name="line.406"></a>
+<span class="sourceLineNo">407</span><a name="line.407"></a>
+<span class="sourceLineNo">408</span>  // TODO: handle multiple meta.<a name="line.408"></a>
+<span class="sourceLineNo">409</span>  private static final Set&lt;RegionInfo&gt; META_REGION_SET =<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      Collections.singleton(RegionInfoBuilder.FIRST_META_REGIONINFO);<a name="line.410"></a>
+<span class="sourceLineNo">411</span>  public Set&lt;RegionInfo&gt; getMetaRegionSet() {<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    return META_REGION_SET;<a name="line.412"></a>
+<span class="sourceLineNo">413</span>  }<a name="line.413"></a>
+<span class="sourceLineNo">414</span><a name="line.414"></a>
+<span class="sourceLineNo">415</span>  // ============================================================================================<a name="line.415"></a>
+<span class="sourceLineNo">416</span>  //  META Event(s) helpers<a name="line.416"></a>
+<span class="sourceLineNo">417</span>  // ============================================================================================<a name="line.417"></a>
+<span class="sourceLineNo">418</span>  /**<a name="line.418"></a>
+<span class="sourceLineNo">419</span>   * Notice that, this only means the meta region is available on a RS, but the AM may still be<a name="line.419"></a>
+<span class="sourceLineNo">420</span>   * loading the region states from meta, so usually you need to check {@link #isMetaLoaded()} first<a name="line.420"></a>
+<span class="sourceLineNo">421</span>   * before checking this method, unless you can make sure that your piece of code can only be<a name="line.421"></a>
+<span class="sourceLineNo">422</span>   * executed after AM builds the region states.<a name="line.422"></a>
+<span class="sourceLineNo">423</span>   * @see #isMetaLoaded()<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   */<a name="line.424"></a>
+<span class="sourceLineNo">425</span>  public boolean isMetaAssigned() {<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    return metaAssignEvent.isReady();<a name="line.426"></a>
+<span class="sourceLineNo">427</span>  }<a name="line.427"></a>
+<span class="sourceLineNo">428</span><a name="line.428"></a>
+<span class="sourceLineNo">429</span>  public boolean isMetaRegionInTransition() {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    return !isMetaAssigned();<a name="line.430"></a>
+<span class="sourceLineNo">431</span>  }<a name="line.431"></a>
+<span class="sourceLineNo">432</span><a name="line.432"></a>
+<span class="sourceLineNo">433</span>  /**<a name="line.433"></a>
+<span class="sourceLineNo">434</span>   * Notice that this event does not mean the AM has already finished region state rebuilding. See<a name="line.434"></a>
+<span class="sourceLineNo">435</span>   * the comment of {@link #isMetaAssigned()} for more details.<a name="line.435"></a>
+<span class="sourceLineNo">436</span>   * @see #isMetaAssigned()<a name="line.436"></a>
+<span class="sourceLineNo">437</span>   */<a name="line.437"></a>
+<span class="sourceLineNo">438</span>  public boolean waitMetaAssigned(Procedure&lt;?&gt; proc, RegionInfo regionInfo) {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    return getMetaAssignEvent(getMetaForRegion(regionInfo)).suspendIfNotReady(proc);<a name="line.439"></a>
+<span class="sourceLineNo">440</span>  }<a name="line.440"></a>
+<span class="sourceLineNo">441</span><a name="line.441"></a>
+<span class="sourceLineNo">442</span>  private void setMetaAssigned(RegionInfo metaRegionInfo, boolean assigned) {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>    assert isMetaRegion(metaRegionInfo) : "unexpected non-meta region " + metaRegionInfo;<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    ProcedureEvent&lt;?&gt; metaAssignEvent = getMetaAssignEvent(metaRegionInfo);<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    if (assigned) {<a name="line.445"></a>
+<span class="sourceLineNo">446</span>      metaAssignEvent.wake(getProcedureScheduler());<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    } else {<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      metaAssignEvent.suspend();<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    }<a name="line.449"></a>
+<span class="sourceLineNo">450</span>  }<a name="line.450"></a>
+<span class="sourceLineNo">451</span><a name="line.451"></a>
+<span class="sourceLineNo">452</span>  private ProcedureEvent&lt;?&gt; getMetaAssignEvent(RegionInfo metaRegionInfo) {<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    assert isMetaRegion(metaRegionInfo) : "unexpected non-meta region " + metaRegionInfo;<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    // TODO: handle multiple meta.<a name="line.454"></a>
+<span class="sourceLineNo">455</span>    return metaAssignEvent;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>  }<a name="line.456"></a>
+<span class="sourceLineNo">457</span><a name="line.457"></a>
+<span class="sourceLineNo">458</span>  /**<a name="line.458"></a>
+<span class="sourceLineNo">459</span>   * Wait until AM finishes the meta loading, i.e, the region states rebuilding.<a name="line.459"></a>
+<span class="sourceLineNo">460</span>   * @see #isMetaLoaded()<a name="line.460"></a>
+<span class="sourceLineNo">461</span>   * @see #waitMetaAssigned(Procedure, RegionInfo)<a name="line.461"></a>
+<span class="sourceLineNo">462</span>   */<a name="line.462"></a>
+<span class="sourceLineNo">463</span>  public boolean waitMetaLoaded(Procedure&lt;?&gt; proc) {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    return metaLoadEvent.suspendIfNotReady(proc);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>  }<a name="line.465"></a>
+<span class="sourceLineNo">466</span><a name="line.466"></a>
+<span class="sourceLineNo">467</span>  @VisibleForTesting<a name="line.467"></a>
+<span class="sourceLineNo">468</span>  void wakeMetaLoadedEvent() {<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    metaLoadEvent.wake(getProcedureScheduler());<a name="line.469"></a>
+<span class="sourceLineNo">470</span>    assert isMetaLoaded() : "expected meta to be loaded";<a name="line.470"></a>
+<span class="sourceLineNo">471</span>  }<a name="line.471"></a>
+<span class="sourceLineNo">472</span><a name="line.472"></a>
+<span class="sourceLineNo">473</span>  /**<a name="line.473"></a>
+<span class="sourceLineNo">474</span>   * Return whether AM finishes the meta loading, i.e, the region states rebuilding.<a name="line.474"></a>
+<span class="sourceLineNo">475</span>   * @see #isMetaAssigned()<a name="line.475"></a>
+<span class="sourceLineNo">476</span>   * @see #waitMetaLoaded(Procedure)<a name="line.476"></a>
+<span class="sourceLineNo">477</span>   */<a name="line.477"></a>
+<span class="sourceLineNo">478</span>  public boolean isMetaLoaded() {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    return metaLoadEvent.isReady();<a name="line.479"></a>
+<span class="sourceLineNo">480</span>  }<a name="line.480"></a>
+<span class="sourceLineNo">481</span><a name="line.481"></a>
+<span class="sourceLineNo">482</span>  /**<a name="line.482"></a>
+<span class="sourceLineNo">483</span>   * Start a new thread to check if there are region servers whose versions are higher than others.<a name="line.483"></a>
+<span class="sourceLineNo">484</span>   * If so, move all system table regions to RS with the highest version to keep compatibility.<a name="line.484"></a>
+<span class="sourceLineNo">485</span>   * The reason is, RS in new version may not be able to access RS in old version when there are<a name="line.485"></a>
+<span class="sourceLineNo">486</span>   * some incompatible changes.<a name="line.486"></a>
+<span class="sourceLineNo">487</span>   * &lt;p&gt;This method is called when a new RegionServer is added to cluster only.&lt;/p&gt;<a name="line.487"></a>
+<span class="sourceLineNo">488</span>   */<a name="line.488"></a>
+<span class="sourceLineNo">489</span>  public void checkIfShouldMoveSystemRegionAsync() {<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    // TODO: Fix this thread. If a server is killed and a new one started, this thread thinks that<a name="line.490"></a>
+<span class="sourceLineNo">491</span>    // it should 'move' the system tables from the old server to the new server but<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    // ServerCrashProcedure is on it; and it will take care of the assign without dataloss.<a name="line.492"></a>
+<span class="sourceLineNo">493</span>    if (this.master.getServerManager().countOfRegionServers() &lt;= 1) {<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      return;<a name="line.494"></a>
+<span class="sourceLineNo">495</span>    }<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    // This thread used to run whenever there was a change in the cluster. The ZooKeeper<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    // childrenChanged notification came in before the nodeDeleted message and so this method<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    // cold run before a ServerCrashProcedure could run. That meant that this thread could see<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    // a Crashed Server before ServerCrashProcedure and it could find system regions on the<a name="line.499"></a>
+<span class="sourceLineNo">500</span>    // crashed server and go move them before ServerCrashProcedure had a chance; could be<a name="line.500"></a>
+<span class="sourceLineNo">501</span>    // dataloss too if WALs were not recovered.<a name="line.501"></a>
+<span class="sourceLineNo">502</span>    new Thread(() -&gt; {<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      try {<a name="line.503"></a>
+<span class="sourceLineNo">504</span>        synchronized (checkIfShouldMoveSystemRegionLock) {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>          List&lt;RegionPlan&gt; plans = new ArrayList&lt;&gt;();<a name="line.505"></a>
+<span class="sourceLineNo">506</span>          // TODO: I don't think this code does a good job if all servers in cluster have same<a name="line.506"></a>
+<span class="sourceLineNo">507</span>          // version. It looks like it will schedule unnecessary moves.<a name="line.507"></a>
+<span class="sourceLineNo">508</span>          for (ServerName server : getExcludedServersForSystemTable()) {<a name="line.508"></a>
+<span class="sourceLineNo">509</span>            if (master.getServerManager().isServerDead(server)) {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>              // TODO: See HBASE-18494 and HBASE-18495. Though getExcludedServersForSystemTable()<a name="line.510"></a>
+<span class="sourceLineNo">511</span>              // considers only online servers, the server could be queued for dead server<a name="line.511"></a>
+<span class="sourceLineNo">512</span>              // processing. As region assignments for crashed server is handled by<a name="line.512"></a>
+<span class="sourceLineNo">513</span>              // ServerCrashProcedure, do NOT handle them here. The goal is to handle this through<a name="line.513"></a>
+<span class="sourceLineNo">514</span>              // regular flow of LoadBalancer as a favored node and not to have this special<a name="line.514"></a>
+<span class="sourceLineNo">515</span>              // handling.<a name="line.515"></a>
+<span class="sourceLineNo">516</span>              continue;<a name="line.516"></a>
+<span class="sourceLineNo">517</span>            }<a name="line.517"></a>
+<span class="sourceLineNo">518</span>            List&lt;RegionInfo&gt; regionsShouldMove = getSystemTables(server);<a name="line.518"></a>
+<span class="sourceLineNo">519</span>            if (!regionsShouldMove.isEmpty()) {<a name="line.519"></a>
+<span class="sourceLineNo">520</span>              for (RegionInfo regionInfo : regionsShouldMove) {<a name="line.520"></a>
+<span class="sourceLineNo">521</span>                // null value for dest forces destination server to be selected by balancer<a name="line.521"></a>
+<span class="sourceLineNo">522</span>                RegionPlan plan = new RegionPlan(regionInfo, server, null);<a name="line.522"></a>
+<span class="sourceLineNo">523</span>                if (regionInfo.isMetaRegion()) {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>                  // Must move meta region first.<a name="line.524"></a>
+<span class="sourceLineNo">525</span>                  LOG.info("Async MOVE of {} to newer Server={}",<a name="line.525"></a>
+<span class="sourceLineNo">526</span>                      regionInfo.getEncodedName(), server);<a name="line.526"></a>
+<span class="sourceLineNo">527</span>                  moveAsync(plan);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>                } else {<a name="line.528"></a>
+<span class="sourceLineNo">529</span>                  plans.add(plan);<a name="line.529"></a>
+<span class="sourceLineNo">530</span>                }<a name="line.530"></a>
+<span class="sourceLineNo">531</span>              }<a name="line.531"></a>
+<span class="sourceLineNo">532</span>            }<a name="line.532"></a>
+<span class="sourceLineNo">533</span>            for (RegionPlan plan : plans) {<a name="line.533"></a>
+<span class="sourceLineNo">534</span>              LOG.info("Async MOVE of {} to newer Server={}",<a name="line.534"></a>
+<span class="sourceLineNo">535</span>                  plan.getRegionInfo().getEncodedName(), server);<a name="line.535"></a>
+<span class="sourceLineNo">536</span>              moveAsync(plan);<a name="line.536"></a>
+<span class="sourceLineNo">537</span>            }<a name="line.537"></a>
+<span class="sourceLineNo">538</span>          }<a name="line.538"></a>
+<span class="sourceLineNo">539</span>        }<a name="line.539"></a>
+<span class="sourceLineNo">540</span>      } catch (Throwable t) {<a name="line.540"></a>
+<span class="sourceLineNo">541</span>        LOG.error(t.toString(), t);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>      }<a name="line.542"></a>
+<span class="sourceLineNo">543</span>    }).start();<a name="line.543"></a>
+<span class="sourceLineNo">544</span>  }<a name="line.544"></a>
+<span class="sourceLineNo">545</span><a name="line.545"></a>
+<span class="sourceLineNo">546</span>  private List&lt;RegionInfo&gt; getSystemTables(ServerName serverName) {<a name="line.546"></a>
+<span class="sourceLineNo">547</span>    ServerStateNode serverNode = regionStates.getServerNode(serverName);<a name="line.547"></a>
+<span class="sourceLineNo">548</span>    if (serverNode == null) {<a name="line.548"></a>
+<span class="sourceLineNo">549</span>      return Collections.emptyList();<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    }<a name="line.550"></a>
+<span class="sourceLineNo">551</span>    return serverNode.getSystemRegionInfoList();<a name="line.551"></a>
+<span class="sourceLineNo">552</span>  }<a name="line.552"></a>
+<span class="sourceLineNo">553</span><a name="line.553"></a>
+<span class="sourceLineNo">554</span>  private void preTransitCheck(RegionStateNode regionNode, RegionState.State[] expectedStates)<a name="line.554"></a>
+<span class="sourceLineNo">555</span>      throws HBaseIOException {<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    if (regionNode.getProcedure() != null) {<a name="line.556"></a>
+<span class="sourceLineNo">557</span>      throw new HBaseIOException(regionNode + " is currently in transition");<a name="line.557"></a>
+<span class="sourceLineNo">558</span>    }<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    if (!regionNode.isInState(expectedStates)) {<a name="line.559"></a>
+<span class="sourceLineNo">560</span>      throw new DoNotRetryRegionException("Unexpected state for " + regionNode);<a name="line.560"></a>
+<span class="sourceLineNo">561</span>    }<a name="line.561"></a>
+<span class="sourceLineNo">562</span>    if (getTableStateManager().isTableState(regionNode.getTable(), TableState.State.DISABLING,<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      TableState.State.DISABLED)) {<a name="line.563"></a>
+<span class="sourceLineNo">564</span>      throw new DoNotRetryIOException(regionNode.getTable() + " is disabled for " + regionNode);<a name="line.564"></a>
+<span class="sourceLineNo">565</span>    }<a name="line.565"></a>
+<span class="sourceLineNo">566</span>  }<a name="line.566"></a>
+<span class="sourceLineNo">567</span><a name="line.567"></a>
+<span class="sourceLineNo">568</span>  // TODO: Need an async version of this for hbck2.<a name="line.568"></a>
+<span class="sourceLineNo">569</span>  public long assign(RegionInfo regionInfo, ServerName sn) throws IOException {<a name="line.569"></a>
+<span class="sourceLineNo">570</span>    // TODO: should we use getRegionStateNode?<a name="line.570"></a>
+<span class="sourceLineNo">571</span>    RegionStateNode regionNode = regionStates.getOrCreateRegionStateNode(regionInfo);<a name="line.571"></a>
+<span class="sourceLineNo">572</span>    TransitRegionStateProcedure proc;<a name="line.572"></a>
+<span class="sourceLineNo">573</span>    regionNode.lock();<a name="line.573"></a>
+<span class="sourceLineNo">574</span>    try {<a name="line.574"></a>
+<span class="sourceLineNo">575</span>      preTransitCheck(regionNode, STATES_EXPECTED_ON_ASSIGN);<a name="line.575"></a>
+<span class="sourceLineNo">576</span>      proc = TransitRegionStateProcedure.assign(getProcedureEnvironment(), regionInfo, sn);<a name="line.576"></a>
+<span class="sourceLineNo">577</span>      regionNode.setProcedure(proc);<a name="line.577"></a>
+<span class="sourceLineNo">578</span>    } finally {<a name="line.578"></a>
+<span class="sourceLineNo">579</span>      regionNode.unlock();<a name="line.579"></a>
+<span class="sourceLineNo">580</span>    }<a name="line.580"></a>
+<span class="sourceLineNo">581</span>    ProcedureSyncWait.submitAndWaitProcedure(master.getMasterProcedureExecutor(), proc);<a name="line.581"></a>
+<span class="sourceLineNo">582</span>    return proc.getProcId();<a name="line.582"></a>
+<span class="sourceLineNo">583</span>  }<a name="line.583"></a>
+<span class="sourceLineNo">584</span><a name="line.584"></a>
+<span class="sourceLineNo">585</span>  public long assign(RegionInfo regionInfo) throws IOException {<a name="line.585"></a>
+<span class="sourceLineNo">586</span>    return assign(regionInfo, null);<a name="line.586"></a>
+<span class="sourceLineNo">587</span>  }<a name="line.587"></a>
+<span class="sourceLineNo">588</span><a name="line.588"></a>
+<span class="sourceLineNo">589</span>  public long unassign(RegionInfo regionInfo) throws IOException {<a name="line.589"></a>
+<span class="sourceLineNo">590</span>    RegionStateNode regionNode = regionStates.getRegionStateNode(regionInfo);<a name="line.590"></a>
+<span class="sourceLineNo">591</span>    if (regionNode == null) {<a name="line.591"></a>
+<span class="sourceLineNo">592</span>      throw new UnknownRegionException("No RegionState found for " + regionInfo.getEncodedName());<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    }<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    TransitRegionStateProcedure proc;<a name="line.594"></a>
+<span class="sourceLineNo">595</span>    regionNode.lock();<a name="line.595"></a>
+<span class="sourceLineNo">596</span>    try {<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      preTransitCheck(regionNode, STATES_EXPECTED_ON_UNASSIGN_OR_MOVE);<a name="line.597"></a>
+<span class="sourceLineNo">598</span>      proc = TransitRegionStateProcedure.unassign(getProcedureEnvironment(), regionInfo);<a name="line.598"></a>
+<span class="sourceLineNo">599</span>      regionNode.setProcedure(proc);<a name="line.599"></a>
+<span class="sourceLineNo">600</span>    } finally {<a name="line.600"></a>
+<span class="sourceLineNo">601</span>      regionNode.unlock();<a name="line.601"></a>
+<span class="sourceLineNo">602</span>    }<a name="line.602"></a>
+<span class="sourceLineNo">603</span>    ProcedureSyncWait.submitAndWaitProcedure(master.getMasterProcedureExecutor(), proc);<a name="line.603"></a>
+<span class="sourceLineNo">604</span>    return proc.getProcId();<a name="line.604"></a>
+<span class="sourceLineNo">605</span>  }<a name="line.605"></a>
+<span class="sourceLineNo">606</span><a name="line.606"></a>
+<span class="sourceLineNo">607</span>  public TransitRegionStateProcedure createMoveRegionProcedure(RegionInfo regionInfo,<a name="line.607"></a>
+<span class="sourceLineNo">608</span>      ServerName targetServer) throws HBaseIOException {<a name="line.608"></a>
+<span class="sourceLineNo">609</span>    RegionStateNode regionNode = this.regionStates.getRegionStateNode(regionInfo);<a name="line.609"></a>
+<span class="sourceLineNo">610</span>    if (regionNode == null) {<a name="line.610"></a>
+<span class="sourceLineNo">611</span>      throw new UnknownRegionException("No RegionState found for " + regionInfo.getEncodedName());<a name="line.611"></a>
+<span class="sourceLineNo">612</span>    }<a name="line.612"></a>
+<span class="sourceLineNo">613</span>    TransitRegionStateProcedure proc;<a name="line.613"></a>
+<span class="sourceLineNo">614</span>    regionNode.lock();<a name="line.614"></a>
+<span class="sourceLineNo">615</span>    try {<a name="line.615"></a>
+<span class="sourceLineNo">616</span>      preTransitCheck(regionNode, STATES_EXPECTED_ON_UNASSIGN_OR_MOVE);<a name="line.616"></a>
+<span class="sourceLineNo">617</span>      regionNode.checkOnline();<a name="line.617"></a>
+<span class="sourceLineNo">618</span>      proc = TransitRegionStateProcedure.move(getProcedureEnvironment(), regionInfo, targetServer);<a name="line.618"></a>
+<span class="sourceLineNo">619</span>      regionNode.setProcedure(proc);<a name="line.619"></a>
+<span class="sourceLineNo">620</span>    } finally {<a name="line.620"></a>
+<span class="sourceLineNo">621</span>      regionNode.unlock();<a name="line.621"></a>
+<span class="sourceLineNo">622</span>    }<a name="line.622"></a>
+<span class="sourceLineNo">623</span>    return proc;<a name="line.623"></a>
+<span class="sourceLineNo">624</span>  }<a name="line.624"></a>
+<span class="sourceLineNo">625</span><a name="line.625"></a>
+<span class="sourceLineNo">626</span>  public void move(RegionInfo regionInfo) throws IOException {<a name="line.626"></a>
+<span class="sourceLineNo">627</span>    TransitRegionStateProcedure proc = createMoveRegionProcedure(regionInfo, null);<a name="line.627"></a>
+<span class="sourceLineNo">628</span>    ProcedureSyncWait.submitAndWaitProcedure(master.getMasterProcedureExecutor(), proc);<a name="line.628"></a>
+<span class="sourceLineNo">629</span>  }<a name="line.629"></a>
+<span class="sourceLineNo">630</span><a name="line.630"></a>
+<span class="sourceLineNo">631</span>  public Future&lt;byte[]&gt; moveAsync(RegionPlan regionPlan) throws HBaseIOException {<a name="line.631"></a>
+<span class="sourceLineNo">632</span>    TransitRegionStateProcedure proc =<a name="line.632"></a>
+<span class="sourceLineNo">633</span>      createMoveRegionProcedure(regionPlan.getRegionInfo(), regionPlan.getDestination());<a name="line.633"></a>
+<span class="sourceLineNo">634</span>    return ProcedureSyncWait.submitProcedure(master.getMasterProcedureExecutor(), proc);<a name="line.634"></a>
+<span class="sourceLineNo">635</span>  }<a name="line.635"></a>
+<span class="sourceLineNo">636</span><a name="line.636"></a>
+<span class="sourceLineNo">637</span>  // ============================================================================================<a name="line.637"></a>
+<span class="sourceLineNo">638</span>  //  RegionTransition procedures helpers<a name="line.638"></a>
+<span class="sourceLineNo">639</span>  // ============================================================================================<a name="line.639"></a>
+<span class="sourceLineNo">640</span><a name="line.640"></a>
+<span class="sourceLineNo">641</span>  /**<a name="line.641"></a>
+<span class="sourceLineNo">642</span>   * Create round-robin assigns. Use on table creation to distribute out regions across cluster.<a name="line.642"></a>
+<span class="sourceLineNo">643</span>   * @return AssignProcedures made out of the passed in &lt;code&gt;hris&lt;/code&gt; and a call to the balancer<a name="line.643"></a>
+<span class="sourceLineNo">644</span>   *         to populate the assigns with targets chosen using round-robin (default balancer<a name="line.644"></a>
+<span class="sourceLineNo">645</span>   *         scheme). If at assign-time, the target chosen is no longer up, thats fine, the<a name="line.645"></a>
+<span class="sourceLineNo">646</span>   *         AssignProcedure will ask the balancer for a new target, and so on.<a name="line.646"></a>
+<span class="sourceLineNo">647</span>   */<a name="line.647"></a>
+<span class="sourceLineNo">648</span>  public TransitRegionStateProcedure[] createRoundRobinAssignProcedures(List&lt;RegionInfo&gt; hris,<a name="line.648"></a>
+<span class="sourceLineNo">649</span>      List&lt;ServerName&gt; serversToExclude) {<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    if (hris.isEmpty()) {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>      return new TransitRegionStateProcedure[0];<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    }<a name="line.652"></a>
+<span class="sourceLineNo">653</span><a name="line.653"></a>
+<span class="sourceLineNo">654</span>    if (serversToExclude != null<a name="line.654"></a>
+<span class="sourceLineNo">655</span>        &amp;&amp; this.master.getServerManager().getOnlineServersList().size() == 1) {<a name="line.655"></a>
+<span class="sourceLineNo">656</span>      LOG.debug("Only one region server found and hence going ahead with the assignment");<a name="line.656"></a>
+<span class="sourceLineNo">657</span>      serversToExclude = null;<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    }<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    try {<a name="line.659"></a>
+<span class="sourceLineNo">660</span>      // Ask the balancer to assign our regions. Pass the regions en masse. The balancer can do<a name="line.660"></a>
+<span class="sourceLineNo">661</span>      // a better job if it has all the assignments in the one lump.<a name="line.661"></a>
+<span class="sourceLineNo">662</span>      Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = getBalancer().roundRobinAssignment(hris,<a name="line.662"></a>
+<span class="sourceLineNo">663</span>        this.master.getServerManager().createDestinationServersList(serversToExclude));<a name="line.663"></a>
+<span class="sourceLineNo">664</span>      // Return mid-method!<a name="line.664"></a>
+<span class="sourceLineNo">665</span>      return createAssignProcedures(assignments);<a name="line.665"></a>
+<span class="sourceLineNo">666</span>    } catch (HBaseIOException hioe) {<a name="line.666"></a>
+<span class="sourceLineNo">667</span>      LOG.warn("Failed roundRobinAssignment", hioe);<a name="line.667"></a>
+<span class="sourceLineNo">668</span>    }<a name="line.668"></a>
+<span class="sourceLineNo">669</span>    // If an error above, fall-through to this simpler assign. Last resort.<a name="line.669"></a>
+<span class="sourceLineNo">670</span>    return createAssignProcedures(hris);<a name="line.670"></a>
+<span class="sourceLineNo">671</span>  }<a name="line.671"></a>
+<span class="sourceLineNo">672</span><a name="line.672"></a>
+<span class="sourceLineNo">673</span>  /**<a name="line.673"></a>
+<span class="sourceLineNo">674</span>   * Create round-robin assigns. Use on table creation to distribute out regions across cluster.<a name="line.674"></a>
+<span class="sourceLineNo">675</span>   * @return AssignProcedures made out of the passed in &lt;code&gt;hris&lt;/code&gt; and a call to the balancer<a name="line.675"></a>
+<span class="sourceLineNo">676</span>   *         to populate the assigns with targets chosen using round-robin (default balancer<a name="line.676"></a>
+<span class="sourceLineNo">677</span>   *         scheme). If at assign-time, the target chosen is no longer up, thats fine, the<a name="line.677"></a>
+<span class="sourceLineNo">678</span>   *         AssignProcedure will ask the balancer for a new target, and so on.<a name="line.678"></a>
+<span class="sourceLineNo">679</span>   */<a name="line.679"></a>
+<span class="sourceLineNo">680</span>  public TransitRegionStateProcedure[] createRoundRobinAssignProcedures(List&lt;RegionInfo&gt; hris) {<a name="line.680"></a>
+<span class="sourceLineNo">681</span>    return createRoundRobinAssignProcedures(hris, null);<a name="line.681"></a>
+<span class="sourceLineNo">682</span>  }<a name="line.682"></a>
+<span class="sourceLineNo">683</span><a name="line.683"></a>
+<span class="sourceLineNo">684</span>  @VisibleForTesting<a name="line.684"></a>
+<span class="sourceLineNo">685</span>  static int compare(TransitRegionStateProcedure left, TransitRegionStateProcedure right) {<a name="line.685"></a>
+<span class="sourceLineNo">686</span>    if (left.getRegion().isMetaRegion()) {<a name="line.686"></a>
+<span class="sourceLineNo">687</span>      if (right.getRegion().isMetaRegion()) {<a name="line.687"></a>
+<span class="sourceLineNo">688</span>        return RegionInfo.COMPARATOR.compare(left.getRegion(), right.getRegion());<a name="line.688"></a>
+<span class="sourceLineNo">689</span>      }<a name="line.689"></a>
+<span class="sourceLineNo">690</span>      return -1;<a name="line.690"></a>
+<span class="sourceLineNo">691</span>    } else if (right.getRegion().isMetaRegion()) {<a name="line.691"></a>
+<span class="sourceLineNo">692</span>      return +1;<a name="line.692"></a>
+<span class="sourceLineNo">693</span>    }<a name="line.693"></a>
+<span class="sourceLineNo">694</span>    if (left.getRegion().getTable().isSystemTable()) {<a name="line.694"></a>
+<span class="sourceLineNo">695</span>      if (right.getRegion().getTable().isSystemTable()) {<a name="line.695"></a>
+<span class="sourceLineNo">696</span>        return RegionInfo.COMPARATOR.compare(left.getRegion(), right.getRegion());<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      }<a name="line.697"></a>
+<span class="sourceLineNo">698</span>      return -1;<a name="line.698"></a>
+<span class="sourceLineNo">699</span>    } else if (right.getRegion().getTable().isSystemTable()) {<a name="line.699"></a>
+<span class="sourceLineNo">700</span>      return +1;<a name="line.700"></a>
+<span class="sourceLineNo">701</span>    }<a name="line.701"></a>
+<span class="sourceLineNo">702</span>    return RegionInfo.COMPARATOR.compare(left.getRegion(), right.getRegion());<a name="line.702"></a>
+<span class="sourceLineNo">703</span>  }<a name="line.703"></a>
+<span class="sourceLineNo">704</span><a name="line.704"></a>
+<span class="sourceLineNo">705</span>  private TransitRegionStateProcedure createAssignProcedure(RegionStateNode regionNode,<a name="line.705"></a>
+<span class="sourceLineNo">706</span>      ServerName targetServer, boolean override) {<a name="line.706"></a>
+<span class="sourceLineNo">707</span>    TransitRegionStateProcedure proc;<a name="line.707"></a>
+<span class="sourceLineNo">708</span>    regionNode.lock();<a name="line.708"></a>
+<span class="sourceLineNo">709</span>    try {<a name="line.709"></a>
+<span class="sourceLineNo">710</span>      if(override &amp;&amp; regionNode.getProcedure() != null) {<a name="line.710"></a>
+<span class="sourceLineNo">711</span>        regionNode.unsetProcedure(regionNode.getProcedure());<a name="line.711"></a>
+<span class="sourceLineNo">712</span>      }<a name="line.712"></a>
+<span class="sourceLineNo">713</span>      assert regionNode.getProcedure() == null;<a name="line.713"></a>
+<span class="sourceLineNo">714</span>      proc = TransitRegionStateProcedure.assign(getProcedureEnvironment(),<a name="line.714"></a>
+<span class="sourceLineNo">715</span>        regionNode.getRegionInfo(), targetServer);<a name="line.715"></a>
+<span class="sourceLineNo">716</span>      regionNode.setProcedure(proc);<a name="line.716"></a>
+<span class="sourceLineNo">717</span>    } finally {<a name="line.717"></a>
+<span class="sourceLineNo">718</span>      regionNode.unlock();<a name="line.718"></a>
+<span class="sourceLineNo">719</span>    }<a name="line.719"></a>
+<span class="sourceLineNo">720</span>    return proc;<a name="line.720"></a>
+<span class="sourceLineNo">721</span>  }<a name="line.721"></a>
+<span class="sourceLineNo">722</span><a name="line.722"></a>
+<span class="sourceLineNo">723</span>  private TransitRegionStateProcedure createUnassignProcedure(RegionStateNode regionNode,<a name="line.723"></a>
+<span class="sourceLineNo">724</span>      boolean override) {<a name="line.724"></a>
+<span class="sourceLineNo">725</span>    TransitRegionStateProcedure proc;<a name="line.725"></a>
+<span class="sourceLineNo">726</span>    regionNode.lock();<a name="line.726"></a>
+<span class="sourceLineNo">727</span>    try {<a name="line.727"></a>
+<span class="sourceLineNo">728</span>      if(override &amp;&amp; regionNode.getProcedure() != null) {<a name="line.728"></a>
+<span class="sourceLineNo">729</span>        regionNode.unsetProcedure(regionNode.getProcedure());<a name="line.729"></a>
+<span class="sourceLineNo">730</span>      }<a name="line.730"></a>
+<span class="sourceLineNo">731</span>      assert regionNode.getProcedure() == null;<a name="line.731"></a>
+<span class="sourceLineNo">732</span>      proc = TransitRegionStateProcedure.unassign(getProcedureEnvironment(),<a name="line.732"></a>
+<span class="sourceLineNo">733</span>          regionNode.getRegionInfo());<a name="line.733"></a>
+<span class="sourceLineNo">734</span>      regionNode.setProcedure(proc);<a name="line.734"></a>
+<span class="sourceLineNo">735</span>    } finally {<a name="line.735"></a>
+<span class="sourceLineNo">736</span>      regionNode.unlock();<a name="line.736"></a>
+<span class="sourceLineNo">737</span>    }<a name="line.737"></a>
+<span class="sourceLineNo">738</span>    return proc;<a name="line.738"></a>
+<span class="sourceLineNo">739</span>  }<a name="line.739"></a>
+<span class="sourceLineNo">740</span><a name="line.740"></a>
+<span class="sourceLineNo">741</span>  /**<a name="line.741"></a>
+<span class="sourceLineNo">742</span>   * Create one TransitRegionStateProcedure to assign a region w/o specifying a target server.<a name="line.742"></a>
+<span class="sourceLineNo">743</span>   * This method is specified for HBCK2<a name="line.743"></a>
+<span class="sourceLineNo">744</span>   */<a name="line.744"></a>
+<span class="sourceLineNo">745</span>  public TransitRegionStateProcedure createOneAssignProcedure(RegionInfo hri, boolean override) {<a name="line.745"></a>
+<span class="sourceLineNo">746</span>    RegionStateNode regionNode = regionStates.getOrCreateRegionStateNode(hri);<a name="line.746"></a>
+<span class="sourceLineNo">747</span>    return createAssignProcedure(regionNode, null, override);<a name="line.747"></a>
+<span class="sourceLineNo">748</span>  }<a name="line.748"></a>
+<span class="sourceLineNo">749</span><a name="line.749"></a>
+<span class="sourceLineNo">750</span>  /**<a name="line.750"></a>
+<span class="sourceLineNo">751</span>   * Create one TransitRegionStateProcedure to unassign a region.<a name="line.751"></a>
+<span class="sourceLineNo">752</span>   * This method is specified for HBCK2<a name="line.752"></a>
+<span class="sourceLineNo">753</span>   */<a name="line.753"></a>
+<span class="sourceLineNo">754</span>  public TransitRegionStateProcedure createOneUnassignProcedure(RegionInfo hri, boolean override) {<a name="line.754"></a>
+<span class="sourceLineNo">755</span>    RegionStateNode regionNode = regionStates.getOrCreateRegionStateNode(hri);<a name="line.755"></a>
+<span class="sourceLineNo">756</span>    return createUnassignProcedure(regionNode, override);<a name="line.756"></a>
+<span class="sourceLineNo">757</span>  }<a name="line.757"></a>
+<span class="sourceLineNo">758</span><a name="line.758"></a>
+<span class="sourceLineNo">759</span>  /**<a name="line.759"></a>
+<span class="sourceLineNo">760</span>   * Create an array of TransitRegionStateProcedure w/o specifying a target server.<a name="line.760"></a>
+<span class="sourceLineNo">761</span>   * &lt;p/&gt;<a name="line.761"></a>
+<span class="sourceLineNo">762</span>   * If no target server, at assign time, we will try to use the former location of the region if<a name="line.762"></a>
+<span class="sourceLineNo">763</span>   * one exists. This is how we 'retain' the old location across a server restart.<a name="line.763"></a>
+<span class="sourceLineNo">764</span>   * &lt;p/&gt;<a name="line.764"></a>
+<span class="sourceLineNo">765</span>   * Should only be called when you can make sure that no one can touch these regions other than<a name="line.765"></a>
+<span class="sourceLineNo">766</span>   * you. For example, when you are creating table.<a name="line.766"></a>
+<span class="sourceLineNo">767</span>   */<a name="line.767"></a>
+<span class="sourceLineNo">768</span>  public TransitRegionStateProcedure[] createAssignProcedures(List&lt;RegionInfo&gt; hris) {<a name="line.768"></a>
+<span class="sourceLineNo">769</span>    return hris.stream().map(hri -&gt; regionStates.getOrCreateRegionStateNode(hri))<a name="line.769"></a>
+<span class="sourceLineNo">770</span>        .map(regionNode -&gt; createAssignProcedure(regionNode, null, false))<a name="line.770"></a>
+<span class="sourceLineNo">771</span>        .sorted(AssignmentManager::compare).toArray(TransitRegionStateProcedure[]::new);<a name="line.771"></a>
+<span class="sourceLineNo">772</span>  }<a name="line.772"></a>
+<span class="sourceLineNo">773</span><a name="line.773"></a>
+<span class="sourceLineNo">774</span>  /**<a name="line.774"></a>
+<span class="sourceLineNo">775</span>   * @param assignments Map of assignments from which we produce an array of AssignProcedures.<a name="line.775"></a>
+<span class="sourceLineNo">776</span>   * @return Assignments made from the passed in &lt;code&gt;assignments&lt;/code&gt;<a name="line.776"></a>
+<span class="sourceLineNo">777</span>   */<a name="line.777"></a>
+<span class="sourceLineNo">778</span>  private TransitRegionStateProcedure[] createAssignProcedures(<a name="line.778"></a>
+<span class="sourceLineNo">779</span>      Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments) {<a name="line.779"></a>
+<span class="sourceLineNo">780</span>    return assignments.entrySet().stream()<a name="line.780"></a>
+<span class="sourceLineNo">781</span>      .flatMap(e -&gt; e.getValue().stream().map(hri -&gt; regionStates.getOrCreateRegionStateNode(hri))<a name="line.781"></a>
+<span class="sourceLineNo">782</span>        .map(regionNode -&gt; createAssignProcedure(regionNode, e.getKey(), false)))<a name="line.782"></a>
+<span class="sourceLineNo">783</span>      .sorted(AssignmentManager::compare).toArray(TransitRegionStateProcedure[]::new);<a name="line.783"></a>
+<span class="sourceLineNo">784</span>  }<a name="line.784"></a>
+<span class="sourceLineNo">785</span><a name="line.785"></a>
+<span class="sourceLineNo">786</span>  /**<a name="line.786"></a>
+<span class="sourceLineNo">787</span>   * Called by DisableTableProcedure to unassign all the regions for a table.<a name="line.787"></a>
+<span class="sourceLineNo">788</span>   */<a name="line.788"></a>
+<span class="sourceLineNo">789</span>  public TransitRegionStateProcedure[] createUnassignProceduresForDisabling(TableName tableName) {<a name="line.789"></a>
+<span class="sourceLineNo">790</span>    return regionStates.getTableRegionStateNodes(tableName).stream().map(regionNode -&gt; {<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      regionNode.lock();<a name="line.791"></a>
+<span class="sourceLineNo">792</span>      try {<a name="line.792"></a>
+<span class="sourceLineNo">793</span>        if (!regionStates.include(regionNode, false) ||<a name="line.793"></a>
+<span class="sourceLineNo">794</span>          regionStates.isRegionOffline(regionNode.getRegionInfo())) {<a name="line.794"></a>
+<span class="sourceLineNo">795</span>          return null;<a name="line.795"></a>
+<span class="sourceLineNo">796</span>        }<a name="line.796"></a>
+<span class="sourceLineNo">797</span>        // As in DisableTableProcedure, we will hold the xlock for table, so we can make sure that<a name="line.797"></a>
+<span class="sourceLineNo">798</span>        // this procedure has not been executed yet, as TRSP will hold the shared lock for table all<a name="line.798"></a>
+<span class="sourceLineNo">799</span>        // the time. So here we will unset it and when it is actually executed, it will find that<a name="line.799"></a>
+<span class="sourceLineNo">800</span>        // the attach procedure is not itself and quit immediately.<a name="line.800"></a>
+<span class="sourceLineNo">801</span>        if (regionNode.getProcedure() != null) {<a name="line.801"></a>
+<span class="sourceLineNo">802</span>          regionNode.unsetProcedure(regionNode.getProcedure());<a name="line.802"></a>
+<span class="sourceLineNo">803</span>        }<a name="line.803"></a>
+<span class="sourceLineNo">804</span>        TransitRegionStateProcedure proc = TransitRegionStateProcedure<a name="line.804"></a>
+<span class="sourceLineNo">805</span>          .unassign(getProcedureEnvironment(), regionNode.getRegionInfo());<a name="line.805"></a>
+<span class="sourceLineNo">806</span>        regionNode.setProcedure(proc);<a name="line.806"></a>
+<span class="sourceLineNo">807</span>        return proc;<a name="line.807"></a>
+<span class="sourceLineNo">808</span>      } finally {<a name="line.808"></a>
+<span class="sourceLineNo">809</span>        regionNode.unlock();<a name="line.809"></a>
+<span class="sourceLineNo">810</span>      }<a name="line.810"></a>
+<span class="sourceLineNo">811</span>    }).filter(p -&gt; p != null).toArray(TransitRegionStateProcedure[]::new);<a name="line.811"></a>
+<span class="sourceLineNo">812</span>  }<a name="line.812"></a>
+<span class="sourceLineNo">813</span><a name="line.813"></a>
+<span class="sourceLineNo">814</span>  public SplitTableRegionProcedure createSplitProcedure(final RegionInfo regionToSplit,<a name="line.814"></a>
+<span class="sourceLineNo">815</span>      final byte[] splitKey) throws IOException {<a name="line.815"></a>
+<span class="sourceLineNo">816</span>    return new SplitTableRegionProcedure(getProcedureEnvironment(), regionToSplit, splitKey);<a name="line.816"></a>
+<span class="sourceLineNo">817</span>  }<a name="line.817"></a>
+<span class="sourceLineNo">818</span><a name="line.818"></a>
+<span class="sourceLineNo">819</span>  public MergeTableRegionsProcedure createMergeProcedure(final RegionInfo regionToMergeA,<a name="line.819"></a>
+<span class="sourceLineNo">820</span>      final RegionInfo regionToMergeB) throws IOException {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>    return new MergeTableRegionsProcedure(getProcedureEnvironment(), regionToMergeA,regionToMergeB);<a name="line.821"></a>
+<span class="sourceLineNo">822</span>  }<a name="line.822"></a>
+<span class="sourceLineNo">823</span><a name="line.823"></a>
+<span class="sourceLineNo">824</span>  /**<a name="line.824"></a>
+<span class="sourceLineNo">825</span>   * Delete the region states. This is called by "DeleteTable"<a name="line.825"></a>
+<span class="sourceLineNo">826</span>   */<a name="line.826"></a>
+<span class="sourceLineNo">827</span>  public void deleteTable(final TableName tableName) throws IOException {<a name="line.827"></a>
+<span class="sourceLineNo">828</span>    final ArrayList&lt;RegionInfo&gt; regions = regionStates.getTableRegionsInfo(tableName);<a name="line.828"></a>
+<span class="sourceLineNo">829</span>    regionStateStore.deleteRegions(regions);<a name="line.829"></a>
+<span class="sourceLineNo">830</span>    for (int i = 0; i &lt; regions.size(); ++i) {<a name="line.830"></a>
+<span class="sourceLineNo">831</span>      final RegionInfo regionInfo = regions.get(i);<a name="line.831"></a>
+<span class="sourceLineNo">832</span>      // we expect the region to be offline<a name="line.832"></a>
+<span class="sourceLineNo">833</span>      regionStates.removeFromOfflineRegions(regionInfo);<a name="line.833"></a>
+<span class="sourceLineNo">834</span>      regionStates.deleteRegion(regionInfo);<a name="line.834"></a>
+<span class="sourceLineNo">835</span>    }<a name="line.835"></a>
+<span class="sourceLineNo">836</span>  }<a name="line.836"></a>
+<span class="sourceLineNo">837</span><a name="line.837"></a>
+<span class="sourceLineNo">838</span>  // ============================================================================================<a name="line.838"></a>
+<span class="sourceLineNo">839</span>  //  RS Region Transition Report helpers<a name="line.839"></a>
+<span class="sourceLineNo">840</span>  // ============================================================================================<a name="line.840"></a>
+<span class="sourceLineNo">841</span>  private void reportRegionStateTransition(ReportRegionStateTransitionResponse.Builder builder,<a name="line.841"></a>
+<span class="sourceLineNo">842</span>      ServerName serverName, List&lt;RegionStateTransition&gt; transitionList) throws IOException {<a name="line.842"></a>
+<span class="sourceLineNo">843</span>    for (RegionStateTransition transition : transitionList) {<a name="line.843"></a>
+<span class="sourceLineNo">844</span>      switch (transition.getTransitionCode()) {<a name="line.844"></a>
+<span class="sourceLineNo">845</span>        case OPENED:<a name="line.845"></a>
+<span class="sourceLineNo">846</span>        case FAILED_OPEN:<a name="line.846"></a>
+<span class="sourceLineNo">847</span>        case CLOSED:<a name="line.847"></a>
+<span class="sourceLineNo">848</span>          assert transition.getRegionInfoCount() == 1 : transition;<a name="line.848"></a>
+<span class="sourceLineNo">849</span>          final RegionInfo hri = ProtobufUtil.toRegionInfo(transition.getRegionInfo(0));<a name="line.849"></a>
+<span class="sourceLineNo">850</span>          long procId =<a name="line.850"></a>
+<span class="sourceLineNo">851</span>            transition.getProcIdCount() &gt; 0 ? transition.getProcId(0) : Procedure.NO_PROC_ID;<a name="line.851"></a>
+<span class="sourceLineNo">852</span>          updateRegionTransition(serverName, transition.getTransitionCode(), hri,<a name="line.852"></a>
+<span class="sourceLineNo">853</span>            transition.hasOpenSeqNum() ? transition.getOpenSeqNum() : HConstants.NO_SEQNUM, procId);<a name="line.853"></a>
+<span class="sourceLineNo">854</span>          break;<a name="line.854"></a>
+<span class="sourceLineNo">855</span>        case READY_TO_SPLIT:<a name="line.855"></a>
+<span class="sourceLineNo">856</span>        case SPLIT:<a name="line.856"></a>
+<span class="sourceLineNo">857</span>        case SPLIT_REVERTED:<a name="line.857"></a>
+<span class="sourceLineNo">858</span>          assert transition.getRegionInfoCount() == 3 : transition;<a name="line.858"></a>
+<span class="sourceLineNo">859</span>          final RegionInfo parent = ProtobufUtil.toRegionInfo(transition.getRegionInfo(0));<a name="line.859"></a>
+<span class="sourceLineNo">860</span>          final RegionInfo splitA = ProtobufUtil.toRegionInfo(transition.getRegionInfo(1));<a name="line.860"></a>
+<span class="sourceLineNo">861</span>          final RegionInfo splitB = ProtobufUtil.toRegionInfo(transition.getRegionInfo(2));<a name="line.861"></a>
+<span class="sourceLineNo">862</span>          updateRegionSplitTransition(serverName, transition.getTransitionCode(), parent, splitA,<a name="line.862"></a>
+<span class="sourceLineNo">863</span>            splitB);<a name="line.863"></a>
+<span class="sourceLineNo">864</span>          break;<a name="line.864"></a>
+<span class="sourceLineNo">865</span>        case READY_TO_MERGE:<a name="line.865"></a>
+<span class="sourceLineNo">866</span>        case MERGED:<a name="line.866"></a>
+<span class="sourceLineNo">867</span>        case MERGE_REVERTED:<a name="line.867"></a>
+<span class="sourceLineNo">868</span>          assert transition.getRegionInfoCount() == 3 : transition;<a name="line.868"></a>
+<span class="sourceLineNo">869</span>          final RegionInfo merged = ProtobufUtil.toRegionInfo(transition.getRegionInfo(0));<a name="line.869"></a>
+<span class="sourceLineNo">870</span>          final RegionInfo mergeA = ProtobufUtil.toRegionInfo(transition.getRegionInfo(1));<a name="line.870"></a>
+<span class="sourceLineNo">871</span>          final RegionInfo mergeB = ProtobufUtil.toRegionInfo(transition.getRegionInfo(2));<a name="line.871"></a>
+<span class="sourceLineNo">872</span>          updateRegionMergeTransition(serverName, transition.getTransitionCode(), merged, mergeA,<a name="line.872"></a>
+<span class="sourceLineNo">873</span>            mergeB);<a name="line.873"></a>
+<span class="sourceLineNo">874</span>          break;<a name="line.874"></a>
+<span class="sourceLineNo">875</span>      }<a name="line.875"></a>
+<span class="sourceLineNo">876</span>    }<a name="line.876"></a>
+<span class="sourceLineNo">877</span>  }<a name="line.877"></a>
+<span class="sourceLineNo">878</span><a name="line.878"></a>
+<span class="sourceLineNo">879</span>  public ReportRegionStateTransitionResponse reportRegionStateTransition(<a name="line.879"></a>
+<span class="sourceLineNo">880</span>      final ReportRegionStateTransitionRequest req) throws PleaseHoldException {<a name="line.880"></a>
+<span class="sourceLineNo">881</span>    ReportRegionStateTransitionResponse.Builder builder =<a name="line.881"></a>
+<span class="sourceLineNo">882</span>        ReportRegionStateTransitionResponse.newBuilder();<a name="line.882"></a>
+<span class="sourceLineNo">883</span>    ServerName serverName = ProtobufUtil.toServerName(req.getServer());<a name="line.883"></a>
+<span class="sourceLineNo">884</span>    ServerStateNode serverNode = regionStates.getOrCreateServer(serverName);<a name="line.884"></a>
+<span class="sourceLineNo">885</span>    // here we have to acquire a read lock instead of a simple exclusive lock. This is because that<a name="line.885"></a>
+<span class="sourceLineNo">886</span>    // we should not block other reportRegionStateTransition call from the same region server. This<a name="line.886"></a>
+<span class="sourceLineNo">887</span>    // is not only about performance, but also to prevent dead lock. Think of the meta region is<a name="line.887"></a>
+<span class="sourceLineNo">888</span>    // also on the same region server and you hold the lock which blocks the<a name="line.888"></a>
+<span class="sourceLineNo">889</span>    // reportRegionStateTransition for meta, and since meta is not online, you will block inside the<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    // lock protection to wait for meta online...<a name="line.890"></a>
+<span class="sourceLineNo">891</span>    serverNode.readLock().lock();<a name="line.891"></a>
+<span class="sourceLineNo">892</span>    try {<a name="line.892"></a>
+<span class="sourceLineNo">893</span>      // we only accept reportRegionStateTransition if the region server is online, see the comment<a name="line.893"></a>
+<span class="sourceLineNo">894</span>      // above in submitServerCrash method and HBASE-21508 for more details.<a name="line.894"></a>
+<span class="sourceLineNo">895</span>      if (serverNode.isInState(ServerState.ONLINE)) {<a name="line.895"></a>
+<span class="sourceLineNo">896</span>        try {<a name="line.896"></a>
+<span class="sourceLineNo">897</span>          reportRegionStateTransition(builder, serverName, req.getTransitionList());<a name="line.897"></a>
+<span class="sourceLineNo">898</span>        } catch (PleaseHoldException e) {<a name="line.898"></a>
+<span class="sourceLineNo">899</span>          LOG.trace("Failed transition ", e);<a name="line.899"></a>
+<span class="sourceLineNo">900</span>          throw e;<a name="line.900"></a>
+<span class="sourceLineNo">901</span>        } catch (UnsupportedOperationException | IOException e) {<a name="line.901"></a>
+<span class="sourceLineNo">902</span>          // TODO: at the moment we have a single error message and the RS will abort<a name="line.902"></a>
+<span class="sourceLineNo">903</span>          // if the master says that one of the region transitions failed.<a name="line.903"></a>
+<span class="sourceLineNo">904</span>          LOG.warn("Failed transition", e);<a name="line.904"></a>
+<span class="sourceLineNo">905</span>          builder.setErrorMessage("Failed transition " + e.getMessage());<a name="line.905"></a>
+<span class="sourceLineNo">906</span>        }<a name="line.906"></a>
+<span class="sourceLineNo">907</span>      } else {<a name="line.907"></a>
+<span class="sourceLineNo">908</span>        LOG.warn("The region server {} is already dead, skip reportRegionStateTransition call",<a name="line.908"></a>
+<span class="sourceLineNo">909</span>          serverName);<a name="line.909"></a>
+<span class="sourceLineNo">910</span>        builder.setErrorMessage("You are dead");<a name="line.910"></a>
+<span class="sourceLineNo">911</span>      }<a name="line.911"></a>
+<span class="sourceLineNo">912</span>    } finally {<a name="line.912"></a>
+<span class="sourceLineNo">913</span>      serverNode.readLock().unlock();<a name="line.913"></a>
+<span class="sourceLineNo">914</span>    }<a name="line.914"></a>
+<span class="sourceLineNo">915</span><a name="line.915"></a>
+<span class="sourceLineNo">916</span>    return builder.build();<a name="line.916"></a>
+<span class="sourceLineNo">917</span>  }<a name="line.917"></a>
+<span class="sourceLineNo">918</span><a name="line.918"></a>
+<span class="sourceLineNo">919</span>  private void updateRegionTransition(ServerName serverName, TransitionCode state,<a name="line.919"></a>
+<span class="sourceLineNo">920</span>      RegionInfo regionInfo, long seqId, long procId) throws IOException {<a name="line.920"></a>
+<span class="sourceLineNo">921</span>    checkMetaLoaded(regionInfo);<a name="line.921"></a>
+<span class="sourceLineNo">922</span><a name="line.922"></a>
+<span class="sourceLineNo">923</span>    RegionStateNode regionNode = regionStates.getRegionStateNode(regionInfo);<a name="line.923"></a>
+<span class="sourceLineNo">924</span>    if (regionNode == null) {<a name="line.924"></a>
+<span class="sourceLineNo">925</span>      // the table/region is gone. maybe a delete, split, merge<a name="line.925"></a>
+<span class="sourceLineNo">926</span>      throw new UnexpectedStateException(String.format(<a name="line.926"></a>
+<span class="sourceLineNo">927</span>        "Server %s was trying to transition region %s to %s. but the region was removed.",<a name="line.927"></a>
+<span class="sourceLineNo">928</span>        serverName, regionInfo, state));<a name="line.928"></a>
+<span class="sourceLineNo">929</span>    }<a name="line.929"></a>
+<span class="sourceLineNo">930</span>    LOG.trace("Update region transition serverName={} region={} regionState={}", serverName,<a name="line.930"></a>
+<span class="sourceLineNo">931</span>      regionNode, state);<a name="line.931"></a>
+<span class="sourceLineNo">932</span><a name="line.932"></a>
+<span class="sourceLineNo">933</span>    ServerStateNode serverNode = regionStates.getOrCreateServer(serverName);<a name="line.933"></a>
+<span class="sourceLineNo">934</span>    regionNode.lock();<a name="line.934"></a>
+<span class="sourceLineNo">935</span>    try {<a name="line.935"></a>
+<span class="sourceLineNo">936</span>      if (!reportTransition(regionNode, serverNode, state, seqId, procId)) {<a name="line.936"></a>
+<span class="sourceLineNo">937</span>        // Don't log WARN if shutting down cluster; during shutdown. Avoid the below messages:<a name="line.937"></a>
+<span class="sourceLineNo">938</span>        // 2018-08-13 10:45:10,551 WARN ...AssignmentManager: No matching procedure found for<a name="line.938"></a>
+<span class="sourceLineNo">939</span>        // rit=OPEN, location=ve0538.halxg.cloudera.com,16020,1533493000958,<a name="line.939"></a>
+<span class="sourceLineNo">940</span>        // table=IntegrationTestBigLinkedList, region=65ab289e2fc1530df65f6c3d7cde7aa5 transition<a name="line.940"></a>
+<span class="sourceLineNo">941</span>        // to CLOSED<a name="line.941"></a>
+<span class="sourceLineNo">942</span>        // These happen because on cluster shutdown, we currently let the RegionServers close<a name="line.942"></a>
+<span class="sourceLineNo">943</span>        // regions. This is the only time that region close is not run by the Master (so cluster<a name="line.943"></a>
+<span class="sourceLineNo">944</span>        // goes down fast). Consider changing it so Master runs all shutdowns.<a name="line.944"></a>
+<span class="sourceLineNo">945</span>        if (this.master.getServerManager().isClusterShutdown() &amp;&amp;<a name="line.945"></a>
+<span class="sourceLineNo">946</span>          state.equals(TransitionCode.CLOSED)) {<a name="line.946"></a>
+<span class="sourceLineNo">947</span>          LOG.info("RegionServer {} {}", state, regionNode.getRegionInfo().getEncodedName());<a name="line.947"></a>
+<span class="sourceLineNo">948</span>        } else {<a name="line.948"></a>
+<span class="sourceLineNo">949</span>          LOG.warn("No matching procedure found for {} transition to {}", regionNode, state);<a name="line.949"></a>
+<span class="sourceLineNo">950</span>        }<a name="line.950"></a>
+<span class="sourceLineNo">951</span>      }<a name="line.951"></a>
+<span class="sourceLineNo">952</span>    } finally {<a name="line.952"></a>
+<span class="sourceLineNo">953</span>      regionNode.unlock();<a name="line.953"></a>
+<span class="sourceLineNo">954</span>    }<a name="line.954"></a>
+<span class="sourceLineNo">955</span>  }<a name="line.955"></a>
+<span class="sourceLineNo">956</span><a name="line.956"></a>
+<span class="sourceLineNo">957</span>  private boolean reportTransition(RegionStateNode regionNode, ServerStateNode serverNode,<a name="line.957"></a>
+<span class="sourceLineNo">958</span>      TransitionCode state, long seqId, long procId) throws IOException {<a name="line.958"></a>
+<span class="sourceLineNo">959</span>    ServerName serverName = serverNode.getServerName();<a name="line.959"></a>
+<span class="sourceLineNo">960</span>    TransitRegionStateProcedure proc = regionNode.getProcedure();<a name="line.960"></a>
+<span class="sourceLineNo">961</span>    if (proc == null) {<a name="line.961"></a>
+<span class="sourceLineNo">962</span>      return false;<a name="line.962"></a>
+<span class="sourceLineNo">963</span>    }<a name="line.963"></a>
+<span class="sourceLineNo">964</span>    proc.reportTransition(master.getMasterProcedureExecutor().getEnvironment(), regionNode,<a name="line.964"></a>
+<span class="sourceLineNo">965</span>      serverName, state, seqId, procId);<a name="line.965"></a>
+<span class="sourceLineNo">966</span>    return true;<a name="line.966"></a>
+<span class="sourceLineNo">967</span>  }<a name="line.967"></a>
+<span class="sourceLineNo">968</span><a name="line.968"></a>
+<span class="sourceLineNo">969</span>  private void updateRegionSplitTransition(final ServerName serverName, final TransitionCode state,<a name="line.969"></a>
+<span class="sourceLineNo">970</span>      final RegionInfo parent, final RegionInfo hriA, final RegionInfo hriB)<a name="line.970"></a>
+<span class="sourceLineNo">971</span>      throws IOException {<a name="line.971"></a>
+<span class="sourceLineNo">972</span>    checkMetaLoaded(parent);<a name="line.972"></a>
+<span class="sourceLineNo">973</span><a name="line.973"></a>
+<span class="sourceLineNo">974</span>    if (state != TransitionCode.READY_TO_SPLIT) {<a name="line.974"></a>
+<span class="sourceLineNo">975</span>      throw new UnexpectedStateException("unsupported split regionState=" + state +<a name="line.975"></a>
+<span class="sourceLineNo">976</span>        " for parent region " + parent +<a name="line.976"></a>
+<span class="sourceLineNo">977</span>        " maybe an old RS (&lt; 2.0) had the operation in progress");<a name="line.977"></a>
+<span class="sourceLineNo">978</span>    }<a name="line.978"></a>
+<span class="sourceLineNo">979</span><a name="line.979"></a>
+<span class="sourceLineNo">980</span>    // sanity check on the request<a name="line.980"></a>
+<span class="sourceLineNo">981</span>    if (!Bytes.equals(hriA.getEndKey(), hriB.getStartKey())) {<a name="line.981"></a>
+<span class="sourceLineNo">982</span>      throw new UnsupportedOperationException(<a name="line.982"></a>
+<span class="sourceLineNo">983</span>        "unsupported split request with bad keys: parent=" + parent +<a name="line.983"></a>
+<span class="sourceLineNo">984</span>        " hriA=" + hriA + " hriB=" + hriB);<a name="line.984"></a>
+<span class="sourceLineNo">985</span>    }<a name="line.985"></a>
+<span class="sourceLineNo">986</span><a name="line.986"></a>
+<span class="sourceLineNo">987</span>    // Submit the Split procedure<a name="line.987"></a>
+<span class="sourceLineNo">988</span>    final byte[] splitKey = hriB.getStartKey();<a name="line.988"></a>
+<span class="sourceLineNo">989</span>    if (LOG.isDebugEnabled()) {<a name="line.989"></a>
+<span class="sourceLineNo">990</span>      LOG.debug("Split request from " + serverName +<a name="line.990"></a>
+<span class="sourceLineNo">991</span>          ", parent=" + parent + " splitKey=" + Bytes.toStringBinary(splitKey));<a name="line.991"></a>
+<span class="sourceLineNo">992</span>    }<a name="line.992"></a>
+<span class="sourceLineNo">993</span>    master.getMasterProcedureExecutor().submitProcedure(createSplitProcedure(parent, splitKey));<a name="line.993"></a>
+<span class="sourceLineNo">994</span><a name="line.994"></a>
+<span class="sourceLineNo">995</span>    // If the RS is &lt; 2.0 throw an exception to abort the operation, we are handling the split<a name="line.995"></a>
+<span class="sourceLineNo">996</span>    if (master.getServerManager().getVersionNumber(serverName) &lt; 0x0200000) {<a name="line.996"></a>
+<span class="sourceLineNo">997</span>      throw new UnsupportedOperationException(String.format(<a name="line.997"></a>
+<span class="sourceLineNo">998</span>        "Split handled by the master: parent=%s hriA=%s hriB=%s", parent.getShortNameToLog(), hriA, hriB));<a name="line.998"></a>
+<span class="sourceLineNo">999</span>    }<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>  }<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span><a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>  private void updateRegionMergeTransition(final ServerName serverName, final TransitionCode state,<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>      final RegionInfo merged, final RegionInfo hriA, final RegionInfo hriB) throws IOException {<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>    checkMetaLoaded(merged);<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span><a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>    if (state != TransitionCode.READY_TO_MERGE) {<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>      throw new UnexpectedStateException("Unsupported merge regionState=" + state +<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>        " for regionA=" + hriA + " regionB=" + hriB + " merged=" + merged +<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>        " maybe an old RS (&lt; 2.0) had the operation in progress");<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>    }<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span><a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>    // Submit the Merge procedure<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>    if (LOG.isDebugEnabled()) {<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>      LOG.debug("Handling merge request from RS=" + merged + ", merged=" + merged);<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>    }<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>    master.getMasterProcedureExecutor().submitProcedure(createMergeProcedure(hriA, hriB));<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span><a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>    // If the RS is &lt; 2.0 throw an exception to abort the operation, we are handling the merge<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>    if (master.getServerManager().getVersionNumber(serverName) &lt; 0x0200000) {<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>      throw new UnsupportedOperationException(String.format(<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>        "Merge not handled yet: regionState=%s merged=%s hriA=%s hriB=%s", state, merged, hriA,<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>          hriB));<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>    }<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>  }<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span><a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>  // ============================================================================================<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>  //  RS Status update (report online regions) helpers<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>  // ============================================================================================<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>  /**<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>   * The master will call this method when the RS send the regionServerReport(). The report will<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>   * contains the "online regions". This method will check the the online regions against the<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>   * in-memory state of the AM, and we will log a warn message if there is a mismatch. This is<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>   * because that there is no fencing between the reportRegionStateTransition method and<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>   * regionServerReport method, so there could be race and introduce inconsistency here, but<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>   * actually there is no problem.<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>   * &lt;p/&gt;<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>   * Please see HBASE-21421 and HBASE-21463 for more details.<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>   */<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>  public void reportOnlineRegions(ServerName serverName, Set&lt;byte[]&gt; regionNames) {<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>    if (!isRunning()) {<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>      return;<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>    }<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>    if (LOG.isTraceEnabled()) {<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>      LOG.trace("ReportOnlineRegions {} regionCount={}, metaLoaded={} {}", serverName,<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>        regionNames.size(), isMetaLoaded(),<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>        regionNames.stream().map(Bytes::toStringBinary).collect(Collectors.toList()));<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>    }<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span><a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>    ServerStateNode serverNode = regionStates.getOrCreateServer(serverName);<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span><a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>    synchronized (serverNode) {<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>      if (!serverNode.isInState(ServerState.ONLINE)) {<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>        LOG.warn("Got a report from a server result in state " + serverNode.getState());<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>        return;<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>      }<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    }<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>    if (regionNames.isEmpty()) {<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>      // nothing to do if we don't have regions<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>      LOG.trace("no online region found on {}", serverName);<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>      return;<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>    }<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    if (!isMetaLoaded()) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>      // we are still on startup, skip checking<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      return;<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>    }<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>    // The Heartbeat tells us of what regions are on the region serve, check the state.<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>    checkOnlineRegionsReport(serverNode, regionNames);<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>  }<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span><a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>  // just check and output possible inconsistency, without actually doing anything<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>  private void checkOnlineRegionsReport(ServerStateNode serverNode, Set&lt;byte[]&gt; regionNames) {<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>    ServerName serverName = serverNode.getServerName();<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>    for (byte[] regionName : regionNames) {<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>      if (!isRunning()) {<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>        return;<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>      }<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      RegionStateNode regionNode = regionStates.getRegionStateNodeFromName(regionName);<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>      if (regionNode == null) {<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>        LOG.warn("No region state node for {}, it should already be on {}",<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>          Bytes.toStringBinary(regionName), serverName);<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>        continue;<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>      }<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>      regionNode.lock();<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      try {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>        long diff = EnvironmentEdgeManager.currentTime() - regionNode.getLastUpdate();<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>        if (regionNode.isInState(State.OPENING, State.OPEN)) {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>          // This is possible as a region server has just closed a region but the region server<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>          // report is generated before the closing, but arrive after the closing. Make sure there<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>          // is some elapsed time so less false alarms.<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>          if (!regionNode.getRegionLocation().equals(serverName) &amp;&amp; diff &gt; 1000) {<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>            LOG.warn("{} reported OPEN on server={} but state has otherwise", regionNode,<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>              serverName);<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>          }<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>        } else if (!regionNode.isInState(State.CLOSING, State.SPLITTING)) {<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>          // So, we can get report that a region is CLOSED or SPLIT because a heartbeat<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>          // came in at about same time as a region transition. Make sure there is some<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>          // elapsed time so less false alarms.<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>          if (diff &gt; 1000) {<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>            LOG.warn("{} reported an unexpected OPEN on {}; time since last update={}ms",<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>              regionNode, serverName, diff);<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>          }<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>        }<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      } finally {<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>        regionNode.unlock();<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>      }<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>    }<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>  }<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span><a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>  // ============================================================================================<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>  //  RIT chore<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>  // ============================================================================================<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>  private static class RegionInTransitionChore extends ProcedureInMemoryChore&lt;MasterProcedureEnv&gt; {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>    public RegionInTransitionChore(final int timeoutMsec) {<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>      super(timeoutMsec);<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>    }<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span><a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>    @Override<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>    protected void periodicExecute(final MasterProcedureEnv env) {<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>      final AssignmentManager am = env.getAssignmentManager();<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span><a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>      final RegionInTransitionStat ritStat = am.computeRegionInTransitionStat();<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      if (ritStat.hasRegionsOverThreshold()) {<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>        for (RegionState hri: ritStat.getRegionOverThreshold()) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>          am.handleRegionOverStuckWarningThreshold(hri.getRegion());<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>        }<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>      }<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span><a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>      // update metrics<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>      am.updateRegionsInTransitionMetrics(ritStat);<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>    }<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>  }<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span><a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>  public RegionInTransitionStat computeRegionInTransitionStat() {<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>    final RegionInTransitionStat rit = new RegionInTransitionStat(getConfiguration());<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>    rit.update(this);<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>    return rit;<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>  }<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span><a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>  public static class RegionInTransitionStat {<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    private final int ritThreshold;<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span><a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>    private HashMap&lt;String, RegionState&gt; ritsOverThreshold = null;<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    private long statTimestamp;<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>    private long oldestRITTime = 0;<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>    private int totalRITsTwiceThreshold = 0;<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>    private int totalRITs = 0;<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span><a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>    @VisibleForTesting<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    public RegionInTransitionStat(final Configuration conf) {<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>      this.ritThreshold =<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>        conf.getInt(METRICS_RIT_STUCK_WARNING_THRESHOLD, DEFAULT_RIT_STUCK_WARNING_THRESHOLD);<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    }<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span><a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>    public int getRITThreshold() {<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>      return ritThreshold;<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    }<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span><a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    public long getTimestamp() {<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>      return statTimestamp;<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    }<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span><a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>    public int getTotalRITs() {<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>      return totalRITs;<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>    }<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span><a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>    public long getOldestRITTime() {<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>      return oldestRITTime;<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>    }<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span><a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>    public int getTotalRITsOverThreshold() {<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>      Map&lt;String, RegionState&gt; m = this.ritsOverThreshold;<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>      return m != null ? m.size() : 0;<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>    }<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span><a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>    public boolean hasRegionsTwiceOverThreshold() {<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>      return totalRITsTwiceThreshold &gt; 0;<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>    }<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span><a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>    public boolean hasRegionsOverThreshold() {<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>      Map&lt;String, RegionState&gt; m = this.ritsOverThreshold;<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>      return m != null &amp;&amp; !m.isEmpty();<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>    }<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span><a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>    public Collection&lt;RegionState&gt; getRegionOverThreshold() {<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>      Map&lt;String, RegionState&gt; m = this.ritsOverThreshold;<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>      return m != null? m.values(): Collections.emptySet();<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>    }<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span><a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>    public boolean isRegionOverThreshold(final RegionInfo regionInfo) {<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>      Map&lt;String, RegionState&gt; m = this.ritsOverThreshold;<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>      return m != null &amp;&amp; m.containsKey(regionInfo.getEncodedName());<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>    }<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span><a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>    public boolean isRegionTwiceOverThreshold(final RegionInfo regionInfo) {<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>      Map&lt;String, RegionState&gt; m = this.ritsOverThreshold;<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>      if (m == null) return false;<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>      final RegionState state = m.get(regionInfo.getEncodedName());<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>      if (state == null) return false;<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>      return (statTimestamp - state.getStamp()) &gt; (ritThreshold * 2);<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>    }<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span><a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>    protected void update(final AssignmentManager am) {<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>      final RegionStates regionStates = am.getRegionStates();<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      this.statTimestamp = EnvironmentEdgeManager.currentTime();<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>      update(regionStates.getRegionsStateInTransition(), statTimestamp);<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>      update(regionStates.getRegionFailedOpen(), statTimestamp);<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>    }<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span><a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>    private void update(final Collection&lt;RegionState&gt; regions, final long currentTime) {<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>      for (RegionState state: regions) {<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>        totalRITs++;<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>        final long ritStartedMs = state.getStamp();<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>        if (ritStartedMs == 0) {<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>          // Don't output bogus values to metrics if they accidentally make it here.<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>          LOG.warn("The RIT {} has no start time", state.getRegion());<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>          continue;<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>        }<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>        final long ritTime = currentTime - ritStartedMs;<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>        if (ritTime &gt; ritThreshold) {<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>          if (ritsOverThreshold == null) {<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>            ritsOverThreshold = new HashMap&lt;String, RegionState&gt;();<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>          }<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>          ritsOverThreshold.put(state.getRegion().getEncodedName(), state);<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>          totalRITsTwiceThreshold += (ritTime &gt; (ritThreshold * 2)) ? 1 : 0;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>        }<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>        if (oldestRITTime &lt; ritTime) {<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>          oldestRITTime = ritTime;<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>        }<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><a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>  private void updateRegionsInTransitionMetrics(final RegionInTransitionStat ritStat) {<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>    metrics.updateRITOldestAge(ritStat.getOldestRITTime());<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>    metrics.updateRITCount(ritStat.getTotalRITs());<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>    metrics.updateRITCountOverThreshold(ritStat.getTotalRITsOverThreshold());<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>  }<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span><a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>  private void handleRegionOverStuckWarningThreshold(final RegionInfo regionInfo) {<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>    final RegionStateNode regionNode = regionStates.getRegionStateNode(regionInfo);<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>    //if (regionNode.isStuck()) {<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>    LOG.warn("STUCK Region-In-Transition {}", regionNode);<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>  }<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span><a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>  // ============================================================================================<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>  //  TODO: Master load/bootstrap<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>  // ============================================================================================<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>  public void joinCluster() throws IOException {<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>    long startTime = System.nanoTime();<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>    LOG.debug("Joining cluster...");<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span><a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>    // Scan hbase:meta to build list of existing regions, servers, and assignment.<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>    // hbase:meta is online now or will be. Inside loadMeta, we keep trying. Can't make progress<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>    // w/o  meta.<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>    loadMeta();<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span><a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>    while (master.getServerManager().countOfRegionServers() &lt; 1) {<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>      LOG.info("Waiting for RegionServers to join; current count={}",<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>        master.getServerManager().countOfRegionServers());<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>      Threads.sleep(250);<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>    }<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>    LOG.info("Number of RegionServers={}", master.getServerManager().countOfRegionServers());<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span><a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>    // Start the RIT chore<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>    master.getMasterProcedureExecutor().addChore(this.ritChore);<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span><a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>    long costMs = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startTime);<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>    LOG.info("Joined the cluster in {}", StringUtils.humanTimeDiff(costMs));<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>   * Create assign procedure for offline regions.<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>   * Just follow the old processofflineServersWithOnlineRegions method. Since now we do not need to<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>   * deal with dead server any more, we only deal with the regions in OFFLINE state in this method.<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>   * And this is a bit strange, that for new regions, we will add it in CLOSED state instead of<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>   * OFFLINE state, and usually there will be a procedure to track them. The<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>   * processofflineServersWithOnlineRegions is a legacy from long ago, as things are going really<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>   * different now, maybe we do not need this method any more. Need to revisit later.<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>   */<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>  // Public so can be run by the Master as part of the startup. Needs hbase:meta to be online.<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>  // Needs to be done after the table state manager has been started.<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>  public void processOfflineRegions() {<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>    List&lt;RegionInfo&gt; offlineRegions = regionStates.getRegionStates().stream()<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>      .filter(RegionState::isOffline).filter(s -&gt; isTableEnabled(s.getRegion().getTable()))<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>      .map(RegionState::getRegion).collect(Collectors.toList());<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>    if (!offlineRegions.isEmpty()) {<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>      master.getMasterProcedureExecutor().submitProcedures(<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>        master.getAssignmentManager().createRoundRobinAssignProcedures(offlineRegions));<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    }<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>  }<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span><a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>  private void loadMeta() throws IOException {<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>    // TODO: use a thread pool<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    regionStateStore.visitMeta(new RegionStateStore.RegionStateVisitor() {<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      @Override<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>      public void visitRegionState(Result result, final RegionInfo regionInfo, final State state,<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>          final ServerName regionLocation, final ServerName lastHost, final long openSeqNum) {<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>        if (state == null &amp;&amp; regionLocation == null &amp;&amp; lastHost == null &amp;&amp;<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>            openSeqNum == SequenceId.NO_SEQUENCE_ID) {<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>          // This is a row with nothing in it.<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>          LOG.warn("Skipping empty row={}", result);<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>          return;<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>        }<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>        State localState = state;<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>        if (localState == null) {<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>          // No region state column data in hbase:meta table! Are I doing a rolling upgrade from<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>          // hbase1 to hbase2? Am I restoring a SNAPSHOT or otherwise adding a region to hbase:meta?<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>          // In any of these cases, state is empty. For now, presume OFFLINE but there are probably<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>          // cases where we need to probe more to be sure this correct; TODO informed by experience.<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>          LOG.info(regionInfo.getEncodedName() + " regionState=null; presuming " + State.OFFLINE);<a name="line.1310"></a>
 <span class="sourceLineNo">1311</span>          localState = State.OFFLINE;<a name="line.1311"></a>
 <span class="sourceLineNo">1312</span>        }<a name="line.1312"></a>
 <span class="sourceLineNo">1313</span>        RegionStateNode regionNode = regionStates.getOrCreateRegionStateNode(regionInfo);<a name="line.1313"></a>
@@ -1336,599 +1336,620 @@
 <span class="sourceLineNo">1328</span>        } else if (localState == State.OFFLINE || regionInfo.isOffline()) {<a name="line.1328"></a>
 <span class="sourceLineNo">1329</span>          regionStates.addToOfflineRegions(regionNode);<a name="line.1329"></a>
 <span class="sourceLineNo">1330</span>        }<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      }<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>    });<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span><a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>    // every assignment is blocked until meta is loaded.<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    wakeMetaLoadedEvent();<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>   * Used to check if the meta loading is done.<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>   * &lt;p/&gt;<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>   * if not we throw PleaseHoldException since we are rebuilding the RegionStates<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>   * @param hri region to check if it is already rebuild<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>   * @throws PleaseHoldException if meta has not been loaded yet<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>   */<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>  private void checkMetaLoaded(RegionInfo hri) throws PleaseHoldException {<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    if (!isRunning()) {<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      throw new PleaseHoldException("AssignmentManager not running");<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>    }<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>    boolean meta = isMetaRegion(hri);<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>    boolean metaLoaded = isMetaLoaded();<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>    if (!meta &amp;&amp; !metaLoaded) {<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>      throw new PleaseHoldException(<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>        "Master not fully online; hbase:meta=" + meta + ", metaLoaded=" + metaLoaded);<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>    }<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>  }<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span><a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>  // ============================================================================================<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>  //  TODO: Metrics<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>  // ============================================================================================<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>  public int getNumRegionsOpened() {<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>    // TODO: Used by TestRegionPlacement.java and assume monotonically increasing value<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>    return 0;<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>  }<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span><a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>  public long submitServerCrash(ServerName serverName, boolean shouldSplitWal) {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>    boolean carryingMeta;<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>    long pid;<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>    ServerStateNode serverNode = regionStates.getServerNode(serverName);<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>    if(serverNode == null){<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>      LOG.info("Skip to add SCP for {} since this server should be OFFLINE already", serverName);<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      return -1;<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>    }<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    // we hold the write lock here for fencing on reportRegionStateTransition. Once we set the<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>    // server state to CRASHED, we will no longer accept the reportRegionStateTransition call from<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    // this server. This is used to simplify the implementation for TRSP and SCP, where we can make<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>    // sure that, the region list fetched by SCP will not be changed any more.<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    serverNode.writeLock().lock();<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>    try {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>      ProcedureExecutor&lt;MasterProcedureEnv&gt; procExec = this.master.getMasterProcedureExecutor();<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      carryingMeta = isCarryingMeta(serverName);<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>      if (!serverNode.isInState(ServerState.ONLINE)) {<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>        LOG.info(<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>          "Skip to add SCP for {} with meta= {}, " +<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>              "since there should be a SCP is processing or already done for this server node",<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>          serverName, carryingMeta);<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>        return -1;<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>      } else {<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>        serverNode.setState(ServerState.CRASHED);<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>        pid = procExec.submitProcedure(new ServerCrashProcedure(procExec.getEnvironment(),<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>            serverName, shouldSplitWal, carryingMeta));<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>        LOG.info(<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>          "Added {} to dead servers which carryingMeta={}, submitted ServerCrashProcedure pid={}",<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>          serverName, carryingMeta, pid);<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>      }<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>    } finally {<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      serverNode.writeLock().unlock();<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>    }<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>    return pid;<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>  }<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span><a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>  public void offlineRegion(final RegionInfo regionInfo) {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>    // TODO used by MasterRpcServices<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>    RegionStateNode node = regionStates.getRegionStateNode(regionInfo);<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    if (node != null) {<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>      node.offline();<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    }<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>  public void onlineRegion(final RegionInfo regionInfo, final ServerName serverName) {<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>    // TODO used by TestSplitTransactionOnCluster.java<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>  }<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span><a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; getSnapShotOfAssignment(<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>      final Collection&lt;RegionInfo&gt; regions) {<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>    return regionStates.getSnapShotOfAssignment(regions);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>  }<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>  //  TODO: UTILS/HELPERS?<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>   * Used by the client (via master) to identify if all regions have the schema updates<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>   *<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>   * @param tableName<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>   * @return Pair indicating the status of the alter command (pending/total)<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>   * @throws IOException<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>   */<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>  public Pair&lt;Integer, Integer&gt; getReopenStatus(TableName tableName) {<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>    if (isTableDisabled(tableName)) return new Pair&lt;Integer, Integer&gt;(0, 0);<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span><a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>    final List&lt;RegionState&gt; states = regionStates.getTableRegionStates(tableName);<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>    int ritCount = 0;<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>    for (RegionState regionState: states) {<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>      if (!regionState.isOpened() &amp;&amp; !regionState.isSplit()) {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>        ritCount++;<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>      }<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>    }<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    return new Pair&lt;Integer, Integer&gt;(ritCount, states.size());<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>  }<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>  //  TODO: Region State In Transition<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>  // ============================================================================================<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>  public boolean hasRegionsInTransition() {<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>    return regionStates.hasRegionsInTransition();<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>  public List&lt;RegionStateNode&gt; getRegionsInTransition() {<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>    return regionStates.getRegionsInTransition();<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>  public List&lt;RegionInfo&gt; getAssignedRegions() {<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    return regionStates.getAssignedRegions();<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>  }<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span><a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>  public RegionInfo getRegionInfo(final byte[] regionName) {<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>    final RegionStateNode regionState = regionStates.getRegionStateNodeFromName(regionName);<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>    return regionState != null ? regionState.getRegionInfo() : null;<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>  }<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span><a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>  // ============================================================================================<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>  //  Expected states on region state transition.<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>  //  Notice that there is expected states for transiting to OPENING state, this is because SCP.<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>  //  See the comments in regionOpening method for more details.<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>  // ============================================================================================<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>  private static final State[] STATES_EXPECTED_ON_OPEN = {<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>    State.OPENING, // Normal case<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>    State.OPEN // Retrying<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>  };<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span><a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>  private static final State[] STATES_EXPECTED_ON_CLOSING = {<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>    State.OPEN, // Normal case<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>    State.CLOSING, // Retrying<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>    State.SPLITTING, // Offline the split parent<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>    State.MERGING // Offline the merge parents<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>  private static final State[] STATES_EXPECTED_ON_CLOSED = {<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>    State.CLOSING, // Normal case<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>    State.CLOSED // Retrying<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>  };<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span><a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>  // This is for manually scheduled region assign, can add other states later if we find out other<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>  // usages<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>  private static final State[] STATES_EXPECTED_ON_ASSIGN = { State.CLOSED, State.OFFLINE };<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span><a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>  // We only allow unassign or move a region which is in OPEN state.<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>  private static final State[] STATES_EXPECTED_ON_UNASSIGN_OR_MOVE = { State.OPEN };<a name="line.1488"></a>
+<span class="sourceLineNo">1331</span>        if (regionNode.getProcedure() != null) {<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>          regionNode.getProcedure().stateLoaded(AssignmentManager.this, regionNode);<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>        }<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>      }<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>    // every assignment is blocked until meta is loaded.<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>    wakeMetaLoadedEvent();<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>  }<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span><a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>  /**<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>   * Used to check if the meta loading is done.<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>   * &lt;p/&gt;<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>   * if not we throw PleaseHoldException since we are rebuilding the RegionStates<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>   * @param hri region to check if it is already rebuild<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>   * @throws PleaseHoldException if meta has not been loaded yet<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>   */<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>  private void checkMetaLoaded(RegionInfo hri) throws PleaseHoldException {<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>    if (!isRunning()) {<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>      throw new PleaseHoldException("AssignmentManager not running");<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>    }<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    boolean meta = isMetaRegion(hri);<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>    boolean metaLoaded = isMetaLoaded();<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>    if (!meta &amp;&amp; !metaLoaded) {<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>      throw new PleaseHoldException(<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>        "Master not fully online; hbase:meta=" + meta + ", metaLoaded=" + metaLoaded);<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>    }<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>  }<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span><a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>  // ============================================================================================<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>  //  TODO: Metrics<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>  // ============================================================================================<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>  public int getNumRegionsOpened() {<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>    // TODO: Used by TestRegionPlacement.java and assume monotonically increasing value<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    return 0;<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>  }<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span><a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>  public long submitServerCrash(ServerName serverName, boolean shouldSplitWal) {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>    boolean carryingMeta;<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    long pid;<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>    ServerStateNode serverNode = regionStates.getServerNode(serverName);<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>    if(serverNode == null){<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>      LOG.info("Skip to add SCP for {} since this server should be OFFLINE already", serverName);<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>      return -1;<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>    }<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    // we hold the write lock here for fencing on reportRegionStateTransition. Once we set the<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>    // server state to CRASHED, we will no longer accept the reportRegionStateTransition call from<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    // this server. This is used to simplify the implementation for TRSP and SCP, where we can make<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>    // sure that, the region list fetched by SCP will not be changed any more.<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>    serverNode.writeLock().lock();<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>    try {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      ProcedureExecutor&lt;MasterProcedureEnv&gt; procExec = this.master.getMasterProcedureExecutor();<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>      carryingMeta = isCarryingMeta(serverName);<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>      if (!serverNode.isInState(ServerState.ONLINE)) {<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>        LOG.info(<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>          "Skip to add SCP for {} with meta= {}, " +<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>              "since there should be a SCP is processing or already done for this server node",<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>          serverName, carryingMeta);<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>        return -1;<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>      } else {<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>        serverNode.setState(ServerState.CRASHED);<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>        pid = procExec.submitProcedure(new ServerCrashProcedure(procExec.getEnvironment(),<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>            serverName, shouldSplitWal, carryingMeta));<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>        LOG.info(<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>          "Added {} to dead servers which carryingMeta={}, submitted ServerCrashProcedure pid={}",<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>          serverName, carryingMeta, pid);<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>      }<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span>    } finally {<a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>      serverNode.writeLock().unlock();<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>    }<a name="line.1400"></a>
+<span class="sourceLineNo">1401</span>    return pid;<a name="line.1401"></a>
+<span class="sourceLineNo">1402</span>  }<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span><a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>  public void offlineRegion(final RegionInfo regionInfo) {<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>    // TODO used by MasterRpcServices<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>    RegionStateNode node = regionStates.getRegionStateNode(regionInfo);<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>    if (node != null) {<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>      node.offline();<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>    }<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>  }<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span><a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>  public void onlineRegion(final RegionInfo regionInfo, final ServerName serverName) {<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>    // TODO used by TestSplitTransactionOnCluster.java<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>  }<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span><a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; getSnapShotOfAssignment(<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span>      final Collection&lt;RegionInfo&gt; regions) {<a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>    return regionStates.getSnapShotOfAssignment(regions);<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>  }<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>  //  TODO: UTILS/HELPERS?<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>   * Used by the client (via master) to identify if all regions have the schema updates<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>   *<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>   * @param tableName<a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>   * @return Pair indicating the status of the alter command (pending/total)<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>   * @throws IOException<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span>   */<a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>  public Pair&lt;Integer, Integer&gt; getReopenStatus(TableName tableName) {<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>    if (isTableDisabled(tableName)) return new Pair&lt;Integer, Integer&gt;(0, 0);<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span><a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>    final List&lt;RegionState&gt; states = regionStates.getTableRegionStates(tableName);<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>    int ritCount = 0;<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span>    for (RegionState regionState: states) {<a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>      if (!regionState.isOpened() &amp;&amp; !regionState.isSplit()) {<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>        ritCount++;<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>      }<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>    }<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>    return new Pair&lt;Integer, Integer&gt;(ritCount, states.size());<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>  }<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span><a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>  // ============================================================================================<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>  //  TODO: Region State In Transition<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span>  // ============================================================================================<a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>  public boolean hasRegionsInTransition() {<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>    return regionStates.hasRegionsInTransition();<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>  }<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span><a name="line.1450"></a>
+<span class="sourceLineNo">1451</span>  public List&lt;RegionStateNode&gt; getRegionsInTransition() {<a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>    return regionStates.getRegionsInTransition();<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>  }<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span><a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>  public List&lt;RegionInfo&gt; getAssignedRegions() {<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>    return regionStates.getAssignedRegions();<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>  public RegionInfo getRegionInfo(final byte[] regionName) {<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>    final RegionStateNode regionState = regionStates.getRegionStateNodeFromName(regionName);<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>    return regionState != null ? regionState.getRegionInfo() : null;<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>  // ============================================================================================<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span>  //  Expected states on region state transition.<a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>  //  Notice that there is expected states for transiting to OPENING state, this is because SCP.<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>  //  See the comments in regionOpening method for more details.<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>  // ============================================================================================<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>  private static final State[] STATES_EXPECTED_ON_OPEN = {<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>    State.OPENING, // Normal case<a name="line.1470"></a>
+<span class="sourceLineNo">1471</span>    State.OPEN // Retrying<a name="line.1471"></a>
+<span class="sourceLineNo">1472</span>  };<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span><a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>  private static final State[] STATES_EXPECTED_ON_CLOSING = {<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span>    State.OPEN, // Normal case<a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>    State.CLOSING, // Retrying<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>    State.SPLITTING, // Offline the split parent<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>    State.MERGING // Offline the merge parents<a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>  };<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span><a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>  private static final State[] STATES_EXPECTED_ON_CLOSED = {<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>    State.CLOSING, // Normal case<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>    State.CLOSED // Retrying<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>  };<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span><a name="line.1485"></a>
+<span class="sourceLineNo">1486</span>  // This is for manually scheduled region assign, can add other states later if we find out other<a name="line.1486"></a>
+<span class="sourceLineNo">1487</span>  // usages<a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>  private static final State[] STATES_EXPECTED_ON_ASSIGN = { State.CLOSED, State.OFFLINE };<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>  //  Region Status update<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>  //  Should only be called in TransitRegionStateProcedure<a name="line.1492"></a>
+<span class="sourceLineNo">1490</span>  // We only allow unassign or move a region which is in OPEN state.<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>  private static final State[] STATES_EXPECTED_ON_UNASSIGN_OR_MOVE = { State.OPEN };<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span><a name="line.1492"></a>
 <span class="sourceLineNo">1493</span>  // ============================================================================================<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>  private void transitStateAndUpdate(RegionStateNode regionNode, RegionState.State newState,<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>      RegionState.State... expectedStates) throws IOException {<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>    RegionState.State state = regionNode.getState();<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>    regionNode.transitionState(newState, expectedStates);<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>    boolean succ = false;<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>    try {<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>      regionStateStore.updateRegionLocation(regionNode);<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>      succ = true;<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>    } finally {<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>      if (!succ) {<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span>        // revert<a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>        regionNode.setState(state);<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>  }<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span><a name="line.1509"></a>
-<span class="sourceLineNo">1510</span>  // should be called within the synchronized block of RegionStateNode<a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>  void regionOpening(RegionStateNode regionNode) throws IOException {<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>    // As in SCP, for performance reason, there is no TRSP attached with this region, we will not<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>    // update the region state, which means that the region could be in any state when we want to<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>    // assign it after a RS crash. So here we do not pass the expectedStates parameter.<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>    transitStateAndUpdate(regionNode, State.OPENING);<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>    regionStates.addRegionToServer(regionNode);<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>    // update the operation count metrics<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>    metrics.incrementOperationCounter();<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>  }<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span><a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>  // should be called within the synchronized block of RegionStateNode.<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span>  // The parameter 'giveUp' means whether we will try to open the region again, if it is true, then<a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>  // we will persist the FAILED_OPEN state into hbase:meta.<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>  void regionFailedOpen(RegionStateNode regionNode, boolean giveUp) throws IOException {<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>    RegionState.State state = regionNode.getState();<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>    ServerName regionLocation = regionNode.getRegionLocation();<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>    if (giveUp) {<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>      regionNode.setState(State.FAILED_OPEN);<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>      regionNode.setRegionLocation(null);<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>      boolean succ = false;<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span>      try {<a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>        regionStateStore.updateRegionLocation(regionNode);<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>        succ = true;<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>      } finally {<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span>        if (!succ) {<a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>          // revert<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>          regionNode.setState(state);<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>          regionNode.setRegionLocation(regionLocation);<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>        }<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>      }<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>    }<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>    if (regionLocation != null) {<a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>      regionStates.removeRegionFromServer(regionLocation, regionNode);<a name="line.1543"></a>
-<span class="sourceLineNo">1544</span>    }<a name="line.1544"></a>
-<span class="sourceLineNo">1545</span>  }<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span><a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>  // should be called within the synchronized block of RegionStateNode<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span>  void regionOpened(RegionStateNode regionNode) throws IOException {<a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>    // TODO: OPENING Updates hbase:meta too... we need to do both here and there?<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>    // That is a lot of hbase:meta writing.<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>    transitStateAndUpdate(regionNode, State.OPEN, STATES_EXPECTED_ON_OPEN);<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>    RegionInfo hri = regionNode.getRegionInfo();<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>    if (isMetaRegion(hri)) {<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>      // Usually we'd set a table ENABLED at this stage but hbase:meta is ALWAYs enabled, it<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>      // can't be disabled -- so skip the RPC (besides... enabled is managed by TableStateManager<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>      // which is backed by hbase:meta... Avoid setting ENABLED to avoid having to update state<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>      // on table that contains state.<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span>      setMetaAssigned(hri, true);<a name="line.1558"></a>
+<span class="sourceLineNo">1494</span>  // Region Status update<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>  // Should only be called in TransitRegionStateProcedure(and related procedures), as the locking<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span>  // and pre-assumptions are very tricky.<a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>  // ============================================================================================<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>  private void transitStateAndUpdate(RegionStateNode regionNode, RegionState.State newState,<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>      RegionState.State... expectedStates) throws IOException {<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>    RegionState.State state = regionNode.getState();<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span>    regionNode.transitionState(newState, expectedStates);<a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>    boolean succ = false;<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span>    try {<a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>      regionStateStore.updateRegionLocation(regionNode);<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>      succ = true;<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span>    } finally {<a name="line.1506"></a>
+<span class="sourceLineNo">1507</span>      if (!succ) {<a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>        // revert<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span>        regionNode.setState(state);<a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>      }<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>    }<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>  }<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span><a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>  // should be called within the synchronized block of RegionStateNode<a name="line.1514"></a>
+<span class="sourceLineNo">1515</span>  void regionOpening(RegionStateNode regionNode) throws IOException {<a name="line.1515"></a>
+<span class="sourceLineNo">1516</span>    // As in SCP, for performance reason, there is no TRSP attached with this region, we will not<a name="line.1516"></a>
+<span class="sourceLineNo">1517</span>    // update the region state, which means that the region could be in any state when we want to<a name="line.1517"></a>
+<span class="sourceLineNo">1518</span>    // assign it after a RS crash. So here we do not pass the expectedStates parameter.<a name="line.1518"></a>
+<span class="sourceLineNo">1519</span>    transitStateAndUpdate(regionNode, State.OPENING);<a name="line.1519"></a>
+<span class="sourceLineNo">1520</span>    regionStates.addRegionToServer(regionNode);<a name="line.1520"></a>
+<span class="sourceLineNo">1521</span>    // update the operation count metrics<a name="line.1521"></a>
+<span class="sourceLineNo">1522</span>    metrics.incrementOperationCounter();<a name="line.1522"></a>
+<span class="sourceLineNo">1523</span>  }<a name="line.1523"></a>
+<span class="sourceLineNo">1524</span><a name="line.1524"></a>
+<span class="sourceLineNo">1525</span>  // should be called under the RegionStateNode lock<a name="line.1525"></a>
+<span class="sourceLineNo">1526</span>  // The parameter 'giveUp' means whether we will try to open the region again, if it is true, then<a name="line.1526"></a>
+<span class="sourceLineNo">1527</span>  // we will persist the FAILED_OPEN state into hbase:meta.<a name="line.1527"></a>
+<span class="sourceLineNo">1528</span>  void regionFailedOpen(RegionStateNode regionNode, boolean giveUp) throws IOException {<a name="line.1528"></a>
+<span class="sourceLineNo">1529</span>    RegionState.State state = regionNode.getState();<a name="line.1529"></a>
+<span class="sourceLineNo">1530</span>    ServerName regionLocation = regionNode.getRegionLocation();<a name="line.1530"></a>
+<span class="sourceLineNo">1531</span>    if (giveUp) {<a name="line.1531"></a>
+<span class="sourceLineNo">1532</span>      regionNode.setState(State.FAILED_OPEN);<a name="line.1532"></a>
+<span class="sourceLineNo">1533</span>      regionNode.setRegionLocation(null);<a name="line.1533"></a>
+<span class="sourceLineNo">1534</span>      boolean succ = false;<a name="line.1534"></a>
+<span class="sourceLineNo">1535</span>      try {<a name="line.1535"></a>
+<span class="sourceLineNo">1536</span>        regionStateStore.updateRegionLocation(regionNode);<a name="line.1536"></a>
+<span class="sourceLineNo">1537</span>        succ = true;<a name="line.1537"></a>
+<span class="sourceLineNo">1538</span>      } finally {<a name="line.1538"></a>
+<span class="sourceLineNo">1539</span>        if (!succ) {<a name="line.1539"></a>
+<span class="sourceLineNo">1540</span>          // revert<a name="line.1540"></a>
+<span class="sourceLineNo">1541</span>          regionNode.setState(state);<a name="line.1541"></a>
+<span class="sourceLineNo">1542</span>          regionNode.setRegionLocation(regionLocation);<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>    }<a name="line.1545"></a>
+<span class="sourceLineNo">1546</span>    if (regionLocation != null) {<a name="line.1546"></a>
+<span class="sourceLineNo">1547</span>      regionStates.removeRegionFromServer(regionLocation, regionNode);<a name="line.1547"></a>
+<span class="sourceLineNo">1548</span>    }<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 under the RegionStateNode lock<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>    regionStates.removeFromFailedOpen(hri);<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>  }<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span><a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>  // should be called within the synchronized block of RegionStateNode<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>  void regionClosing(RegionStateNode regionNode) throws IOException {<a name="line.1565"></a>
-<span class="sourceLineNo">1566</span>    transitStateAndUpdate(regionNode, State.CLOSING, STATES_EXPECTED_ON_CLOSING);<a name="line.1566"></a>
-<span class="sourceLineNo">1567</span><a name="line.1567"></a>
-<span class="sourceLineNo">1568</span>    RegionInfo hri = regionNode.getRegionInfo();<a name="line.1568"></a>
-<span class="sourceLineNo">1569</span>    // Set meta has not initialized early. so people trying to create/edit tables will wait<a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>    if (isMetaRegion(hri)) {<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>      setMetaAssigned(hri, false);<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>    }<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>    regionStates.addRegionToServer(regionNode);<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span>    // update the operation count metrics<a name="line.1574"></a>
-<span class="sourceLineNo">1575</span>    metrics.incrementOperationCounter();<a name="line.1575"></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>  // for open and close, they will first be persist to the procedure store in<a name="line.1565"></a>
+<span class="sourceLineNo">1566</span>  // RegionRemoteProcedureBase. So here we will first change the in memory state as it is considered<a name="line.1566"></a>
+<span class="sourceLineNo">1567</span>  // as succeeded if the persistence to procedure store is succeeded, and then when the<a name="line.1567"></a>
+<span class="sourceLineNo">1568</span>  // RegionRemoteProcedureBase is woken up, we will persist the RegionStateNode to hbase:meta.<a name="line.1568"></a>
+<span class="sourceLineNo">1569</span><a name="line.1569"></a>
+<span class="sourceLineNo">1570</span>  // should be called under the RegionStateNode lock<a name="line.1570"></a>
+<span class="sourceLineNo">1571</span>  void regionOpenedWithoutPersistingToMeta(RegionStateNode regionNode) throws IOException {<a name="line.1571"></a>
+<span class="sourceLineNo">1572</span>    regionNode.transitionState(State.OPEN, STATES_EXPECTED_ON_OPEN);<a name="line.1572"></a>
+<span class="sourceLineNo">1573</span>    RegionInfo regionInfo = regionNode.getRegionInfo();<a name="line.1573"></a>
+<span class="sourceLineNo">1574</span>    regionStates.addRegionToServer(regionNode);<a name="line.1574"></a>
+<span class="sourceLineNo">1575</span>    regionStates.removeFromFailedOpen(regionInfo);<a name="line.1575"></a>
 <span class="sourceLineNo">1576</span>  }<a name="line.1576"></a>
 <span class="sourceLineNo">1577</span><a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>  // should be called within the synchronized block of RegionStateNode<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>  // The parameter 'normally' means whether we are closed cleanly, if it is true, then it means that<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>  // we are closed due to a RS crash.<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span>  void regionClosed(RegionStateNode regionNode, boolean normally) throws IOException {<a name="line.1581"></a>
-<span class="sourceLineNo">1582</span>    RegionState.State state = regionNode.getState();<a name="line.1582"></a>
-<span class="sourceLineNo">1583</span>    ServerName regionLocation = regionNode.getRegionLocation();<a name="line.1583"></a>
-<span class="sourceLineNo">1584</span>    if (normally) {<a name="line.1584"></a>
-<span class="sourceLineNo">1585</span>      regionNode.transitionState(State.CLOSED, STATES_EXPECTED_ON_CLOSED);<a name="line.1585"></a>
-<span class="sourceLineNo">1586</span>    } else {<a name="line.1586"></a>
-<span class="sourceLineNo">1587</span>      // For SCP<a name="line.1587"></a>
-<span class="sourceLineNo">1588</span>      regionNode.transitionState(State.ABNORMALLY_CLOSED);<a name="line.1588"></a>
-<span class="sourceLineNo">1589</span>    }<a name="line.1589"></a>
-<span class="sourceLineNo">1590</span>    regionNode.setRegionLocation(null);<a name="line.1590"></a>
-<span class="sourceLineNo">1591</span>    boolean succ = false;<a name="line.1591"></a>
-<span class="sourceLineNo">1592</span>    try {<a name="line.1592"></a>
-<span class="sourceLineNo">1593</span>      regionStateStore.updateRegionLocation(regionNode);<a name="line.1593"></a>
-<span class="sourceLineNo">1594</span>      succ = true;<a name="line.1594"></a>
-<span class="sourceLineNo">1595</span>    } finally {<a name="line.1595"></a>
-<span class="sourceLineNo">1596</span>      if (!succ) {<a name="line.1596"></a>
-<span class="sourceLineNo">1597</span>        // revert<a name="line.1597"></a>
-<span class="sourceLineNo">1598</span>        regionNode.setState(state);<a name="line.1598"></a>
-<span class="sourceLineNo">1599</span>        regionNode.setRegionLocation(regionLocation);<a name="line.1599"></a>
-<span class="sourceLineNo">1600</span>      }<a name="line.1600"></a>
-<span class="sourceLineNo">1601</span>    }<a name="line.1601"></a>
-<span class="sourceLineNo">1602</span>    if (regionLocation != null) {<a name="line.1602"></a>
-<span class="sourceLineNo">1603</span>      regionNode.setLastHost(regionLocation);<a name="line.1603"></a>
-<span class="sourceLineNo">1604</span>      regionStates.removeRegionFromServer(regionLocation, regionNode);<a name="line.1604"></a>
-<span class="sourceLineNo">1605</span>    }<a name="line.1605"></a>
-<span class="sourceLineNo">1606</span>  }<a name="line.1606"></a>
-<span class="sourceLineNo">1607</span><a name="line.1607"></a>
-<span class="sourceLineNo">1608</span>  public void markRegionAsSplit(final RegionInfo parent, final ServerName serverName,<a name="line.1608"></a>
-<span class="sourceLineNo">1609</span>      final RegionInfo daughterA, final RegionInfo daughterB) throws IOException {<a name="line.1609"></a>
-<span class="sourceLineNo">1610</span>    // Update hbase:meta. Parent will be marked offline and split up in hbase:meta.<a name="line.1610"></a>
-<span class="sourceLineNo">1611</span>    // The parent stays in regionStates until cleared when removed by CatalogJanitor.<a name="line.1611"></a>
-<span class="sourceLineNo">1612</span>    // Update its state in regionStates to it shows as offline and split when read<a name="line.1612"></a>
-<span class="sourceLineNo">1613</span>    // later figuring what regions are in a table and what are not: see<a name="line.1613"></a>
-<span class="sourceLineNo">1614</span>    // regionStates#getRegionsOfTable<a name="line.1614"></a>
-<span class="sourceLineNo">1615</span>    final RegionStateNode node = regionStates.getOrCreateRegionStateNode(parent);<a name="line.1615"></a>
-<span class="sourceLineNo">1616</span>    node.setState(State.SPLIT);<a name="line.1616"></a>
-<span class="sourceLineNo">1617</span>    final RegionStateNode nodeA = regionStates.getOrCreateRegionStateNode(daughterA);<a name="line.1617"></a>
-<span class="sourceLineNo">1618</span>    nodeA.setState(State.SPLITTING_NEW);<a name="line.1618"></a>
-<span class="sourceLineNo">1619</span>    final RegionStateNode nodeB = regionStates.getOrCreateRegionStateNode(daughterB);<a name="line.1619"></a>
-<span class="sourceLineNo">1620</span>    nodeB.setState(State.SPLITTING_NEW);<a name="line.1620"></a>
-<span class="sourceLineNo">1621</span><a name="line.1621"></a>
-<span class="sourceLineNo">1622</span>    regionStateStore.splitRegion(parent, daughterA, daughterB, serverName);<a name="line.1622"></a>
-<span class="sourceLineNo">1623</span>    if (shouldAssignFavoredNodes(parent)) {<a name="line.1623"></a>
-<span class="sourceLineNo">1624</span>      List&lt;ServerName&gt; onlineServers = this.master.getServerManager().getOnlineServersList();<a name="line.1624"></a>
-<span class="sourceLineNo">1625</span>      ((FavoredNodesPromoter)getBalancer()).<a name="line.1625"></a>
-<span class="sourceLineNo">1626</span>          generateFavoredNodesForDaughter(onlineServers, parent, daughterA, daughterB);<a name="line.1626"></a>
-<span class="sourceLineNo">1627</span>    }<a name="line.1627"></a>
-<span class="sourceLineNo">1628</span>  }<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>   * When called here, the merge has happened. The two merged regions have been<a name="line.1631"></a>
-<span class="sourceLineNo">1632</span>   * unassigned and the above markRegionClosed has been called on each so they have been<a name="line.1632"></a>
-<span class="sourceLineNo">1633</span>   * disassociated from a hosting Server. The merged region will be open after this call. The<a name="line.1633"></a>
-<span class="sourceLineNo">1634</span>   * merged regions are removed from hbase:meta below&gt; Later they are deleted from the filesystem<a name="line.1634"></a>
-<span class="sourceLineNo">1635</span>   * by the catalog janitor running against hbase:meta. It notices when the merged region no<a name="line.1635"></a>
-<span class="sourceLineNo">1636</span>   * longer holds references to the old regions.<a name="line.1636"></a>
-<span class="sourceLineNo">1637</span>   */<a name="line.1637"></a>
-<span class="sourceLineNo">1638</span>  public void markRegionAsMerged(final RegionInfo child, final ServerName serverName,<a name="line.1638"></a>
-<span class="sourceLineNo">1639</span>      final RegionInfo mother, final RegionInfo father) throws IOException {<a name="line.1639"></a>
-<span class="sourceLineNo">1640</span>    final RegionStateNode node = regionStates.getOrCreateRegionStateNode(child);<a name="line.1640"></a>
-<span class="sourceLineNo">1641</span>    node.setState(State.MERGED);<a name="line.1641"></a>
-<span class="sourceLineNo">1642</span>    regionStates.deleteRegion(mother);<a name="line.1642"></a>
-<span class="sourceLineNo">1643</span>    regionStates.deleteRegion(father);<a name="line.1643"></a>
-<span class="sourceLineNo">1644</span>    regionStateStore.mergeRegions(child, mother, father, serverName);<a name="line.1644"></a>
-<span class="sourceLineNo">1645</span>    if (shouldAssignFavoredNodes(child)) {<a name="line.1645"></a>
+<span class="sourceLineNo">1578</span>  // should be called under the RegionStateNode lock<a name="line.1578"></a>
+<span class="sourceLineNo">1579</span>  void regionClosedWithoutPersistingToMeta(RegionStateNode regionNode) throws IOException {<a name="line.1579"></a>
+<span class="sourceLineNo">1580</span>    ServerName regionLocation = regionNode.getRegionLocation();<a name="line.1580"></a>
+<span class="sourceLineNo">1581</span>    regionNode.transitionState(State.CLOSED, STATES_EXPECTED_ON_CLOSED);<a name="line.1581"></a>
+<span class="sourceLineNo">1582</span>    regionNode.setRegionLocation(null);<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>  // should be called under the RegionStateNode lock<a name="line.1589"></a>
+<span class="sourceLineNo">1590</span>  // for SCP<a name="line.1590"></a>
+<span class="sourceLineNo">1591</span>  void regionClosedAbnormally(RegionStateNode regionNode) throws IOException {<a name="line.1591"></a>
+<span class="sourceLineNo">1592</span>    RegionState.State state = regionNode.getState();<a name="line.1592"></a>
+<span class="sourceLineNo">1593</span>    ServerName regionLocation = regionNode.getRegionLocation();<a name="line.1593"></a>
+<span class="sourceLineNo">1594</span>    regionNode.transitionState(State.ABNORMALLY_CLOSED);<a name="line.1594"></a>
+<span class="sourceLineNo">1595</span>    regionNode.setRegionLocation(null);<a name="line.1595"></a>
+<span class="sourceLineNo">1596</span>    boolean succ = false;<a name="line.1596"></a>
+<span class="sourceLineNo">1597</span>    try {<a name="line.1597"></a>
+<span class="sourceLineNo">1598</span>      regionStateStore.updateRegionLocation(regionNode);<a name="line.1598"></a>
+<span class="sourceLineNo">1599</span>      succ = true;<a name="line.1599"></a>
+<span class="sourceLineNo">1600</span>    } finally {<a name="line.1600"></a>
+<span class="sourceLineNo">1601</span>      if (!succ) {<a name="line.1601"></a>
+<span class="sourceLineNo">1602</span>        // revert<a name="line.1602"></a>
+<span class="sourceLineNo">1603</span>        regionNode.setState(state);<a name="line.1603"></a>
+<span class="sourceLineNo">1604</span>        regionNode.setRegionLocation(regionLocation);<a name="line.1604"></a>
+<span class="sourceLineNo">1605</span>      }<a name="line.1605"></a>
+<span class="sourceLineNo">1606</span>    }<a name="line.1606"></a>
+<span class="sourceLineNo">1607</span>    if (regionLocation != null) {<a name="line.1607"></a>
+<span class="sourceLineNo">1608</span>      regionNode.setLastHost(regionLocation);<a name="line.1608"></a>
+<span class="sourceLineNo">1609</span>      regionStates.removeRegionFromServer(regionLocation, regionNode);<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><a name="line.1612"></a>
+<span class="sourceLineNo">1613</span>  void persistToMeta(RegionStateNode regionNode) throws IOException {<a name="line.1613"></a>
+<span class="sourceLineNo">1614</span>    regionStateStore.updateRegionLocation(regionNode);<a name="line.1614"></a>
+<span class="sourceLineNo">1615</span>    RegionInfo regionInfo = regionNode.getRegionInfo();<a name="line.1615"></a>
+<span class="sourceLineNo">1616</span>    if (isMetaRegion(regionInfo) &amp;&amp; regionNode.getState() == State.OPEN) {<a name="line.1616"></a>
+<span class="sourceLineNo">1617</span>      // Usually we'd set a table ENABLED at this stage but hbase:meta is ALWAYs enabled, it<a name="line.1617"></a>
+<span class="sourceLineNo">1618</span>      // can't be disabled -- so skip the RPC (besides... enabled is managed by TableStateManager<a name="line.1618"></a>
+<span class="sourceLineNo">1619</span>      // which is backed by hbase:meta... Avoid setting ENABLED to avoid having to update state<a name="line.1619"></a>
+<span class="sourceLineNo">1620</span>      // on table that contains state.<a name="line.1620"></a>
+<span class="sourceLineNo">1621</span>      setMetaAssigned(regionInfo, true);<a name="line.1621"></a>
+<span class="sourceLineNo">1622</span>    }<a name="line.1622"></a>
+<span class="sourceLineNo">1623</span>  }<a name="line.1623"></a>
+<span class="sourceLineNo">1624</span><a name="line.1624"></a>
+<span class="sourceLineNo">1625</span>  // ============================================================================================<a name="line.1625"></a>
+<span class="sourceLineNo">1626</span>  // The above methods can only be called in TransitRegionStateProcedure(and related procedures)<a name="line.1626"></a>
+<span class="sourceLineNo">1627</span>  // ============================================================================================<a name="line.1627"></a>
+<span class="sourceLineNo">1628</span><a name="line.1628"></a>
+<span class="sourceLineNo">1629</span>  public void markRegionAsSplit(final RegionInfo parent, final ServerName serverName,<a name="line.1629"></a>
+<span class="sourceLineNo">1630</span>      final RegionInfo daughterA, final RegionInfo daughterB) throws IOException {<a name="line.1630"></a>
+<span class="sourceLineNo">1631</span>    // Update hbase:meta. Parent will be marked offline and split up in hbase:meta.<a name="line.1631"></a>
+<span class="sourceLineNo">1632</span>    // The parent stays in regionStates until cleared when removed by CatalogJanitor.<a name="line.1632"></a>
+<span class="sourceLineNo">1633</span>    // Update its state in regionStates to it shows as offline and split when read<a name="line.1633"></a>
+<span class="sourceLineNo">1634</span>    // later figuring what regions are in a table and what are not: see<a name="line.1634"></a>
+<span class="sourceLineNo">1635</span>    // regionStates#getRegionsOfTable<a name="line.1635"></a>
+<span class="sourceLineNo">1636</span>    final RegionStateNode node = regionStates.getOrCreateRegionStateNode(parent);<a name="line.1636"></a>
+<span class="sourceLineNo">1637</span>    node.setState(State.SPLIT);<a name="line.1637"></a>
+<span class="sourceLineNo">1638</span>    final RegionStateNode nodeA = regionStates.getOrCreateRegionStateNode(daughterA);<a name="line.1638"></a>
+<span class="sourceLineNo">1639</span>    nodeA.setState(State.SPLITTING_NEW);<a name="line.1639"></a>
+<span class="sourceLineNo">1640</span>    final RegionStateNode nodeB = regionStates.getOrCreateRegionStateNode(daughterB);<a name="line.1640"></a>
+<span class="sourceLineNo">1641</span>    nodeB.setState(State.SPLITTING_NEW);<a name="line.1641"></a>
+<span class="sourceLineNo">1642</span><a name="line.1642"></a>
+<span class="sourceLineNo">1643</span>    regionStateStore.splitRegion(parent, daughterA, daughterB, serverName);<a name="line.1643"></a>
+<span class="sourceLineNo">1644</span>    if (shouldAssignFavoredNodes(parent)) {<a name="line.1644"></a>
+<span class="sourceLineNo">1645</span>      List&lt;ServerName&gt; onlineServers = this.master.getServerManager().getOnlineServersList();<a name="line.1645"></a>
 <span class="sourceLineNo">1646</span>      ((FavoredNodesPromoter)getBalancer()).<a name="line.1646"></a>
-<span class="sourceLineNo">1647</span>        generateFavoredNodesForMergedRegion(child, mother, father);<a name="line.1647"></a>
+<span class="sourceLineNo">1647</span>          generateFavoredNodesForDaughter(onlineServers, parent, daughterA, daughterB);<a name="line.1647"></a>
 <span class="sourceLineNo">1648</span>    }<a name="line.1648"></a>
 <span class="sourceLineNo">1649</span>  }<a name="line.1649"></a>
 <span class="sourceLineNo">1650</span><a name="line.1650"></a>
-<span class="sourceLineNo">1651</span>  /*<a name="line.1651"></a>
-<span class="sourceLineNo">1652</span>   * Favored nodes should be applied only when FavoredNodes balancer is configured and the region<a name="line.1652"></a>
-<span class="sourceLineNo">1653</span>   * belongs to a non-system table.<a name="line.1653"></a>
-<span class="sourceLineNo">1654</span>   */<a name="line.1654"></a>
-<span class="sourceLineNo">1655</span>  private boolean shouldAssignFavoredNodes(RegionInfo region) {<a name="line.1655"></a>
-<span class="sourceLineNo">1656</span>    return this.shouldAssignRegionsWithFavoredNodes &amp;&amp;<a name="line.1656"></a>
-<span class="sourceLineNo">1657</span>        FavoredNodesManager.isFavoredNodeApplicable(region);<a name="line.1657"></a>
-<span class="sourceLineNo">1658</span>  }<a name="line.1658"></a>
-<span class="sourceLineNo">1659</span><a name="line.1659"></a>
-<span class="sourceLineNo">1660</span>  // ============================================================================================<a name="line.1660"></a>
-<span class="sourceLineNo">1661</span>  //  Assign Queue (Assign/Balance)<a name="line.1661"></a>
-<span class="sourceLineNo">1662</span>  // ============================================================================================<a name="line.1662"></a>
-<span class="sourceLineNo">1663</span>  private final ArrayList&lt;RegionStateNode&gt; pendingAssignQueue = new ArrayList&lt;RegionStateNode&gt;();<a name="line.1663"></a>
-<span class="sourceLineNo">1664</span>  private final ReentrantLock assignQueueLock = new ReentrantLock();<a name="line.1664"></a>
-<span class="sourceLineNo">1665</span>  private final Condition assignQueueFullCond = assignQueueLock.newCondition();<a name="line.1665"></a>
-<span class="sourceLineNo">1666</span><a name="line.1666"></a>
-<span class="sourceLineNo">1667</span>  /**<a name="line.1667"></a>
-<span class="sourceLineNo">1668</span>   * Add the assign operation to the assignment queue.<a name="line.1668"></a>
-<span class="sourceLineNo">1669</span>   * The pending assignment operation will be processed,<a name="line.1669"></a>
-<span class="sourceLineNo">1670</span>   * and each region will be assigned by a server using the balancer.<a name="line.1670"></a>
-<span class="sourceLineNo">1671</span>   */<a name="line.1671"></a>
-<span class="sourceLineNo">1672</span>  protected void queueAssign(final RegionStateNode regionNode) {<a name="line.1672"></a>
-<span class="sourceLineNo">1673</span>    regionNode.getProcedureEvent().suspend();<a name="line.1673"></a>
-<span class="sourceLineNo">1674</span><a name="line.1674"></a>
-<span class="sourceLineNo">1675</span>    // TODO: quick-start for meta and the other sys-tables?<a name="line.1675"></a>
-<span class="sourceLineNo">1676</span>    assignQueueLock.lock();<a name="line.1676"></a>
-<span class="sourceLineNo">1677</span>    try {<a name="line.1677"></a>
-<span class="sourceLineNo">1678</span>      pendingAssignQueue.add(regionNode);<a name="line.1678"></a>
-<span class="sourceLineNo">1679</span>      if (regionNode.isSystemTable() ||<a name="line.1679"></a>
-<span class="sourceLineNo">1680</span>          pendingAssignQueue.size() == 1 ||<a name="line.1680"></a>
-<span class="sourceLineNo">1681</span>          pendingAssignQueue.size() &gt;= assignDispatchWaitQueueMaxSize) {<a name="line.1681"></a>
-<span class="sourceLineNo">1682</span>        assignQueueFullCond.signal();<a name="line.1682"></a>
-<span class="sourceLineNo">1683</span>      }<a name="line.1683"></a>
-<span class="sourceLineNo">1684</span>    } finally {<a name="line.1684"></a>
-<span class="sourceLineNo">1685</span>      assignQueueLock.unlock();<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><a name="line.1688"></a>
-<span class="sourceLineNo">1689</span>  private void startAssignmentThread() {<a name="line.1689"></a>
-<span class="sourceLineNo">1690</span>    // Get Server Thread name. Sometimes the Server is mocked so may not implement HasThread.<a name="line.1690"></a>
-<span class="sourceLineNo">1691</span>    // For example, in tests.<a name="line.1691"></a>
-<span class="sourceLineNo">1692</span>    String name = master instanceof HasThread? ((HasThread)master).getName():<a name="line.1692"></a>
-<span class="sourceLineNo">1693</span>        master.getServerName().toShortString();<a name="line.1693"></a>
-<span class="sourceLineNo">1694</span>    assignThread = new Thread(name) {<a name="line.1694"></a>
-<span class="sourceLineNo">1695</span>      @Override<a name="line.1695"></a>
-<span class="sourceLineNo">1696</span>      public void run() {<a name="line.1696"></a>
-<span class="sourceLineNo">1697</span>        while (isRunning()) {<a name="line.1697"></a>
-<span class="sourceLineNo">1698</span>          processAssignQueue();<a name="line.1698"></a>
-<span class="sourceLineNo">1699</span>        }<a name="line.1699"></a>
-<span class="sourceLineNo">1700</span>        pendingAssignQueue.clear();<a name="line.1700"></a>
-<span class="sourceLineNo">1701</span>      }<a name="line.1701"></a>
-<span class="sourceLineNo">1702</span>    };<a name="line.1702"></a>
-<span class="sourceLineNo">1703</span>    assignThread.setDaemon(true);<a name="line.1703"></a>
-<span class="sourceLineNo">1704</span>    assignThread.start();<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 stopAssignmentThread() {<a name="line.1707"></a>
-<span class="sourceLineNo">1708</span>    assignQueueSignal();<a name="line.1708"></a>
-<span class="sourceLineNo">1709</span>    try {<a name="line.1709"></a>
-<span class="sourceLineNo">1710</span>      while (assignThread.isAlive()) {<a name="line.1710"></a>
-<span class="sourceLineNo">1711</span>        assignQueueSignal();<a name="line.1711"></a>
-<span class="sourceLineNo">1712</span>        assignThread.join(250);<a name="line.1712"></a>
-<span class="sourceLineNo">1713</span>      }<a name="line.1713"></a>
-<span class="sourceLineNo">1714</span>    } catch (InterruptedException e) {<a name="line.1714"></a>
-<span class="sourceLineNo">1715</span>      LOG.warn("join interrupted", e);<a name="line.1715"></a>
-<span class="sourceLineNo">1716</span>      Thread.currentThread().interrupt();<a name="line.1716"></a>
-<span class="sourceLineNo">1717</span>    }<a name="line.1717"></a>
-<span class="sourceLineNo">1718</span>  }<a name="line.1718"></a>
-<span class="sourceLineNo">1719</span><a name="line.1719"></a>
-<span class="sourceLineNo">1720</span>  private void assignQueueSignal() {<a name="line.1720"></a>
-<span class="sourceLineNo">1721</span>    assignQueueLock.lock();<a name="line.1721"></a>
-<span class="sourceLineNo">1722</span>    try {<a name="line.1722"></a>
-<span class="sourceLineNo">1723</span>      assignQueueFullCond.signal();<a name="line.1723"></a>
-<span class="sourceLineNo">1724</span>    } finally {<a name="line.1724"></a>
-<span class="sourceLineNo">1725</span>      assignQueueLock.unlock();<a name="line.1725"></a>
-<span class="sourceLineNo">1726</span>    }<a name="line.1726"></a>
-<span class="sourceLineNo">1727</span>  }<a name="line.1727"></a>
-<span class="sourceLineNo">1728</span><a name="line.1728"></a>
-<span class="sourceLineNo">1729</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings("WA_AWAIT_NOT_IN_LOOP")<a name="line.1729"></a>
-<span class="sourceLineNo">1730</span>  private HashMap&lt;RegionInfo, RegionStateNode&gt; waitOnAssignQueue() {<a name="line.1730"></a>
-<span class="sourceLineNo">1731</span>    HashMap&lt;RegionInfo, RegionStateNode&gt; regions = null;<a name="line.1731"></a>
-<span class="sourceLineNo">1732</span><a name="line.1732"></a>
-<span class="sourceLineNo">1733</span>    assignQueueLock.lock();<a name="line.1733"></a>
-<span class="sourceLineNo">1734</span>    try {<a name="line.1734"></a>
-<span class="sourceLineNo">1735</span>      if (pendingAssignQueue.isEmpty() &amp;&amp; isRunning()) {<a name="line.1735"></a>
-<span class="sourceLineNo">1736</span>        assignQueueFullCond.await();<a name="line.1736"></a>
-<span class="sourceLineNo">1737</span>      }<a name="line.1737"></a>
-<span class="sourceLineNo">1738</span><a name="line.1738"></a>
-<span class="sourceLineNo">1739</span>      if (!isRunning()) return null;<a name="line.1739"></a>
-<span class="sourceLineNo">1740</span>      assignQueueFullCond.await(assignDispatchWaitMillis, TimeUnit.MILLISECONDS);<a name="line.1740"></a>
-<span class="sourceLineNo">1741</span>      regions = new HashMap&lt;RegionInfo, RegionStateNode&gt;(pendingAssignQueue.size());<a name="line.1741"></a>
-<span class="sourceLineNo">1742</span>      for (RegionStateNode regionNode: pendingAssignQueue) {<a name="line.1742"></a>
-<span class="sourceLineNo">1743</span>        regions.put(regionNode.getRegionInfo(), regionNode);<a name="line.1743"></a>
-<span class="sourceLineNo">1744</span>      }<a name="line.1744"></a>
-<span class="sourceLineNo">1745</span>      pendingAssignQueue.clear();<a name="line.1745"></a>
-<span class="sourceLineNo">1746</span>    } catch (InterruptedException e) {<a name="line.1746"></a>
-<span class="sourceLineNo">1747</span>      LOG.warn("got interrupted ", e);<a name="line.1747"></a>
-<span class="sourceLineNo">1748</span>      Thread.currentThread().interrupt();<a name="line.1748"></a>
-<span class="sourceLineNo">1749</span>    } finally {<a name="line.1749"></a>
-<span class="sourceLineNo">1750</span>      assignQueueLock.unlock();<a name="line.1750"></a>
-<span class="sourceLineNo">1751</span>    }<a name="line.1751"></a>
-<span class="sourceLineNo">1752</span>    return regions;<a name="line.1752"></a>
-<span class="sourceLineNo">1753</span>  }<a name="line.1753"></a>
-<span class="sourceLineNo">1754</span><a name="line.1754"></a>
-<span class="sourceLineNo">1755</span>  private void processAssignQueue() {<a name="line.1755"></a>
-<span class="sourceLineNo">1756</span>    final HashMap&lt;RegionInfo, RegionStateNode&gt; regions = waitOnAssignQueue();<a name="line.1756"></a>
-<span class="sourceLineNo">1757</span>    if (regions == null || regions.size() == 0 || !isRunning()) {<a name="line.1757"></a>
-<span class="sourceLineNo">1758</span>      return;<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>    if (LOG.isTraceEnabled()) {<a name="line.1761"></a>
-<span class="sourceLineNo">1762</span>      LOG.trace("PROCESS ASSIGN QUEUE regionCount=" + regions.size());<a name="line.1762"></a>
-<span class="sourceLineNo">1763</span>    }<a name="line.1763"></a>
-<span class="sourceLineNo">1764</span><a name="line.1764"></a>
-<span class="sourceLineNo">1765</span>    // TODO: Optimize balancer. pass a RegionPlan?<a name="line.1765"></a>
-<span class="sourceLineNo">1766</span>    final HashMap&lt;RegionInfo, ServerName&gt; retainMap = new HashMap&lt;&gt;();<a name="line.1766"></a>
-<span class="sourceLineNo">1767</span>    final List&lt;RegionInfo&gt; userHRIs = new ArrayList&lt;&gt;(regions.size());<a name="line.1767"></a>
-<span class="sourceLineNo">1768</span>    // Regions for system tables requiring reassignment<a name="line.1768"></a>
-<span class="sourceLineNo">1769</span>    final List&lt;RegionInfo&gt; systemHRIs = new ArrayList&lt;&gt;();<a name="line.1769"></a>
-<span class="sourceLineNo">1770</span>    for (RegionStateNode regionStateNode: regions.values()) {<a name="line.1770"></a>
-<span class="sourceLineNo">1771</span>      boolean sysTable = regionStateNode.isSystemTable();<a name="line.1771"></a>
-<span class="sourceLineNo">1772</span>      final List&lt;RegionInfo&gt; hris = sysTable? systemHRIs: userHRIs;<a name="line.1772"></a>
-<span class="sourceLineNo">1773</span>      if (regionStateNode.getRegionLocation() != null) {<a name="line.1773"></a>
-<span class="sourceLineNo">1774</span>        retainMap.put(regionStateNode.getRegionInfo(), regionStateNode.getRegionLocation());<a name="line.1774"></a>
-<span class="sourceLineNo">1775</span>      } else {<a name="line.1775"></a>
-<span class="sourceLineNo">1776</span>        hris.add(regionStateNode.getRegionInfo());<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><a name="line.1779"></a>
-<span class="sourceLineNo">1780</span>    // TODO: connect with the listener to invalidate the cache<a name="line.1780"></a>
+<span class="sourceLineNo">1651</span>  /**<a name="line.1651"></a>
+<span class="sourceLineNo">1652</span>   * When called here, the merge has happened. The two merged regions have been<a name="line.1652"></a>
+<span class="sourceLineNo">1653</span>   * unassigned and the above markRegionClosed has been called on each so they have been<a name="line.1653"></a>
+<span class="sourceLineNo">1654</span>   * disassociated from a hosting Server. The merged region will be open after this call. The<a name="line.1654"></a>
+<span class="sourceLineNo">1655</span>   * merged regions are removed from hbase:meta below&gt; Later they are deleted from the filesystem<a name="line.1655"></a>
+<span class="sourceLineNo">1656</span>   * by the catalog janitor running against hbase:meta. It notices when the merged region no<a name="line.1656"></a>
+<span class="sourceLineNo">1657</span>   * longer holds references to the old regions.<a name="line.1657"></a>
+<span class="sourceLineNo">1658</span>   */<a name="line.1658"></a>
+<span class="sourceLineNo">1659</span>  public void markRegionAsMerged(final RegionInfo child, final ServerName serverName,<a name="line.1659"></a>
+<span class="sourceLineNo">1660</span>      final RegionInfo mother, final RegionInfo father) throws IOException {<a name="line.1660"></a>
+<span class="sourceLineNo">1661</span>    final RegionStateNode node = regionStates.getOrCreateRegionStateNode(child);<a name="line.1661"></a>
+<span class="sourceLineNo">1662</span>    node.setState(State.MERGED);<a name="line.1662"></a>
+<span class="sourceLineNo">1663</span>    regionStates.deleteRegion(mother);<a name="line.1663"></a>
+<span class="sourceLineNo">1664</span>    regionStates.deleteRegion(father);<a name="line.1664"></a>
+<span class="sourceLineNo">1665</span>    regionStateStore.mergeRegions(child, mother, father, serverName);<a name="line.1665"></a>
+<span class="sourceLineNo">1666</span>    if (shouldAssignFavoredNodes(child)) {<a name="line.1666"></a>
+<span class="sourceLineNo">1667</span>      ((FavoredNodesPromoter)getBalancer()).<a name="line.1667"></a>
+<span class="sourceLineNo">1668</span>        generateFavoredNodesForMergedRegion(child, mother, father);<a name="line.1668"></a>
+<span class="sourceLineNo">1669</span>    }<a name="line.1669"></a>
+<span class="sourceLineNo">1670</span>  }<a name="line.1670"></a>
+<span class="sourceLineNo">1671</span><a name="line.1671"></a>
+<span class="sourceLineNo">1672</span>  /*<a name="line.1672"></a>
+<span class="sourceLineNo">1673</span>   * Favored nodes should be applied only when FavoredNodes balancer is configured and the region<a name="line.1673"></a>
+<span class="sourceLineNo">1674</span>   * belongs to a non-system table.<a name="line.1674"></a>
+<span class="sourceLineNo">1675</span>   */<a name="line.1675"></a>
+<span class="sourceLineNo">1676</span>  private boolean shouldAssignFavoredNodes(RegionInfo region) {<a name="line.1676"></a>
+<span class="sourceLineNo">1677</span>    return this.shouldAssignRegionsWithFavoredNodes &amp;&amp;<a name="line.1677"></a>
+<span class="sourceLineNo">1678</span>        FavoredNodesManager.isFavoredNodeApplicable(region);<a name="line.1678"></a>
+<span class="sourceLineNo">1679</span>  }<a name="line.1679"></a>
+<span class="sourceLineNo">1680</span><a name="line.1680"></a>
+<span class="sourceLineNo">1681</span>  // ============================================================================================<a name="line.1681"></a>
+<span class="sourceLineNo">1682</span>  //  Assign Queue (Assign/Balance)<a name="line.1682"></a>
+<span class="sourceLineNo">1683</span>  // ============================================================================================<a name="line.1683"></a>
+<span class="sourceLineNo">1684</span>  private final ArrayList&lt;RegionStateNode&gt; pendingAssignQueue = new ArrayList&lt;RegionStateNode&gt;();<a name="line.1684"></a>
+<span class="sourceLineNo">1685</span>  private final ReentrantLock assignQueueLock = new ReentrantLock();<a name="line.1685"></a>
+<span class="sourceLineNo">1686</span>  private final Condition assignQueueFullCond = assignQueueLock.newCondition();<a name="line.1686"></a>
+<span class="sourceLineNo">1687</span><a name="line.1687"></a>
+<span class="sourceLineNo">1688</span>  /**<a name="line.1688"></a>
+<span class="sourceLineNo">1689</span>   * Add the assign operation to the assignment queue.<a name="line.1689"></a>
+<span class="sourceLineNo">1690</span>   * The pending assignment operation will be processed,<a name="line.1690"></a>
+<span class="sourceLineNo">1691</span>   * and each region will be assigned by a server using the balancer.<a name="line.1691"></a>
+<span class="sourceLineNo">1692</span>   */<a name="line.1692"></a>
+<span class="sourceLineNo">1693</span>  protected void queueAssign(final RegionStateNode regionNode) {<a name="line.1693"></a>
+<span class="sourceLineNo">1694</span>    regionNode.getProcedureEvent().suspend();<a name="line.1694"></a>
+<span class="sourceLineNo">1695</span><a name="line.1695"></a>
+<span class="sourceLineNo">1696</span>    // TODO: quick-start for meta and the other sys-tables?<a name="line.1696"></a>
+<span class="sourceLineNo">1697</span>    assignQueueLock.lock();<a name="line.1697"></a>
+<span class="sourceLineNo">1698</span>    try {<a name="line.1698"></a>
+<span class="sourceLineNo">1699</span>      pendingAssignQueue.add(regionNode);<a name="line.1699"></a>
+<span class="sourceLineNo">1700</span>      if (regionNode.isSystemTable() ||<a name="line.1700"></a>
+<span class="sourceLineNo">1701</span>          pendingAssignQueue.size() == 1 ||<a name="line.1701"></a>
+<span class="sourceLineNo">1702</span>          pendingAssignQueue.size() &gt;= assignDispatchWaitQueueMaxSize) {<a name="line.1702"></a>
+<span class="sourceLineNo">1703</span>        assignQueueFullCond.signal();<a name="line.1703"></a>
+<span class="sourceLineNo">1704</span>      }<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>  private void startAssignmentThread() {<a name="line.1710"></a>
+<span class="sourceLineNo">1711</span>    // Get Server Thread name. Sometimes the Server is mocked so may not implement HasThread.<a name="line.1711"></a>
+<span class="sourceLineNo">1712</span>    // For example, in tests.<a name="line.1712"></a>
+<span class="sourceLineNo">1713</span>    String name = master instanceof HasThread? ((HasThread)master).getName():<a name="line.1713"></a>
+<span class="sourceLineNo">1714</span>        master.getServerName().toShortString();<a name="line.1714"></a>
+<span class="sourceLineNo">1715</span>    assignThread = new Thread(name) {<a name="line.1715"></a>
+<span class="sourceLineNo">1716</span>      @Override<a name="line.1716"></a>
+<span class="sourceLineNo">1717</span>      public void run() {<a name="line.1717"></a>
+<span class="sourceLineNo">1718</span>        while (isRunning()) {<a name="line.1718"></a>
+<span class="sourceLineNo">1719</span>          processAssignQueue();<a name="line.1719"></a>
+<span class="sourceLineNo">1720</span>        }<a name="line.1720"></a>
+<span class="sourceLineNo">1721</span>        pendingAssignQueue.clear();<a name="line.1721"></a>
+<span class="sourceLineNo">1722</span>      }<a name="line.1722"></a>
+<span class="sourceLineNo">1723</span>    };<a name="line.1723"></a>
+<span class="sourceLineNo">1724</span>    assignThread.setDaemon(true);<a name="line.1724"></a>
+<span class="sourceLineNo">1725</span>    assignThread.start();<a name="line.1725"></a>
+<span class="sourceLineNo">1726</span>  }<a name="line.1726"></a>
+<span class="sourceLineNo">1727</span><a name="line.1727"></a>
+<span class="sourceLineNo">1728</span>  private void stopAssignmentThread() {<a name="line.1728"></a>
+<span class="sourceLineNo">1729</span>    assignQueueSignal();<a name="line.1729"></a>
+<span class="sourceLineNo">1730</span>    try {<a name="line.1730"></a>
+<span class="sourceLineNo">1731</span>      while (assignThread.isAlive()) {<a name="line.1731"></a>
+<span class="sourceLineNo">1732</span>        assignQueueSignal();<a name="line.1732"></a>
+<span class="sourceLineNo">1733</span>        assignThread.join(250);<a name="line.1733"></a>
+<span class="sourceLineNo">1734</span>      }<a name="line.1734"></a>
+<span class="sourceLineNo">1735</span>    } catch (InterruptedException e) {<a name="line.1735"></a>
+<span class="sourceLineNo">1736</span>      LOG.warn("join interrupted", e);<a name="line.1736"></a>
+<span class="sourceLineNo">1737</span>      Thread.currentThread().interrupt();<a name="line.1737"></a>
+<span class="sourceLineNo">1738</span>    }<a name="line.1738"></a>
+<span class="sourceLineNo">1739</span>  }<a name="line.1739"></a>
+<span class="sourceLineNo">1740</span><a name="line.1740"></a>
+<span class="sourceLineNo">1741</span>  private void assignQueueSignal() {<a name="line.1741"></a>
+<span class="sourceLineNo">1742</span>    assignQueueLock.lock();<a name="line.1742"></a>
+<span class="sourceLineNo">1743</span>    try {<a name="line.1743"></a>
+<span class="sourceLineNo">1744</span>      assignQueueFullCond.signal();<a name="line.1744"></a>
+<span class="sourceLineNo">1745</span>    } finally {<a name="line.1745"></a>
+<span class="sourceLineNo">1746</span>      assignQueueLock.unlock();<a name="line.1746"></a>
+<span class="sourceLineNo">1747</span>    }<a name="line.1747"></a>
+<span class="sourceLineNo">1748</span>  }<a name="line.1748"></a>
+<span class="sourceLineNo">1749</span><a name="line.1749"></a>
+<span class="sourceLineNo">1750</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings("WA_AWAIT_NOT_IN_LOOP")<a name="line.1750"></a>
+<span class="sourceLineNo">1751</span>  private HashMap&lt;RegionInfo, RegionStateNode&gt; waitOnAssignQueue() {<a name="line.1751"></a>
+<span class="sourceLineNo">1752</span>    HashMap&lt;RegionInfo, RegionStateNode&gt; regions = null;<a name="line.1752"></a>
+<span class="sourceLineNo">1753</span><a name="line.1753"></a>
+<span class="sourceLineNo">1754</span>    assignQueueLock.lock();<a name="line.1754"></a>
+<span class="sourceLineNo">1755</span>    try {<a name="line.1755"></a>
+<span class="sourceLineNo">1756</span>      if (pendingAssignQueue.isEmpty() &amp;&amp; isRunning()) {<a name="line.1756"></a>
+<span class="sourceLineNo">1757</span>        assignQueueFullCond.await();<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>      if (!isRunning()) return null;<a name="line.1760"></a>
+<span class="sourceLineNo">1761</span>      assignQueueFullCond.await(assignDispatchWaitMillis, TimeUnit.MILLISECONDS);<a name="line.1761"></a>
+<span class="sourceLineNo">1762</span>      regions = new HashMap&lt;RegionInfo, RegionStateNode&gt;(pendingAssignQueue.size());<a name="line.1762"></a>
+<span class="sourceLineNo">1763</span>      for (RegionStateNode regionNode: pendingAssignQueue) {<a name="line.1763"></a>
+<span class="sourceLineNo">1764</span>        regions.put(regionNode.getRegionInfo(), regionNode);<a name="line.1764"></a>
+<span class="sourceLineNo">1765</span>      }<a name="line.1765"></a>
+<span class="sourceLineNo">1766</span>      pendingAssignQueue.clear();<a name="line.1766"></a>
+<span class="sourceLineNo">1767</span>    } catch (InterruptedException e) {<a name="line.1767"></a>
+<span class="sourceLineNo">1768</span>      LOG.warn("got interrupted ", e);<a name="line.1768"></a>
+<span class="sourceLineNo">1769</span>      Thread.currentThread().interrupt();<a name="line.1769"></a>
+<span class="sourceLineNo">1770</span>    } finally {<a name="line.1770"></a>
+<span class="sourceLineNo">1771</span>      assignQueueLock.unlock();<a name="line.1771"></a>
+<span class="sourceLineNo">1772</span>    }<a name="line.1772"></a>
+<span class="sourceLineNo">1773</span>    return regions;<a name="line.1773"></a>
+<span class="sourceLineNo">1774</span>  }<a name="line.1774"></a>
+<span class="sourceLineNo">1775</span><a name="line.1775"></a>
+<span class="sourceLineNo">1776</span>  private void processAssignQueue() {<a name="line.1776"></a>
+<span class="sourceLineNo">1777</span>    final HashMap&lt;RegionInfo, RegionStateNode&gt; regions = waitOnAssignQueue();<a name="line.1777"></a>
+<span class="sourceLineNo">1778</span>    if (regions == null || regions.size() == 0 || !isRunning()) {<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><a name="line.1781"></a>
-<span class="sourceLineNo">1782</span>    // TODO use events<a name="line.1782"></a>
-<span class="sourceLineNo">1783</span>    List&lt;ServerName&gt; servers = master.getServerManager().createDestinationServersList();<a name="line.1783"></a>
-<span class="sourceLineNo">1784</span>    for (int i = 0; servers.size() &lt; 1; ++i) {<a name="line.1784"></a>
-<span class="sourceLineNo">1785</span>      // Report every fourth time around this loop; try not to flood log.<a name="line.1785"></a>
-<span class="sourceLineNo">1786</span>      if (i % 4 == 0) {<a name="line.1786"></a>
-<span class="sourceLineNo">1787</span>        LOG.warn("No servers available; cannot place " + regions.size() + " unassigned regions.");<a name="line.1787"></a>
-<span class="sourceLineNo">1788</span>      }<a name="line.1788"></a>
-<span class="sourceLineNo">1789</span><a name="line.1789"></a>
-<span class="sourceLineNo">1790</span>      if (!isRunning()) {<a name="line.1790"></a>
-<span class="sourceLineNo">1791</span>        LOG.debug("Stopped! Dropping assign of " + regions.size() + " queued regions.");<a name="line.1791"></a>
-<span class="sourceLineNo">1792</span>        return;<a name="line.1792"></a>
-<span class="sourceLineNo">1793</span>      }<a name="line.1793"></a>
-<span class="sourceLineNo">1794</span>      Threads.sleep(250);<a name="line.1794"></a>
-<span class="sourceLineNo">1795</span>      servers = master.getServerManager().createDestinationServersList();<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>    if (!systemHRIs.isEmpty()) {<a name="line.1798"></a>
-<span class="sourceLineNo">1799</span>      // System table regions requiring reassignment are present, get region servers<a name="line.1799"></a>
-<span class="sourceLineNo">1800</span>      // not available for system table regions<a name="line.1800"></a>
-<span class="sourceLineNo">1801</span>      final List&lt;ServerName&gt; excludeServers = getExcludedServersForSystemTable();<a name="line.1801"></a>
-<span class="sourceLineNo">1802</span>      List&lt;ServerName&gt; serversForSysTables = servers.stream()<a name="line.1802"></a>
-<span class="sourceLineNo">1803</span>          .filter(s -&gt; !excludeServers.contains(s)).collect(Collectors.toList());<a name="line.1803"></a>
-<span class="sourceLineNo">1804</span>      if (serversForSysTables.isEmpty()) {<a name="line.1804"></a>
-<span class="sourceLineNo">1805</span>        LOG.warn("Filtering old server versions and the excluded produced an empty set; " +<a name="line.1805"></a>
-<span class="sourceLineNo">1806</span>            "instead considering all candidate servers!");<a name="line.1806"></a>
-<span class="sourceLineNo">1807</span>      }<a name="line.1807"></a>
-<span class="sourceLineNo">1808</span>      LOG.debug("Processing assignQueue; systemServersCount=" + serversForSysTables.size() +<a name="line.1808"></a>
-<span class="sourceLineNo">1809</span>          ", allServersCount=" + servers.size());<a name="line.1809"></a>
-<span class="sourceLineNo">1810</span>      processAssignmentPlans(regions, null, systemHRIs,<a name="line.1810"></a>
-<span class="sourceLineNo">1811</span>          serversForSysTables.isEmpty()? servers: serversForSysTables);<a name="line.1811"></a>
-<span class="sourceLineNo">1812</span>    }<a name="line.1812"></a>
-<span class="sourceLineNo">1813</span><a name="line.1813"></a>
-<span class="sourceLineNo">1814</span>    processAssignmentPlans(regions, retainMap, userHRIs, servers);<a name="line.1814"></a>
-<span class="sourceLineNo">1815</span>  }<a name="line.1815"></a>
-<span class="sourceLineNo">1816</span><a name="line.1816"></a>
-<span class="sourceLineNo">1817</span>  private void processAssignmentPlans(final HashMap&lt;RegionInfo, RegionStateNode&gt; regions,<a name="line.1817"></a>
-<span class="sourceLineNo">1818</span>      final HashMap&lt;RegionInfo, ServerName&gt; retainMap, final List&lt;RegionInfo&gt; hris,<a name="line.1818"></a>
-<span class="sourceLineNo">1819</span>      final List&lt;ServerName&gt; servers) {<a name="line.1819"></a>
-<span class="sourceLineNo">1820</span>    boolean isTraceEnabled = LOG.isTraceEnabled();<a name="line.1820"></a>
-<span class="sourceLineNo">1821</span>    if (isTraceEnabled) {<a name="line.1821"></a>
-<span class="sourceLineNo">1822</span>      LOG.trace("Available servers count=" + servers.size() + ": " + servers);<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>    final LoadBalancer balancer = getBalancer();<a name="line.1825"></a>
-<span class="sourceLineNo">1826</span>    // ask the balancer where to place regions<a name="line.1826"></a>
-<span class="sourceLineNo">1827</span>    if (retainMap != null &amp;&amp; !retainMap.isEmpty()) {<a name="line.1827"></a>
-<span class="sourceLineNo">1828</span>      if (isTraceEnabled) {<a name="line.1828"></a>
-<span class="sourceLineNo">1829</span>        LOG.trace("retain assign regions=" + retainMap);<a name="line.1829"></a>
-<span class="sourceLineNo">1830</span>      }<a name="line.1830"></a>
-<span class="sourceLineNo">1831</span>      try {<a name="line.1831"></a>
-<span class="sourceLineNo">1832</span>        acceptPlan(regions, balancer.retainAssignment(retainMap, servers));<a name="line.1832"></a>
-<span class="sourceLineNo">1833</span>      } catch (HBaseIOException e) {<a name="line.1833"></a>
-<span class="sourceLineNo">1834</span>        LOG.warn("unable to retain assignment", e);<a name="line.1834"></a>
-<span class="sourceLineNo">1835</span>        addToPendingAssignment(regions, retainMap.keySet());<a name="line.1835"></a>
-<span class="sourceLineNo">1836</span>      }<a name="line.1836"></a>
-<span class="sourceLineNo">1837</span>    }<a name="line.1837"></a>
-<span class="sourceLineNo">1838</span><a name="line.1838"></a>
-<span class="sourceLineNo">1839</span>    // TODO: Do we need to split retain and round-robin?<a name="line.1839"></a>
-<span class="sourceLineNo">1840</span>    // the retain seems to fallback to round-robin/random if the region is not in the map.<a name="line.1840"></a>
-<span class="sourceLineNo">1841</span>    if (!hris.isEmpty()) {<a name="line.1841"></a>
-<span class="sourceLineNo">1842</span>      Collections.sort(hris, RegionInfo.COMPARATOR);<a name="line.1842"></a>
-<span class="sourceLineNo">1843</span>      if (isTraceEnabled) {<a name="line.1843"></a>
-<span class="sourceLineNo">1844</span>        LOG.trace("round robin regions=" + hris);<a name="line.1844"></a>
-<span class="sourceLineNo">1845</span>      }<a name="line.1845"></a>
-<span class="sourceLineNo">1846</span>      try {<a name="line.1846"></a>
-<span class="sourceLineNo">1847</span>        acceptPlan(regions, balancer.roundRobinAssignment(hris, servers));<a name="line.1847"></a>
-<span class="sourceLineNo">1848</span>      } catch (HBaseIOException e) {<a name="line.1848"></a>
-<span class="sourceLineNo">1849</span>        LOG.warn("unable to round-robin assignment", e);<a name="line.1849"></a>
-<span class="sourceLineNo">1850</span>        addToPendingAssignment(regions, hris);<a name="line.1850"></a>
+<span class="sourceLineNo">1782</span>    if (LOG.isTraceEnabled()) {<a name="line.1782"></a>
+<span class="sourceLineNo">1783</span>      LOG.trace("PROCESS ASSIGN QUEUE regionCount=" + regions.size());<a name="line.1783"></a>
+<span class="sourceLineNo">1784</span>    }<a name="line.1784"></a>
+<span class="sourceLineNo">1785</span><a name="line.1785"></a>
+<span class="sourceLineNo">1786</span>    // TODO: Optimize balancer. pass a RegionPlan?<a name="line.1786"></a>
+<span class="sourceLineNo">1787</span>    final HashMap&lt;RegionInfo, ServerName&gt; retainMap = new HashMap&lt;&gt;();<a name="line.1787"></a>
+<span class="sourceLineNo">1788</span>    final List&lt;RegionInfo&gt; userHRIs = new ArrayList&lt;&gt;(regions.size());<a name="line.1788"></a>
+<span class="sourceLineNo">1789</span>    // Regions for system tables requiring reassignment<a name="line.1789"></a>
+<span class="sourceLineNo">1790</span>    final List&lt;RegionInfo&gt; systemHRIs = new ArrayList&lt;&gt;();<a name="line.1790"></a>
+<span class="sourceLineNo">1791</span>    for (RegionStateNode regionStateNode: regions.values()) {<a name="line.1791"></a>
+<span class="sourceLineNo">1792</span>      boolean sysTable = regionStateNode.isSystemTable();<a name="line.1792"></a>
+<span class="sourceLineNo">1793</span>      final List&lt;RegionInfo&gt; hris = sysTable? systemHRIs: userHRIs;<a name="line.1793"></a>
+<span class="sourceLineNo">1794</span>      if (regionStateNode.getRegionLocation() != null) {<a name="line.1794"></a>
+<span class="sourceLineNo">1795</span>        retainMap.put(regionStateNode.getRegionInfo(), regionStateNode.getRegionLocation());<a name="line.1795"></a>
+<span class="sourceLineNo">1796</span>      } else {<a name="line.1796"></a>
+<span class="sourceLineNo">1797</span>        hris.add(regionStateNode.getRegionInfo());<a name="line.1797"></a>
+<span class="sourceLineNo">1798</span>      }<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>    // TODO: connect with the listener to invalidate the cache<a name="line.1801"></a>
+<span class="sourceLineNo">1802</span><a name="line.1802"></a>
+<span class="sourceLineNo">1803</span>    // TODO use events<a name="line.1803"></a>
+<span class="sourceLineNo">1804</span>    List&lt;ServerName&gt; servers = master.getServerManager().createDestinationServersList();<a name="line.1804"></a>
+<span class="sourceLineNo">1805</span>    for (int i = 0; servers.size() &lt; 1; ++i) {<a name="line.1805"></a>
+<span class="sourceLineNo">1806</span>      // Report every fourth time around this loop; try not to flood log.<a name="line.1806"></a>
+<span class="sourceLineNo">1807</span>      if (i % 4 == 0) {<a name="line.1807"></a>
+<span class="sourceLineNo">1808</span>        LOG.warn("No servers available; cannot place " + regions.size() + " unassigned regions.");<a name="line.1808"></a>
+<span class="sourceLineNo">1809</span>      }<a name="line.1809"></a>
+<span class="sourceLineNo">1810</span><a name="line.1810"></a>
+<span class="sourceLineNo">1811</span>      if (!isRunning()) {<a name="line.1811"></a>
+<span class="sourceLineNo">1812</span>        LOG.debug("Stopped! Dropping assign of " + regions.size() + " queued regions.");<a name="line.1812"></a>
+<span class="sourceLineNo">1813</span>        return;<a name="line.1813"></a>
+<span class="sourceLineNo">1814</span>      }<a name="line.1814"></a>
+<span class="sourceLineNo">1815</span>      Threads.sleep(250);<a name="line.1815"></a>
+<span class="sourceLineNo">1816</span>      servers = master.getServerManager().createDestinationServersList();<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>    if (!systemHRIs.isEmpty()) {<a name="line.1819"></a>
+<span class="sourceLineNo">1820</span>      // System table regions requiring reassignment are present, get region servers<a name="line.1820"></a>
+<span class="sourceLineNo">1821</span>      // not available for system table regions<a name="line.1821"></a>
+<span class="sourceLineNo">1822</span>      final List&lt;ServerName&gt; excludeServers = getExcludedServersForSystemTable();<a name="line.1822"></a>
+<span class="sourceLineNo">1823</span>      List&lt;ServerName&gt; serversForSysTables = servers.stream()<a name="line.1823"></a>
+<span class="sourceLineNo">1824</span>          .filter(s -&gt; !excludeServers.contains(s)).collect(Collectors.toList());<a name="line.1824"></a>
+<span class="sourceLineNo">1825</span>      if (serversForSysTables.isEmpty()) {<a name="line.1825"></a>
+<span class="sourceLineNo">1826</span>        LOG.warn("Filtering old server versions and the excluded produced an empty set; " +<a name="line.1826"></a>
+<span class="sourceLineNo">1827</span>            "instead considering all candidate servers!");<a name="line.1827"></a>
+<span class="sourceLineNo">1828</span>      }<a name="line.1828"></a>
+<span class="sourceLineNo">1829</span>      LOG.debug("Processing assignQueue; systemServersCount=" + serversForSysTables.size() +<a name="line.1829"></a>
+<span class="sourceLineNo">1830</span>          ", allServersCount=" + servers.size());<a name="line.1830"></a>
+<span class="sourceLineNo">1831</span>      processAssignmentPlans(regions, null, systemHRIs,<a name="line.1831"></a>
+<span class="sourceLineNo">1832</span>          serversForSysTables.isEmpty()? servers: serversForSysTables);<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>    processAssignmentPlans(regions, retainMap, userHRIs, servers);<a name="line.1835"></a>
+<span class="sourceLineNo">1836</span>  }<a name="line.1836"></a>
+<span class="sourceLineNo">1837</span><a name="line.1837"></a>
+<span class="sourceLineNo">1838</span>  private void processAssignmentPlans(final HashMap&lt;RegionInfo, RegionStateNode&gt; regions,<a name="line.1838"></a>
+<span class="sourceLineNo">1839</span>      final HashMap&lt;RegionInfo, ServerName&gt; retainMap, final List&lt;RegionInfo&gt; hris,<a name="line.1839"></a>
+<span class="sourceLineNo">1840</span>      final List&lt;ServerName&gt; servers) {<a name="line.1840"></a>
+<span class="sourceLineNo">1841</span>    boolean isTraceEnabled = LOG.isTraceEnabled();<a name="line.1841"></a>
+<span class="sourceLineNo">1842</span>    if (isTraceEnabled) {<a name="line.1842"></a>
+<span class="sourceLineNo">1843</span>      LOG.trace("Available servers count=" + servers.size() + ": " + servers);<a name="line.1843"></a>
+<span class="sourceLineNo">1844</span>    }<a name="line.1844"></a>
+<span class="sourceLineNo">1845</span><a name="line.1845"></a>
+<span class="sourceLineNo">1846</span>    final LoadBalancer balancer = getBalancer();<a name="line.1846"></a>
+<span class="sourceLineNo">1847</span>    // ask the balancer where to place regions<a name="line.1847"></a>
+<span class="sourceLineNo">1848</span>    if (retainMap != null &amp;&amp; !retainMap.isEmpty()) {<a name="line.1848"></a>
+<span class="sourceLineNo">1849</span>      if (isTraceEnabled) {<a name="line.1849"></a>
+<span class="sourceLineNo">1850</span>        LOG.trace("retain assign regions=" + retainMap);<a name="line.1850"></a>
 <span class="sourceLineNo">1851</span>      }<a name="line.1851"></a>
-<span class="sourceLineNo">1852</span>    }<a name="line.1852"></a>
-<span class="sourceLineNo">1853</span>  }<a name="line.1853"></a>
-<span class="sourceLineNo">1854</span><a name="line.1854"></a>
-<span class="sourceLineNo">1855</span>  private void acceptPlan(final HashMap&lt;RegionInfo, RegionStateNode&gt; regions,<a name="line.1855"></a>
-<span class="sourceLineNo">1856</span>      final Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; plan) throws HBaseIOException {<a name="line.1856"></a>
-<span class="sourceLineNo">1857</span>    final ProcedureEvent&lt;?&gt;[] events = new ProcedureEvent[regions.size()];<a name="line.1857"></a>
-<span class="sourceLineNo">1858</span>    final long st = System.currentTimeMillis();<a name="line.1858"></a>
+<span class="sourceLineNo">1852</span>      try {<a name="line.1852"></a>
+<span class="sourceLineNo">1853</span>        acceptPlan(regions, balancer.retainAssignment(retainMap, servers));<a name="line.1853"></a>
+<span class="sourceLineNo">1854</span>      } catch (HBaseIOException e) {<a name="line.1854"></a>
+<span class="sourceLineNo">1855</span>        LOG.warn("unable to retain assignment", e);<a name="line.1855"></a>
+<span class="sourceLineNo">1856</span>        addToPendingAssignment(regions, retainMap.keySet());<a name="line.1856"></a>
+<span class="sourceLineNo">1857</span>      }<a name="line.1857"></a>
+<span class="sourceLineNo">1858</span>    }<a name="line.1858"></a>
 <span class="sourceLineNo">1859</span><a name="line.1859"></a>
-<span class="sourceLineNo">1860</span>    if (plan == null) {<a name="line.1860"></a>
-<span class="sourceLineNo">1861</span>      throw new HBaseIOException("unable to compute plans for regions=" + regions.size());<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>    if (plan.isEmpty()) return;<a name="line.1864"></a>
-<span class="sourceLineNo">1865</span><a name="line.1865"></a>
-<span class="sourceLineNo">1866</span>    int evcount = 0;<a name="line.1866"></a>
-<span class="sourceLineNo">1867</span>    for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; entry: plan.entrySet()) {<a name="line.1867"></a>
-<span class="sourceLineNo">1868</span>      final ServerName server = entry.getKey();<a name="line.1868"></a>
-<span class="sourceLineNo">1869</span>      for (RegionInfo hri: entry.getValue()) {<a name="line.1869"></a>
-<span class="sourceLineNo">1870</span>        final RegionStateNode regionNode = regions.get(hri);<a name="line.1870"></a>
-<span class="sourceLineNo">1871</span>        regionNode.setRegionLocation(server);<a name="line.1871"></a>
-<span class="sourceLineNo">1872</span>        events[evcount++] = regionNode.getProcedureEvent();<a name="line.1872"></a>
-<span class="sourceLineNo">1873</span>      }<a name="line.1873"></a>
-<span class="sourceLineNo">1874</span>    }<a name="line.1874"></a>
-<span class="sourceLineNo">1875</span>    ProcedureEvent.wakeEvents(getProcedureScheduler(), events);<a name="line.1875"></a>
-<span class="sourceLineNo">1876</span><a name="line.1876"></a>
-<span class="sourceLineNo">1877</span>    final long et = System.currentTimeMillis();<a name="line.1877"></a>
-<span class="sourceLineNo">1878</span>    if (LOG.isTraceEnabled()) {<a name="line.1878"></a>
-<span class="sourceLineNo">1879</span>      LOG.trace("ASSIGN ACCEPT " + events.length + " -&gt; " +<a name="line.1879"></a>
-<span class="sourceLineNo">1880</span>          StringUtils.humanTimeDiff(et - st));<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>  private void addToPendingAssignment(final HashMap&lt;RegionInfo, RegionStateNode&gt; regions,<a name="line.1884"></a>
-<span class="sourceLineNo">1885</span>      final Collection&lt;RegionInfo&gt; pendingRegions) {<a name="line.1885"></a>
-<span class="sourceLineNo">1886</span>    assignQueueLock.lock();<a name="line.1886"></a>
-<span class="sourceLineNo">1887</span>    try {<a name="line.1887"></a>
-<span class="sourceLineNo">1888</span>      for (RegionInfo hri: pendingRegions) {<a name="line.1888"></a>
-<span class="sourceLineNo">1889</span>        pendingAssignQueue.add(regions.get(hri));<a name="line.1889"></a>
-<span class="sourceLineNo">1890</span>      }<a name="line.1890"></a>
-<span class="sourceLineNo">1891</span>    } finally {<a name="line.1891"></a>
-<span class="sourceLineNo">1892</span>      assignQueueLock.unlock();<a name="line.1892"></a>
-<span class="sourceLineNo">1893</span>    }<a name="line.1893"></a>
-<span class="sourceLineNo">1894</span>  }<a name="line.1894"></a>
-<span class="sourceLineNo">1895</span><a name="line.1895"></a>
-<span class="sourceLineNo">1896</span>  /**<a name="line.1896"></a>
-<span class="sourceLineNo">1897</span>   * Get a list of servers that this region cannot be assigned to.<a name="line.1897"></a>
-<span class="sourceLineNo">1898</span>   * For system tables, we must assign them to a server with highest version.<a name="line.1898"></a>
-<span class="sourceLineNo">1899</span>   */<a name="line.1899"></a>
-<span class="sourceLineNo">1900</span>  public List&lt;ServerName&gt; getExcludedServersForSystemTable() {<a name="line.1900"></a>
-<span class="sourceLineNo">1901</span>    // TODO: This should be a cached list kept by the ServerManager rather than calculated on each<a name="line.1901"></a>
-<span class="sourceLineNo">1902</span>    // move or system region assign. The RegionServerTracker keeps list of online Servers with<a name="line.1902"></a>
-<span class="sourceLineNo">1903</span>    // RegionServerInfo that includes Version.<a name="line.1903"></a>
-<span class="sourceLineNo">1904</span>    List&lt;Pair&lt;ServerName, String&gt;&gt; serverList = master.getServerManager().getOnlineServersList()<a name="line.1904"></a>
-<span class="sourceLineNo">1905</span>        .stream()<a name="line.1905"></a>
-<span class="sourceLineNo">1906</span>        .map((s)-&gt;new Pair&lt;&gt;(s, master.getRegionServerVersion(s)))<a name="line.1906"></a>
-<span class="sourceLineNo">1907</span>        .collect(Collectors.toList());<a name="line.1907"></a>
-<span class="sourceLineNo">1908</span>    if (serverList.isEmpty()) {<a name="line.1908"></a>
-<span class="sourceLineNo">1909</span>      return Collections.emptyList();<a name="line.1909"></a>
-<span class="sourceLineNo">1910</span>    }<a name="line.1910"></a>
-<span class="sourceLineNo">1911</span>    String highestVersion = Collections.max(serverList,<a name="line.1911"></a>
-<span class="sourceLineNo">1912</span>        (o1, o2) -&gt; VersionInfo.compareVersion(o1.getSecond(), o2.getSecond())).getSecond();<a name="line.1912"></a>
-<span class="sourceLineNo">1913</span>    return serverList.stream()<a name="line.1913"></a>
-<span class="sourceLineNo">1914</span>        .filter((p)-&gt;!p.getSecond().equals(highestVersion))<a name="line.1914"></a>
-<span class="sourceLineNo">1915</span>        .map(Pair::getFirst)<a name="line.1915"></a>
-<span class="sourceLineNo">1916</span>        .collect(Collectors.toList());<a name="line.1916"></a>
-<span class="sourceLineNo">1917</span>  }<a name="line.1917"></a>
-<span class="sourceLineNo">1918</span><a name="line.1918"></a>
-<span class="sourceLineNo">1919</span>  @VisibleForTesting<a name="line.1919"></a>
-<span class="sourceLineNo">1920</span>  MasterServices getMaster() {<a name="line.1920"></a>
-<span class="sourceLineNo">1921</span>    return master;<a name="line.1921"></a>
-<span class="sourceLineNo">1922</span>  }<a name="line.1922"></a>
-<span class="sourceLineNo">1923</span>}<a name="line.1923"></a>
+<span class="sourceLineNo">1860</span>    // TODO: Do we need to split retain and round-robin?<a name="line.1860"></a>
+<span class="sourceLineNo">1861</span>    // the retain seems to fallback to round-robin/random if the region is not in the map.<a name="line.1861"></a>
+<span class="sourceLineNo">1862</span>    if (!hris.isEmpty()) {<a name="line.1862"></a>
+<span class="sourceLineNo">1863</span>      Collections.sort(hris, RegionInfo.COMPARATOR);<a name="line.1863"></a>
+<span class="sourceLineNo">1864</span>      if (isTraceEnabled) {<a name="line.1864"></a>
+<span class="sourceLineNo">1865</span>        LOG.trace("round robin regions=" + hris);<a name="line.1865"></a>
+<span class="sourceLineNo">1866</span>      }<a name="line.1866"></a>
+<span class="sourceLineNo">1867</span>      try {<a name="line.1867"></a>
+<span class="sourceLineNo">1868</span>        acceptPlan(regions, balancer.roundRobinAssignment(hris, servers));<a name="line.1868"></a>
+<span class="sourceLineNo">1869</span>      } catch (HBaseIOException e) {<a name="line.1869"></a>
+<span class="sourceLineNo">1870</span>        LOG.warn("unable to round-robin assignment", e);<a name="line.1870"></a>
+<span class="sourceLineNo">1871</span>        addToPendingAssignment(regions, hris);<a name="line.1871"></a>
+<span class="sourceLineNo">1872</span>      }<a name="line.1872"></a>
+<span class="sourceLineNo">1873</span>    }<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>  private void acceptPlan(final HashMap&lt;RegionInfo, RegionStateNode&gt; regions,<a name="line.1876"></a>
+<span class="sourceLineNo">1877</span>      final Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; plan) throws HBaseIOException {<a name="line.1877"></a>
+<span class="sourceLineNo">1878</span>    final ProcedureEvent&lt;?&gt;[] events = new ProcedureEvent[regions.size()];<a name="line.1878"></a>
+<span class="sourceLineNo">1879</span>    final long st = System.currentTimeMillis();<a name="line.1879"></a>
+<span class="sourceLineNo">1880</span><a name="line.1880"></a>
+<span class="sourceLineNo">1881</span>    if (plan == null) {<a name="line.1881"></a>
+<span class="sourceLineNo">1882</span>      throw new HBaseIOException("unable to compute plans for regions=" + regions.size());<a name="line.1882"></a>
+<span class="sourceLineNo">1883</span>    }<a name="line.1883"></a>
+<span class="sourceLineNo">1884</span><a name="line.1884"></a>
+<span class="sourceLineNo">1885</span>    if (plan.isEmpty()) return;<a name="line.1885"></a>
+<span class="sourceLineNo">1886</span><a name="line.1886"></a>
+<span class="sourceLineNo">1887</span>    int evcount = 0;<a name="line.1887"></a>
+<span class="sourceLineNo">1888</span>    for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; entry: plan.entrySet()) {<a name="line.1888"></a>
+<span class="sourceLineNo">1889</span>      final ServerName server = entry.getKey();<a name="line.1889"></a>
+<span class="sourceLineNo">1890</span>      for (RegionInfo hri: entry.getValue()) {<a name="line.1890"></a>
+<span class="sourceLineNo">1891</span>        final RegionStateNode regionNode = regions.get(hri);<a name="line.1891"></a>
+<span class="sourceLineNo">1892</span>        regionNode.setRegionLocation(server);<a name="line.1892"></a>
+<span class="sourceLineNo">1893</span>        events[evcount++] = regionNode.getProcedureEvent();<a name="line.1893"></a>
+<span class="sourceLineNo">1894</span>      }<a name="line.1894"></a>
+<span class="sourceLineNo">1895</span>    }<a name="line.1895"></a>
+<span class="sourceLineNo">1896</span>    ProcedureEvent.wakeEvents(getProcedureScheduler(), events);<a name="line.1896"></a>
+<span class="sourceLineNo">1897</span><a name="line.1897"></a>
+<span class="sourceLineNo">1898</span>    final long et = System.currentTimeMillis();<a name="line.1898"></a>
+<span class="sourceLineNo">1899</span>    if (LOG.isTraceEnabled()) {<a name="line.1899"></a>
+<span class="sourceLineNo">1900</span>      LOG.trace("ASSIGN ACCEPT " + events.length + " -&gt; " +<a name="line.1900"></a>
+<span class="sourceLineNo">1901</span>          StringUtils.humanTimeDiff(et - st));<a name="line.1901"></a>
+<span class="sourceLineNo">1902</span>    }<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">1905</span>  private void addToPendingAssignment(final HashMap&lt;RegionInfo, RegionStateNode&gt; regions,<a name="line.1905"></a>
+<span class="sourceLineNo">1906</span>      final Collection&lt;RegionInfo&gt; pendingRegions) {<a name="line.1906"></a>
+<span class="sourceLineNo">1907</span>    assignQueueLock.lock();<a name="line.1907"></a>
+<span class="sourceLineNo">1908</span>    try {<a name="line.1908"></a>
+<span class="sourceLineNo">1909</span>      for (RegionInfo hri: pendingRegions) {<a name="line.1909"></a>
+<span class="sourceLineNo">1910</span>        pendingAssignQueue.add(regions.get(hri));<a name="line.1910"></a>
+<span class="sourceLineNo">1911</span>      }<a name="line.1911"></a>
+<span class="sourceLineNo">1912</span>    } finally {<a name="line.1912"></a>
+<span class="sourceLineNo">1913</span>      assignQueueLock.unlock();<a name="line.1913"></a>
+<span class="sourceLineNo">1914</span>    }<a name="line.1914"></a>
+<span class="sourceLineNo">1915</span>  }<a name="line.1915"></a>
+<span class="sourceLineNo">1916</span><a name="line.1916"></a>
+<span class="sourceLineNo">1917</span>  /**<a name="line.1917"></a>
+<span class="sourceLineNo">1918</span>   * Get a list of servers that this region cannot be assigned to.<a name="line.1918"></a>
+<span class="sourceLineNo">1919</span>   * For system tables, we must assign them to a server with highest version.<a name="line.1919"></a>
+<span class="sourceLineNo">1920</span>   */<a name="line.1920"></a>
+<span class="sourceLineNo">1921</span>  public List&lt;ServerName&gt; getExcludedServersForSystemTable() {<a name="line.1921"></a>
+<span class="sourceLineNo">1922</span>    // TODO: This should be a cached list kept by the ServerManager rather than calculated on each<a name="line.1922"></a>
+<span class="sourceLineNo">1923</span>    // move or system region assign. The RegionServerTracker keeps list of online Servers with<a name="line.1923"></a>
+<span class="sourceLineNo">1924</span>    // RegionServerInfo that includes Version.<a name="line.1924"></a>
+<span class="sourceLineNo">1925</span>    List&lt;Pair&lt;ServerName, String&gt;&gt; serverList = master.getServerManager().getOnlineServersList()<a name="line.1925"></a>
+<span class="sourceLineNo">1926</span>        .stream()<a name="line.1926"></a>
+<span class="sourceLineNo">1927</span>        .map((s)-&gt;new Pair&lt;&gt;(s, master.getRegionServerVersion(s)))<a name="line.1927"></a>
+<span class="sourceLineNo">1928</span>        .collect(Collectors.toList());<a name="line.1928"></a>
+<span class="sourceLineNo">1929</span>    if (serverList.isEmpty()) {<a name="line.1929"></a>
+<span class="sourceLineNo">1930</span>      return Collections.emptyList();<a name="line.1930"></a>
+<span class="sourceLineNo">1931</span>    }<a name="line.1931"></a>
+<span class="sourceLineNo">1932</span>    String highestVersion = Collections.max(serverList,<a name="line.1932"></a>
+<span class="sourceLineNo">1933</span>        (o1, o2) -&gt; VersionInfo.compareVersion(o1.getSecond(), o2.getSecond())).getSecond();<a name="line.1933"></a>
+<span class="sourceLineNo">1934</span>    return serverList.stream()<a name="line.1934"></a>
+<span class="sourceLineNo">1935</span>        .filter((p)-&gt;!p.getSecond().equals(highestVersion))<a name="line.1935"></a>
+<span class="sourceLineNo">1936</span>        .map(Pair::getFirst)<a name="line.1936"></a>
+<span class="sourceLineNo">1937</span>        .collect(Collectors.toList());<a name="line.1937"></a>
+<span class="sourceLineNo">1938</span>  }<a name="line.1938"></a>
+<span class="sourceLineNo">1939</span><a name="line.1939"></a>
+<span class="sourceLineNo">1940</span>  @VisibleForTesting<a name="line.1940"></a>
+<span class="sourceLineNo">1941</span>  MasterServices getMaster() {<a name="line.1941"></a>
+<span class="sourceLineNo">1942</span>    return master;<a name="line.1942"></a>
+<span class="sourceLineNo">1943</span>  }<a name="line.1943"></a>
+<span class="sourceLineNo">1944</span>}<a name="line.1944"></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 f7cfdf8..f2f276f 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
@@ -221,1101 +221,1101 @@
 <span class="sourceLineNo">213</span>      try {<a name="line.213"></a>
 <span class="sourceLineNo">214</span>        regionNode.setRegionLocation(regionState.getServerName());<a name="line.214"></a>
 <span class="sourceLineNo">215</span>        regionNode.setState(regionState.getState());<a name="line.215"></a>
-<span class="sourceLineNo">216</span>        setMetaAssigned(regionState.getRegion(), regionState.getState() == State.OPEN);<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      } finally {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>        regionNode.unlock();<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>  }<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>  /**<a name="line.223"></a>
-<span class="sourceLineNo">224</span>   * Create RegionStateNode based on the TRSP list, and attach the TRSP to the RegionStateNode.<a name="line.224"></a>
-<span class="sourceLineNo">225</span>   * &lt;p&gt;<a name="line.225"></a>
-<span class="sourceLineNo">226</span>   * This is used to restore the RIT region list, so we do not need to restore it in the loadingMeta<a name="line.226"></a>
-<span class="sourceLineNo">227</span>   * method below. And it is also very important as now before submitting a TRSP, we need to attach<a name="line.227"></a>
-<span class="sourceLineNo">228</span>   * it to the RegionStateNode, which acts like a guard, so we need to restore this information at<a name="line.228"></a>
-<span class="sourceLineNo">229</span>   * the very beginning, before we start processing any procedures.<a name="line.229"></a>
-<span class="sourceLineNo">230</span>   */<a name="line.230"></a>
-<span class="sourceLineNo">231</span>  public void setupRIT(List&lt;TransitRegionStateProcedure&gt; procs) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    procs.forEach(proc -&gt; {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>      RegionInfo regionInfo = proc.getRegion();<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      RegionStateNode regionNode = regionStates.getOrCreateRegionStateNode(regionInfo);<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      TransitRegionStateProcedure existingProc = regionNode.getProcedure();<a name="line.235"></a>
-<span class="sourceLineNo">236</span>      if (existingProc != null) {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>        // This is possible, as we will detach the procedure from the RSN before we<a name="line.237"></a>
-<span class="sourceLineNo">238</span>        // actually finish the procedure. This is because that, we will update the region state<a name="line.238"></a>
-<span class="sourceLineNo">239</span>        // directly in the reportTransition method for TRSP, and theoretically the region transition<a name="line.239"></a>
-<span class="sourceLineNo">240</span>        // has been done, so we need to detach the procedure from the RSN. But actually the<a name="line.240"></a>
-<span class="sourceLineNo">241</span>        // procedure has not been marked as done in the pv2 framework yet, so it is possible that we<a name="line.241"></a>
-<span class="sourceLineNo">242</span>        // schedule a new TRSP immediately and when arriving here, we will find out that there are<a name="line.242"></a>
-<span class="sourceLineNo">243</span>        // multiple TRSPs for the region. But we can make sure that, only the last one can take the<a name="line.243"></a>
-<span class="sourceLineNo">244</span>        // charge, the previous ones should have all been finished already.<a name="line.244"></a>
-<span class="sourceLineNo">245</span>        // So here we will compare the proc id, the greater one will win.<a name="line.245"></a>
-<span class="sourceLineNo">246</span>        if (existingProc.getProcId() &lt; proc.getProcId()) {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>          // the new one wins, unset and set it to the new one below<a name="line.247"></a>
-<span class="sourceLineNo">248</span>          regionNode.unsetProcedure(existingProc);<a name="line.248"></a>
-<span class="sourceLineNo">249</span>        } else {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>          // the old one wins, skip<a name="line.250"></a>
-<span class="sourceLineNo">251</span>          return;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>        }<a name="line.252"></a>
-<span class="sourceLineNo">253</span>      }<a name="line.253"></a>
-<span class="sourceLineNo">254</span>      LOG.info("Attach {} to {} to restore RIT", proc, regionNode);<a name="line.254"></a>
-<span class="sourceLineNo">255</span>      regionNode.setProcedure(proc);<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><a name="line.258"></a>
-<span class="sourceLineNo">259</span>  public void stop() {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    if (!running.compareAndSet(true, false)) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      return;<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    }<a name="line.262"></a>
-<span class="sourceLineNo">263</span><a name="line.263"></a>
-<span class="sourceLineNo">264</span>    LOG.info("Stopping assignment manager");<a name="line.264"></a>
-<span class="sourceLineNo">265</span><a name="line.265"></a>
-<span class="sourceLineNo">266</span>    // The AM is started before the procedure executor,<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    // but the actual work will be loaded/submitted only once we have the executor<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    final boolean hasProcExecutor = master.getMasterProcedureExecutor() != null;<a name="line.268"></a>
-<span class="sourceLineNo">269</span><a name="line.269"></a>
-<span class="sourceLineNo">270</span>    // Remove the RIT chore<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    if (hasProcExecutor) {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>      master.getMasterProcedureExecutor().removeChore(this.ritChore);<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    }<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    // Stop the Assignment Thread<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    stopAssignmentThread();<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>    // Stop the RegionStateStore<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    regionStates.clear();<a name="line.279"></a>
-<span class="sourceLineNo">280</span><a name="line.280"></a>
-<span class="sourceLineNo">281</span>    // Update meta events (for testing)<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    if (hasProcExecutor) {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      metaLoadEvent.suspend();<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      for (RegionInfo hri: getMetaRegionSet()) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        setMetaAssigned(hri, false);<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>  }<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span>  public boolean isRunning() {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>    return running.get();<a name="line.291"></a>
-<span class="sourceLineNo">292</span>  }<a name="line.292"></a>
-<span class="sourceLineNo">293</span><a name="line.293"></a>
-<span class="sourceLineNo">294</span>  public Configuration getConfiguration() {<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    return master.getConfiguration();<a name="line.295"></a>
-<span class="sourceLineNo">296</span>  }<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>  public MetricsAssignmentManager getAssignmentManagerMetrics() {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    return metrics;<a name="line.299"></a>
-<span class="sourceLineNo">300</span>  }<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>  private LoadBalancer getBalancer() {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    return master.getLoadBalancer();<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  }<a name="line.304"></a>
-<span class="sourceLineNo">305</span><a name="line.305"></a>
-<span class="sourceLineNo">306</span>  private MasterProcedureEnv getProcedureEnvironment() {<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    return master.getMasterProcedureExecutor().getEnvironment();<a name="line.307"></a>
-<span class="sourceLineNo">308</span>  }<a name="line.308"></a>
-<span class="sourceLineNo">309</span><a name="line.309"></a>
-<span class="sourceLineNo">310</span>  private MasterProcedureScheduler getProcedureScheduler() {<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    return getProcedureEnvironment().getProcedureScheduler();<a name="line.311"></a>
-<span class="sourceLineNo">312</span>  }<a name="line.312"></a>
-<span class="sourceLineNo">313</span><a name="line.313"></a>
-<span class="sourceLineNo">314</span>  int getAssignMaxAttempts() {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    return assignMaxAttempts;<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
-<span class="sourceLineNo">317</span><a name="line.317"></a>
-<span class="sourceLineNo">318</span>  int getAssignRetryImmediatelyMaxAttempts() {<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    return assignRetryImmediatelyMaxAttempts;<a name="line.319"></a>
-<span class="sourceLineNo">320</span>  }<a name="line.320"></a>
-<span class="sourceLineNo">321</span><a name="line.321"></a>
-<span class="sourceLineNo">322</span>  public RegionStates getRegionStates() {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    return regionStates;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>  }<a name="line.324"></a>
-<span class="sourceLineNo">325</span><a name="line.325"></a>
-<span class="sourceLineNo">326</span>  /**<a name="line.326"></a>
-<span class="sourceLineNo">327</span>   * Returns the regions hosted by the specified server.<a name="line.327"></a>
-<span class="sourceLineNo">328</span>   * &lt;p/&gt;<a name="line.328"></a>
-<span class="sourceLineNo">329</span>   * Notice that, for SCP, after we submit the SCP, no one can change the region list for the<a name="line.329"></a>
-<span class="sourceLineNo">330</span>   * ServerStateNode so we do not need any locks here. And for other usage, this can only give you a<a name="line.330"></a>
-<span class="sourceLineNo">331</span>   * snapshot of the current region list for this server, which means, right after you get the<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * region list, new regions may be moved to this server or some regions may be moved out from this<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * server, so you should not use it critically if you need strong consistency.<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   */<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  public List&lt;RegionInfo&gt; getRegionsOnServer(ServerName serverName) {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    ServerStateNode serverInfo = regionStates.getServerNode(serverName);<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    if (serverInfo == null) {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      return Collections.emptyList();<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    }<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    return serverInfo.getRegionInfoList();<a name="line.340"></a>
-<span class="sourceLineNo">341</span>  }<a name="line.341"></a>
-<span class="sourceLineNo">342</span><a name="line.342"></a>
-<span class="sourceLineNo">343</span>  public RegionStateStore getRegionStateStore() {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    return regionStateStore;<a name="line.344"></a>
-<span class="sourceLineNo">345</span>  }<a name="line.345"></a>
-<span class="sourceLineNo">346</span><a name="line.346"></a>
-<span class="sourceLineNo">347</span>  public List&lt;ServerName&gt; getFavoredNodes(final RegionInfo regionInfo) {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    return this.shouldAssignRegionsWithFavoredNodes<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      ? ((FavoredStochasticBalancer) getBalancer()).getFavoredNodes(regionInfo)<a name="line.349"></a>
-<span class="sourceLineNo">350</span>      : ServerName.EMPTY_SERVER_LIST;<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  }<a name="line.351"></a>
-<span class="sourceLineNo">352</span><a name="line.352"></a>
-<span class="sourceLineNo">353</span>  // ============================================================================================<a name="line.353"></a>
-<span class="sourceLineNo">354</span>  //  Table State Manager helpers<a name="line.354"></a>
-<span class="sourceLineNo">355</span>  // ============================================================================================<a name="line.355"></a>
-<span class="sourceLineNo">356</span>  TableStateManager getTableStateManager() {<a name="line.356"></a>
-<span class="sourceLineNo">357</span>    return master.getTableStateManager();<a name="line.357"></a>
-<span class="sourceLineNo">358</span>  }<a name="line.358"></a>
-<span class="sourceLineNo">359</span><a name="line.359"></a>
-<span class="sourceLineNo">360</span>  public boolean isTableEnabled(final TableName tableName) {<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    return getTableStateManager().isTableState(tableName, TableState.State.ENABLED);<a name="line.361"></a>
-<span class="sourceLineNo">362</span>  }<a name="line.362"></a>
-<span class="sourceLineNo">363</span><a name="line.363"></a>
-<span class="sourceLineNo">364</span>  public boolean isTableDisabled(final TableName tableName) {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>    return getTableStateManager().isTableState(tableName,<a name="line.365"></a>
-<span class="sourceLineNo">366</span>      TableState.State.DISABLED, TableState.State.DISABLING);<a name="line.366"></a>
-<span class="sourceLineNo">367</span>  }<a name="line.367"></a>
-<span class="sourceLineNo">368</span><a name="line.368"></a>
-<span class="sourceLineNo">369</span>  // ============================================================================================<a name="line.369"></a>
-<span class="sourceLineNo">370</span>  //  META Helpers<a name="line.370"></a>
-<span class="sourceLineNo">371</span>  // ============================================================================================<a name="line.371"></a>
-<span class="sourceLineNo">372</span>  private boolean isMetaRegion(final RegionInfo regionInfo) {<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    return regionInfo.isMetaRegion();<a name="line.373"></a>
-<span class="sourceLineNo">374</span>  }<a name="line.374"></a>
-<span class="sourceLineNo">375</span><a name="line.375"></a>
-<span class="sourceLineNo">376</span>  public boolean isMetaRegion(final byte[] regionName) {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    return getMetaRegionFromName(regionName) != null;<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  }<a name="line.378"></a>
-<span class="sourceLineNo">379</span><a name="line.379"></a>
-<span class="sourceLineNo">380</span>  public RegionInfo getMetaRegionFromName(final byte[] regionName) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    for (RegionInfo hri: getMetaRegionSet()) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>      if (Bytes.equals(hri.getRegionName(), regionName)) {<a name="line.382"></a>
-<span class="sourceLineNo">383</span>        return hri;<a name="line.383"></a>
-<span class="sourceLineNo">384</span>      }<a name="line.384"></a>
-<span class="sourceLineNo">385</span>    }<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    return null;<a name="line.386"></a>
-<span class="sourceLineNo">387</span>  }<a name="line.387"></a>
-<span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>  public boolean isCarryingMeta(final ServerName serverName) {<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    // TODO: handle multiple meta<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    return isCarryingRegion(serverName, RegionInfoBuilder.FIRST_META_REGIONINFO);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>  }<a name="line.392"></a>
-<span class="sourceLineNo">393</span><a name="line.393"></a>
-<span class="sourceLineNo">394</span>  private boolean isCarryingRegion(final ServerName serverName, final RegionInfo regionInfo) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    // TODO: check for state?<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    final RegionStateNode node = regionStates.getRegionStateNode(regionInfo);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    return(node != null &amp;&amp; serverName.equals(node.getRegionLocation()));<a name="line.397"></a>
-<span class="sourceLineNo">398</span>  }<a name="line.398"></a>
-<span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>  private RegionInfo getMetaForRegion(final RegionInfo regionInfo) {<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    //if (regionInfo.isMetaRegion()) return regionInfo;<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    // TODO: handle multiple meta. if the region provided is not meta lookup<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    // which meta the region belongs to.<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    return RegionInfoBuilder.FIRST_META_REGIONINFO;<a name="line.404"></a>
-<span class="sourceLineNo">405</span>  }<a name="line.405"></a>
-<span class="sourceLineNo">406</span><a name="line.406"></a>
-<span class="sourceLineNo">407</span>  // TODO: handle multiple meta.<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  private static final Set&lt;RegionInfo&gt; META_REGION_SET =<a name="line.408"></a>
-<span class="sourceLineNo">409</span>      Collections.singleton(RegionInfoBuilder.FIRST_META_REGIONINFO);<a name="line.409"></a>
-<span class="sourceLineNo">410</span>  public Set&lt;RegionInfo&gt; getMetaRegionSet() {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    return META_REGION_SET;<a name="line.411"></a>
-<span class="sourceLineNo">412</span>  }<a name="line.412"></a>
-<span class="sourceLineNo">413</span><a name="line.413"></a>
-<span class="sourceLineNo">414</span>  // ============================================================================================<a name="line.414"></a>
-<span class="sourceLineNo">415</span>  //  META Event(s) helpers<a name="line.415"></a>
-<span class="sourceLineNo">416</span>  // ============================================================================================<a name="line.416"></a>
-<span class="sourceLineNo">417</span>  /**<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   * Notice that, this only means the meta region is available on a RS, but the AM may still be<a name="line.418"></a>
-<span class="sourceLineNo">419</span>   * loading the region states from meta, so usually you need to check {@link #isMetaLoaded()} first<a name="line.419"></a>
-<span class="sourceLineNo">420</span>   * before checking this method, unless you can make sure that your piece of code can only be<a name="line.420"></a>
-<span class="sourceLineNo">421</span>   * executed after AM builds the region states.<a name="line.421"></a>
-<span class="sourceLineNo">422</span>   * @see #isMetaLoaded()<a name="line.422"></a>
-<span class="sourceLineNo">423</span>   */<a name="line.423"></a>
-<span class="sourceLineNo">424</span>  public boolean isMetaAssigned() {<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    return metaAssignEvent.isReady();<a name="line.425"></a>
-<span class="sourceLineNo">426</span>  }<a name="line.426"></a>
-<span class="sourceLineNo">427</span><a name="line.427"></a>
-<span class="sourceLineNo">428</span>  public boolean isMetaRegionInTransition() {<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return !isMetaAssigned();<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  }<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  /**<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   * Notice that this event does not mean the AM has already finished region state rebuilding. See<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   * the comment of {@link #isMetaAssigned()} for more details.<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   * @see #isMetaAssigned()<a name="line.435"></a>
-<span class="sourceLineNo">436</span>   */<a name="line.436"></a>
-<span class="sourceLineNo">437</span>  public boolean waitMetaAssigned(Procedure&lt;?&gt; proc, RegionInfo regionInfo) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    return getMetaAssignEvent(getMetaForRegion(regionInfo)).suspendIfNotReady(proc);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>  }<a name="line.439"></a>
-<span class="sourceLineNo">440</span><a name="line.440"></a>
-<span class="sourceLineNo">441</span>  private void setMetaAssigned(RegionInfo metaRegionInfo, boolean assigned) {<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    assert isMetaRegion(metaRegionInfo) : "unexpected non-meta region " + metaRegionInfo;<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    ProcedureEvent&lt;?&gt; metaAssignEvent = getMetaAssignEvent(metaRegionInfo);<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    if (assigned) {<a name="line.444"></a>
-<span class="sourceLineNo">445</span>      metaAssignEvent.wake(getProcedureScheduler());<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    } else {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      metaAssignEvent.suspend();<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    }<a name="line.448"></a>
-<span class="sourceLineNo">449</span>  }<a name="line.449"></a>
-<span class="sourceLineNo">450</span><a name="line.450"></a>
-<span class="sourceLineNo">451</span>  private ProcedureEvent&lt;?&gt; getMetaAssignEvent(RegionInfo metaRegionInfo) {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    assert isMetaRegion(metaRegionInfo) : "unexpected non-meta region " + metaRegionInfo;<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    // TODO: handle multiple meta.<a name="line.453"></a>
-<span class="sourceLineNo">454</span>    return metaAssignEvent;<a name="line.454"></a>
-<span class="sourceLineNo">455</span>  }<a name="line.455"></a>
-<span class="sourceLineNo">456</span><a name="line.456"></a>
-<span class="sourceLineNo">457</span>  /**<a name="line.457"></a>
-<span class="sourceLineNo">458</span>   * Wait until AM finishes the meta loading, i.e, the region states rebuilding.<a name="line.458"></a>
-<span class="sourceLineNo">459</span>   * @see #isMetaLoaded()<a name="line.459"></a>
-<span class="sourceLineNo">460</span>   * @see #waitMetaAssigned(Procedure, RegionInfo)<a name="line.460"></a>
-<span class="sourceLineNo">461</span>   */<a name="line.461"></a>
-<span class="sourceLineNo">462</span>  public boolean waitMetaLoaded(Procedure&lt;?&gt; proc) {<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    return metaLoadEvent.suspendIfNotReady(proc);<a name="line.463"></a>
-<span class="sourceLineNo">464</span>  }<a name="line.464"></a>
-<span class="sourceLineNo">465</span><a name="line.465"></a>
-<span class="sourceLineNo">466</span>  @VisibleForTesting<a name="line.466"></a>
-<span class="sourceLineNo">467</span>  void wakeMetaLoadedEvent() {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>    metaLoadEvent.wake(getProcedureScheduler());<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    assert isMetaLoaded() : "expected meta to be loaded";<a name="line.469"></a>
-<span class="sourceLineNo">470</span>  }<a name="line.470"></a>
-<span class="sourceLineNo">471</span><a name="line.471"></a>
-<span class="sourceLineNo">472</span>  /**<a name="line.472"></a>
-<span class="sourceLineNo">473</span>   * Return whether AM finishes the meta loading, i.e, the region states rebuilding.<a name="line.473"></a>
-<span class="sourceLineNo">474</span>   * @see #isMetaAssigned()<a name="line.474"></a>
-<span class="sourceLineNo">475</span>   * @see #waitMetaLoaded(Procedure)<a name="line.475"></a>
-<span class="sourceLineNo">476</span>   */<a name="line.476"></a>
-<span class="sourceLineNo">477</span>  public boolean isMetaLoaded() {<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    return metaLoadEvent.isReady();<a name="line.478"></a>
-<span class="sourceLineNo">479</span>  }<a name="line.479"></a>
-<span class="sourceLineNo">480</span><a name="line.480"></a>
-<span class="sourceLineNo">481</span>  /**<a name="line.481"></a>
-<span class="sourceLineNo">482</span>   * Start a new thread to check if there are region servers whose versions are higher than others.<a name="line.482"></a>
-<span class="sourceLineNo">483</span>   * If so, move all system table regions to RS with the highest version to keep compatibility.<a name="line.483"></a>
-<span class="sourceLineNo">484</span>   * The reason is, RS in new version may not be able to access RS in old version when there are<a name="line.484"></a>
-<span class="sourceLineNo">485</span>   * some incompatible changes.<a name="line.485"></a>
-<span class="sourceLineNo">486</span>   * &lt;p&gt;This method is called when a new RegionServer is added to cluster only.&lt;/p&gt;<a name="line.486"></a>
-<span class="sourceLineNo">487</span>   */<a name="line.487"></a>
-<span class="sourceLineNo">488</span>  public void checkIfShouldMoveSystemRegionAsync() {<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    // TODO: Fix this thread. If a server is killed and a new one started, this thread thinks that<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    // it should 'move' the system tables from the old server to the new server but<a name="line.490"></a>
-<span class="sourceLineNo">491</span>    // ServerCrashProcedure is on it; and it will take care of the assign without dataloss.<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    if (this.master.getServerManager().countOfRegionServers() &lt;= 1) {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      return;<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    }<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    // This thread used to run whenever there was a change in the cluster. The ZooKeeper<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    // childrenChanged notification came in before the nodeDeleted message and so this method<a name="line.496"></a>
-<span class="sourceLineNo">497</span>    // cold run before a ServerCrashProcedure could run. That meant that this thread could see<a name="line.497"></a>
-<span class="sourceLineNo">498</span>    // a Crashed Server before ServerCrashProcedure and it could find system regions on the<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    // crashed server and go move them before ServerCrashProcedure had a chance; could be<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    // dataloss too if WALs were not recovered.<a name="line.500"></a>
-<span class="sourceLineNo">501</span>    new Thread(() -&gt; {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      try {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>        synchronized (checkIfShouldMoveSystemRegionLock) {<a name="line.503"></a>
-<span class="sourceLineNo">504</span>          List&lt;RegionPlan&gt; plans = new ArrayList&lt;&gt;();<a name="line.504"></a>
-<span class="sourceLineNo">505</span>          // TODO: I don't think this code does a good job if all servers in cluster have same<a name="line.505"></a>
-<span class="sourceLineNo">506</span>          // version. It looks like it will schedule unnecessary moves.<a name="line.506"></a>
-<span class="sourceLineNo">507</span>          for (ServerName server : getExcludedServersForSystemTable()) {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>            if (master.getServerManager().isServerDead(server)) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>              // TODO: See HBASE-18494 and HBASE-18495. Though getExcludedServersForSystemTable()<a name="line.509"></a>
-<span class="sourceLineNo">510</span>              // considers only online servers, the server could be queued for dead server<a name="line.510"></a>
-<span class="sourceLineNo">511</span>              // processing. As region assignments for crashed server is handled by<a name="line.511"></a>
-<span class="sourceLineNo">512</span>              // ServerCrashProcedure, do NOT handle them here. The goal is to handle this through<a name="line.512"></a>
-<span class="sourceLineNo">513</span>              // regular flow of LoadBalancer as a favored node and not to have this special<a name="line.513"></a>
-<span class="sourceLineNo">514</span>              // handling.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>              continue;<a name="line.515"></a>
-<span class="sourceLineNo">516</span>            }<a name="line.516"></a>
-<span class="sourceLineNo">517</span>            List&lt;RegionInfo&gt; regionsShouldMove = getSystemTables(server);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>            if (!regionsShouldMove.isEmpty()) {<a name="line.518"></a>
-<span class="sourceLineNo">519</span>              for (RegionInfo regionInfo : regionsShouldMove) {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>                // null value for dest forces destination server to be selected by balancer<a name="line.520"></a>
-<span class="sourceLineNo">521</span>                RegionPlan plan = new RegionPlan(regionInfo, server, null);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>                if (regionInfo.isMetaRegion()) {<a name="line.522"></a>
-<span class="sourceLineNo">523</span>                  // Must move meta region first.<a name="line.523"></a>
-<span class="sourceLineNo">524</span>                  LOG.info("Async MOVE of {} to newer Server={}",<a name="line.524"></a>
-<span class="sourceLineNo">525</span>                      regionInfo.getEncodedName(), server);<a name="line.525"></a>
-<span class="sourceLineNo">526</span>                  moveAsync(plan);<a name="line.526"></a>
-<span class="sourceLineNo">527</span>                } else {<a name="line.527"></a>
-<span class="sourceLineNo">528</span>                  plans.add(plan);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>                }<a name="line.529"></a>
-<span class="sourceLineNo">530</span>              }<a name="line.530"></a>
-<span class="sourceLineNo">531</span>            }<a name="line.531"></a>
-<span class="sourceLineNo">532</span>            for (RegionPlan plan : plans) {<a name="line.532"></a>
-<span class="sourceLineNo">533</span>              LOG.info("Async MOVE of {} to newer Server={}",<a name="line.533"></a>
-<span class="sourceLineNo">534</span>                  plan.getRegionInfo().getEncodedName(), server);<a name="line.534"></a>
-<span class="sourceLineNo">535</span>              moveAsync(plan);<a name="line.535"></a>
-<span class="sourceLineNo">536</span>            }<a name="line.536"></a>
-<span class="sourceLineNo">537</span>          }<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        }<a name="line.538"></a>
-<span class="sourceLineNo">539</span>      } catch (Throwable t) {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        LOG.error(t.toString(), t);<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      }<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    }).start();<a name="line.542"></a>
-<span class="sourceLineNo">543</span>  }<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>  private List&lt;RegionInfo&gt; getSystemTables(ServerName serverName) {<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    ServerStateNode serverNode = regionStates.getServerNode(serverName);<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    if (serverNode == null) {<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      return Collections.emptyList();<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    }<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    return serverNode.getSystemRegionInfoList();<a name="line.550"></a>
-<span class="sourceLineNo">551</span>  }<a name="line.551"></a>
-<span class="sourceLineNo">552</span><a name="line.552"></a>
-<span class="sourceLineNo">553</span>  private void preTransitCheck(RegionStateNode regionNode, RegionState.State[] expectedStates)<a name="line.553"></a>
-<span class="sourceLineNo">554</span>      throws HBaseIOException {<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    if (regionNode.getProcedure() != null) {<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      throw new HBaseIOException(regionNode + " is currently in transition");<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    if (!regionNode.isInState(expectedStates)) {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      throw new DoNotRetryRegionException("Unexpected state for " + regionNode);<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    }<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    if (getTableStateManager().isTableState(regionNode.getTable(), TableState.State.DISABLING,<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      TableState.State.DISABLED)) {<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      throw new DoNotRetryIOException(regionNode.getTable() + " is disabled for " + regionNode);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    }<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  }<a name="line.565"></a>
-<span class="sourceLineNo">566</span><a name="line.566"></a>
-<span class="sourceLineNo">567</span>  // TODO: Need an async version of this for hbck2.<a name="line.567"></a>
-<span class="sourceLineNo">568</span>  public long assign(RegionInfo regionInfo, ServerName sn) throws IOException {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    // TODO: should we use getRegionStateNode?<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    RegionStateNode regionNode = regionStates.getOrCreateRegionStateNode(regionInfo);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    TransitRegionStateProcedure proc;<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    regionNode.lock();<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    try {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      preTransitCheck(regionNode, STATES_EXPECTED_ON_ASSIGN);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      proc = TransitRegionStateProcedure.assign(getProcedureEnvironment(), regionInfo, sn);<a name="line.575"></a>
-<span class="sourceLineNo">576</span>      regionNode.setProcedure(proc);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>    } finally {<a name="line.577"></a>
-<span class="sourceLineNo">578</span>      regionNode.unlock();<a name="line.578"></a>
-<span class="sourceLineNo">579</span>    }<a name="line.579"></a>
-<span class="sourceLineNo">580</span>    ProcedureSyncWait.submitAndWaitProcedure(master.getMasterProcedureExecutor(), proc);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>    return proc.getProcId();<a name="line.581"></a>
-<span class="sourceLineNo">582</span>  }<a name="line.582"></a>
-<span class="sourceLineNo">583</span><a name="line.583"></a>
-<span class="sourceLineNo">584</span>  public long assign(RegionInfo regionInfo) throws IOException {<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    return assign(regionInfo, null);<a name="line.585"></a>
-<span class="sourceLineNo">586</span>  }<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>  public long unassign(RegionInfo regionInfo) throws IOException {<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    RegionStateNode regionNode = regionStates.getRegionStateNode(regionInfo);<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    if (regionNode == null) {<a name="line.590"></a>
-<span class="sourceLineNo">591</span>      throw new UnknownRegionException("No RegionState found for " + regionInfo.getEncodedName());<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    }<a name="line.592"></a>
-<span class="sourceLineNo">593</span>    TransitRegionStateProcedure proc;<a name="line.593"></a>
-<span class="sourceLineNo">594</span>    regionNode.lock();<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    try {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>      preTransitCheck(regionNode, STATES_EXPECTED_ON_UNASSIGN_OR_MOVE);<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      proc = TransitRegionStateProcedure.unassign(getProcedureEnvironment(), regionInfo);<a name="line.597"></a>
-<span class="sourceLineNo">598</span>      regionNode.setProcedure(proc);<a name="line.598"></a>
-<span class="sourceLineNo">599</span>    } finally {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      regionNode.unlock();<a name="line.600"></a>
-<span class="sourceLineNo">601</span>    }<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    ProcedureSyncWait.submitAndWaitProcedure(master.getMasterProcedureExecutor(), proc);<a name="line.602"></a>
-<span class="sourceLineNo">603</span>    return proc.getProcId();<a name="line.603"></a>
-<span class="sourceLineNo">604</span>  }<a name="line.604"></a>
-<span class="sourceLineNo">605</span><a name="line.605"></a>
-<span class="sourceLineNo">606</span>  public TransitRegionStateProcedure createMoveRegionProcedure(RegionInfo regionInfo,<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      ServerName targetServer) throws HBaseIOException {<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    RegionStateNode regionNode = this.regionStates.getRegionStateNode(regionInfo);<a name="line.608"></a>
-<span class="sourceLineNo">609</span>    if (regionNode == null) {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>      throw new UnknownRegionException("No RegionState found for " + regionInfo.getEncodedName());<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    TransitRegionStateProcedure proc;<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    regionNode.lock();<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    try {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>      preTransitCheck(regionNode, STATES_EXPECTED_ON_UNASSIGN_OR_MOVE);<a name="line.615"></a>
-<span class="sourceLineNo">616</span>      regionNode.checkOnline();<a name="line.616"></a>
-<span class="sourceLineNo">617</span>      proc = TransitRegionStateProcedure.move(getProcedureEnvironment(), regionInfo, targetServer);<a name="line.617"></a>
-<span class="sourceLineNo">618</span>      regionNode.setProcedure(proc);<a name="line.618"></a>
-<span class="sourceLineNo">619</span>    } finally {<a name="line.619"></a>
-<span class="sourceLineNo">620</span>      regionNode.unlock();<a name="line.620"></a>
-<span class="sourceLineNo">621</span>    }<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    return proc;<a name="line.622"></a>
-<span class="sourceLineNo">623</span>  }<a name="line.623"></a>
-<span class="sourceLineNo">624</span><a name="line.624"></a>
-<span class="sourceLineNo">625</span>  public void move(RegionInfo regionInfo) throws IOException {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    TransitRegionStateProcedure proc = createMoveRegionProcedure(regionInfo, null);<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    ProcedureSyncWait.submitAndWaitProcedure(master.getMasterProcedureExecutor(), proc);<a name="line.627"></a>
-<span class="sourceLineNo">628</span>  }<a name="line.628"></a>
-<span class="sourceLineNo">629</span><a name="line.629"></a>
-<span class="sourceLineNo">630</span>  public Future&lt;byte[]&gt; moveAsync(RegionPlan regionPlan) throws HBaseIOException {<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    TransitRegionStateProcedure proc =<a name="line.631"></a>
-<span class="sourceLineNo">632</span>      createMoveRegionProcedure(regionPlan.getRegionInfo(), regionPlan.getDestination());<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    return ProcedureSyncWait.submitProcedure(master.getMasterProcedureExecutor(), proc);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>  }<a name="line.634"></a>
-<span class="sourceLineNo">635</span><a name="line.635"></a>
-<span class="sourceLineNo">636</span>  // ============================================================================================<a name="line.636"></a>
-<span class="sourceLineNo">637</span>  //  RegionTransition procedures helpers<a name="line.637"></a>
-<span class="sourceLineNo">638</span>  // ============================================================================================<a name="line.638"></a>
-<span class="sourceLineNo">639</span><a name="line.639"></a>
-<span class="sourceLineNo">640</span>  /**<a name="line.640"></a>
-<span class="sourceLineNo">641</span>   * Create round-robin assigns. Use on table creation to distribute out regions across cluster.<a name="line.641"></a>
-<span class="sourceLineNo">642</span>   * @return AssignProcedures made out of the passed in &lt;code&gt;hris&lt;/code&gt; and a call to the balancer<a name="line.642"></a>
-<span class="sourceLineNo">643</span>   *         to populate the assigns with targets chosen using round-robin (default balancer<a name="line.643"></a>
-<span class="sourceLineNo">644</span>   *         scheme). If at assign-time, the target chosen is no longer up, thats fine, the<a name="line.644"></a>
-<span class="sourceLineNo">645</span>   *         AssignProcedure will ask the balancer for a new target, and so on.<a name="line.645"></a>
-<span class="sourceLineNo">646</span>   */<a name="line.646"></a>
-<span class="sourceLineNo">647</span>  public TransitRegionStateProcedure[] createRoundRobinAssignProcedures(List&lt;RegionInfo&gt; hris,<a name="line.647"></a>
-<span class="sourceLineNo">648</span>      List&lt;ServerName&gt; serversToExclude) {<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    if (hris.isEmpty()) {<a name="line.649"></a>
-<span class="sourceLineNo">650</span>      return new TransitRegionStateProcedure[0];<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    }<a name="line.651"></a>
-<span class="sourceLineNo">652</span><a name="line.652"></a>
-<span class="sourceLineNo">653</span>    if (serversToExclude != null<a name="line.653"></a>
-<span class="sourceLineNo">654</span>        &amp;&amp; this.master.getServerManager().getOnlineServersList().size() == 1) {<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      LOG.debug("Only one region server found and hence going ahead with the assignment");<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      serversToExclude = null;<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    }<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    try {<a name="line.658"></a>
-<span class="sourceLineNo">659</span>      // Ask the balancer to assign our regions. Pass the regions en masse. The balancer can do<a name="line.659"></a>
-<span class="sourceLineNo">660</span>      // a better job if it has all the assignments in the one lump.<a name="line.660"></a>
-<span class="sourceLineNo">661</span>      Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = getBalancer().roundRobinAssignment(hris,<a name="line.661"></a>
-<span class="sourceLineNo">662</span>        this.master.getServerManager().createDestinationServersList(serversToExclude));<a name="line.662"></a>
-<span class="sourceLineNo">663</span>      // Return mid-method!<a name="line.663"></a>
-<span class="sourceLineNo">664</span>      return createAssignProcedures(assignments);<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    } catch (HBaseIOException hioe) {<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      LOG.warn("Failed roundRobinAssignment", hioe);<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    }<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    // If an error above, fall-through to this simpler assign. Last resort.<a name="line.668"></a>
-<span class="sourceLineNo">669</span>    return createAssignProcedures(hris);<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  }<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>  /**<a name="line.672"></a>
-<span class="sourceLineNo">673</span>   * Create round-robin assigns. Use on table creation to distribute out regions across cluster.<a name="line.673"></a>
-<span class="sourceLineNo">674</span>   * @return AssignProcedures made out of the passed in &lt;code&gt;hris&lt;/code&gt; and a call to the balancer<a name="line.674"></a>
-<span class="sourceLineNo">675</span>   *         to populate the assigns with targets chosen using round-robin (default balancer<a name="line.675"></a>
-<span class="sourceLineNo">676</span>   *         scheme). If at assign-time, the target chosen is no longer up, thats fine, the<a name="line.676"></a>
-<span class="sourceLineNo">677</span>   *         AssignProcedure will ask the balancer for a new target, and so on.<a name="line.677"></a>
-<span class="sourceLineNo">678</span>   */<a name="line.678"></a>
-<span class="sourceLineNo">679</span>  public TransitRegionStateProcedure[] createRoundRobinAssignProcedures(List&lt;RegionInfo&gt; hris) {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>    return createRoundRobinAssignProcedures(hris, null);<a name="line.680"></a>
-<span class="sourceLineNo">681</span>  }<a name="line.681"></a>
-<span class="sourceLineNo">682</span><a name="line.682"></a>
-<span class="sourceLineNo">683</span>  @VisibleForTesting<a name="line.683"></a>
-<span class="sourceLineNo">684</span>  static int compare(TransitRegionStateProcedure left, TransitRegionStateProcedure right) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>    if (left.getRegion().isMetaRegion()) {<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      if (right.getRegion().isMetaRegion()) {<a name="line.686"></a>
-<span class="sourceLineNo">687</span>        return RegionInfo.COMPARATOR.compare(left.getRegion(), right.getRegion());<a name="line.687"></a>
-<span class="sourceLineNo">688</span>      }<a name="line.688"></a>
-<span class="sourceLineNo">689</span>      return -1;<a name="line.689"></a>
-<span class="sourceLineNo">690</span>    } else if (right.getRegion().isMetaRegion()) {<a name="line.690"></a>
-<span class="sourceLineNo">691</span>      return +1;<a name="line.691"></a>
-<span class="sourceLineNo">692</span>    }<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    if (left.getRegion().getTable().isSystemTable()) {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>      if (right.getRegion().getTable().isSystemTable()) {<a name="line.694"></a>
-<span class="sourceLineNo">695</span>        return RegionInfo.COMPARATOR.compare(left.getRegion(), right.getRegion());<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      }<a name="line.696"></a>
-<span class="sourceLineNo">697</span>      return -1;<a name="line.697"></a>
-<span class="sourceLineNo">698</span>    } else if (right.getRegion().getTable().isSystemTable()) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      return +1;<a name="line.699"></a>
-<span class="sourceLineNo">700</span>    }<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    return RegionInfo.COMPARATOR.compare(left.getRegion(), right.getRegion());<a name="line.701"></a>
-<span class="sourceLineNo">702</span>  }<a name="line.702"></a>
-<span class="sourceLineNo">703</span><a name="line.703"></a>
-<span class="sourceLineNo">704</span>  private TransitRegionStateProcedure createAssignProcedure(RegionStateNode regionNode,<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      ServerName targetServer, boolean override) {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>    TransitRegionStateProcedure proc;<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    regionNode.lock();<a name="line.707"></a>
-<span class="sourceLineNo">708</span>    try {<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      if(override &amp;&amp; regionNode.getProcedure() != null) {<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        regionNode.unsetProcedure(regionNode.getProcedure());<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      }<a name="line.711"></a>
-<span class="sourceLineNo">712</span>      assert regionNode.getProcedure() == null;<a name="line.712"></a>
-<span class="sourceLineNo">713</span>      proc = TransitRegionStateProcedure.assign(getProcedureEnvironment(),<a name="line.713"></a>
-<span class="sourceLineNo">714</span>        regionNode.getRegionInfo(), targetServer);<a name="line.714"></a>
-<span class="sourceLineNo">715</span>      regionNode.setProcedure(proc);<a name="line.715"></a>
-<span class="sourceLineNo">716</span>    } finally {<a name="line.716"></a>
-<span class="sourceLineNo">717</span>      regionNode.unlock();<a name="line.717"></a>
-<span class="sourceLineNo">718</span>    }<a name="line.718"></a>
-<span class="sourceLineNo">719</span>    return proc;<a name="line.719"></a>
-<span class="sourceLineNo">720</span>  }<a name="line.720"></a>
-<span class="sourceLineNo">721</span><a name="line.721"></a>
-<span class="sourceLineNo">722</span>  private TransitRegionStateProcedure createUnassignProcedure(RegionStateNode regionNode,<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      boolean override) {<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    TransitRegionStateProcedure proc;<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    regionNode.lock();<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    try {<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      if(override &amp;&amp; regionNode.getProcedure() != null) {<a name="line.727"></a>
-<span class="sourceLineNo">728</span>        regionNode.unsetProcedure(regionNode.getProcedure());<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      }<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      assert regionNode.getProcedure() == null;<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      proc = TransitRegionStateProcedure.unassign(getProcedureEnvironment(),<a name="line.731"></a>
-<span class="sourceLineNo">732</span>          regionNode.getRegionInfo());<a name="line.732"></a>
-<span class="sourceLineNo">733</span>      regionNode.setProcedure(proc);<a name="line.733"></a>
-<span class="sourceLineNo">734</span>    } finally {<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      regionNode.unlock();<a name="line.735"></a>
-<span class="sourceLineNo">736</span>    }<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    return proc;<a name="line.737"></a>
-<span class="sourceLineNo">738</span>  }<a name="line.738"></a>
-<span class="sourceLineNo">739</span><a name="line.739"></a>
-<span class="sourceLineNo">740</span>  /**<a name="line.740"></a>
-<span class="sourceLineNo">741</span>   * Create one TransitRegionStateProcedure to assign a region w/o specifying a target server.<a name="line.741"></a>
-<span class="sourceLineNo">742</span>   * This method is specified for HBCK2<a name="line.742"></a>
-<span class="sourceLineNo">743</span>   */<a name="line.743"></a>
-<span class="sourceLineNo">744</span>  public TransitRegionStateProcedure createOneAssignProcedure(RegionInfo hri, boolean override) {<a name="line.744"></a>
-<span class="sourceLineNo">745</span>    RegionStateNode regionNode = regionStates.getOrCreateRegionStateNode(hri);<a name="line.745"></a>
-<span class="sourceLineNo">746</span>    return createAssignProcedure(regionNode, null, override);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>  }<a name="line.747"></a>
-<span class="sourceLineNo">748</span><a name="line.748"></a>
-<span class="sourceLineNo">749</span>  /**<a name="line.749"></a>
-<span class="sourceLineNo">750</span>   * Create one TransitRegionStateProcedure to unassign a region.<a name="line.750"></a>
-<span class="sourceLineNo">751</span>   * This method is specified for HBCK2<a name="line.751"></a>
-<span class="sourceLineNo">752</span>   */<a name="line.752"></a>
-<span class="sourceLineNo">753</span>  public TransitRegionStateProcedure createOneUnassignProcedure(RegionInfo hri, boolean override) {<a name="line.753"></a>
-<span class="sourceLineNo">754</span>    RegionStateNode regionNode = regionStates.getOrCreateRegionStateNode(hri);<a name="line.754"></a>
-<span class="sourceLineNo">755</span>    return createUnassignProcedure(regionNode, override);<a name="line.755"></a>
-<span class="sourceLineNo">756</span>  }<a name="line.756"></a>
-<span class="sourceLineNo">757</span><a name="line.757"></a>
-<span class="sourceLineNo">758</span>  /**<a name="line.758"></a>
-<span class="sourceLineNo">759</span>   * Create an array of TransitRegionStateProcedure w/o specifying a target server.<a name="line.759"></a>
-<span class="sourceLineNo">760</span>   * &lt;p/&gt;<a name="line.760"></a>
-<span class="sourceLineNo">761</span>   * If no target server, at assign time, we will try to use the former location of the region if<a name="line.761"></a>
-<span class="sourceLineNo">762</span>   * one exists. This is how we 'retain' the old location across a server restart.<a name="line.762"></a>
-<span class="sourceLineNo">763</span>   * &lt;p/&gt;<a name="line.763"></a>
-<span class="sourceLineNo">764</span>   * Should only be called when you can make sure that no one can touch these regions other than<a name="line.764"></a>
-<span class="sourceLineNo">765</span>   * you. For example, when you are creating table.<a name="line.765"></a>
-<span class="sourceLineNo">766</span>   */<a name="line.766"></a>
-<span class="sourceLineNo">767</span>  public TransitRegionStateProcedure[] createAssignProcedures(List&lt;RegionInfo&gt; hris) {<a name="line.767"></a>
-<span class="sourceLineNo">768</span>    return hris.stream().map(hri -&gt; regionStates.getOrCreateRegionStateNode(hri))<a name="line.768"></a>
-<span class="sourceLineNo">769</span>        .map(regionNode -&gt; createAssignProcedure(regionNode, null, false))<a name="line.769"></a>
-<span class="sourceLineNo">770</span>        .sorted(AssignmentManager::compare).toArray(TransitRegionStateProcedure[]::new);<a name="line.770"></a>
-<span class="sourceLineNo">771</span>  }<a name="line.771"></a>
-<span class="sourceLineNo">772</span><a name="line.772"></a>
-<span class="sourceLineNo">773</span>  /**<a name="line.773"></a>
-<span class="sourceLineNo">774</span>   * @param assignments Map of assignments from which we produce an array of AssignProcedures.<a name="line.774"></a>
-<span class="sourceLineNo">775</span>   * @return Assignments made from the passed in &lt;code&gt;assignments&lt;/code&gt;<a name="line.775"></a>
-<span class="sourceLineNo">776</span>   */<a name="line.776"></a>
-<span class="sourceLineNo">777</span>  private TransitRegionStateProcedure[] createAssignProcedures(<a name="line.777"></a>
-<span class="sourceLineNo">778</span>      Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments) {<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    return assignments.entrySet().stream()<a name="line.779"></a>
-<span class="sourceLineNo">780</span>      .flatMap(e -&gt; e.getValue().stream().map(hri -&gt; regionStates.getOrCreateRegionStateNode(hri))<a name="line.780"></a>
-<span class="sourceLineNo">781</span>        .map(regionNode -&gt; createAssignProcedure(regionNode, e.getKey(), false)))<a name="line.781"></a>
-<span class="sourceLineNo">782</span>      .sorted(AssignmentManager::compare).toArray(TransitRegionStateProcedure[]::new);<a name="line.782"></a>
-<span class="sourceLineNo">783</span>  }<a name="line.783"></a>
-<span class="sourceLineNo">784</span><a name="line.784"></a>
-<span class="sourceLineNo">785</span>  /**<a name="line.785"></a>
-<span class="sourceLineNo">786</span>   * Called by DisableTableProcedure to unassign all the regions for a table.<a name="line.786"></a>
-<span class="sourceLineNo">787</span>   */<a name="line.787"></a>
-<span class="sourceLineNo">788</span>  public TransitRegionStateProcedure[] createUnassignProceduresForDisabling(TableName tableName) {<a name="line.788"></a>
-<span class="sourceLineNo">789</span>    return regionStates.getTableRegionStateNodes(tableName).stream().map(regionNode -&gt; {<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      regionNode.lock();<a name="line.790"></a>
-<span class="sourceLineNo">791</span>      try {<a name="line.791"></a>
-<span class="sourceLineNo">792</span>        if (!regionStates.include(regionNode, false) ||<a name="line.792"></a>
-<span class="sourceLineNo">793</span>          regionStates.isRegionOffline(regionNode.getRegionInfo())) {<a name="line.793"></a>
-<span class="sourceLineNo">794</span>          return null;<a name="line.794"></a>
-<span class="sourceLineNo">795</span>        }<a name="line.795"></a>
-<span class="sourceLineNo">796</span>        // As in DisableTableProcedure, we will hold the xlock for table, so we can make sure that<a name="line.796"></a>
-<span class="sourceLineNo">797</span>        // this procedure has not been executed yet, as TRSP will hold the shared lock for table all<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        // the time. So here we will unset it and when it is actually executed, it will find that<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        // the attach procedure is not itself and quit immediately.<a name="line.799"></a>
-<span class="sourceLineNo">800</span>        if (regionNode.getProcedure() != null) {<a name="line.800"></a>
-<span class="sourceLineNo">801</span>          regionNode.unsetProcedure(regionNode.getProcedure());<a name="line.801"></a>
-<span class="sourceLineNo">802</span>        }<a name="line.802"></a>
-<span class="sourceLineNo">803</span>        TransitRegionStateProcedure proc = TransitRegionStateProcedure<a name="line.803"></a>
-<span class="sourceLineNo">804</span>          .unassign(getProcedureEnvironment(), regionNode.getRegionInfo());<a name="line.804"></a>
-<span class="sourceLineNo">805</span>        regionNode.setProcedure(proc);<a name="line.805"></a>
-<span class="sourceLineNo">806</span>        return proc;<a name="line.806"></a>
-<span class="sourceLineNo">807</span>      } finally {<a name="line.807"></a>
-<span class="sourceLineNo">808</span>        regionNode.unlock();<a name="line.808"></a>
-<span class="sourceLineNo">809</span>      }<a name="line.809"></a>
-<span class="sourceLineNo">810</span>    }).filter(p -&gt; p != null).toArray(TransitRegionStateProcedure[]::new);<a name="line.810"></a>
-<span class="sourceLineNo">811</span>  }<a name="line.811"></a>
-<span class="sourceLineNo">812</span><a name="line.812"></a>
-<span class="sourceLineNo">813</span>  public SplitTableRegionProcedure createSplitProcedure(final RegionInfo regionToSplit,<a name="line.813"></a>
-<span class="sourceLineNo">814</span>      final byte[] splitKey) throws IOException {<a name="line.814"></a>
-<span class="sourceLineNo">815</span>    return new SplitTableRegionProcedure(getProcedureEnvironment(), regionToSplit, splitKey);<a name="line.815"></a>
-<span class="sourceLineNo">816</span>  }<a name="line.816"></a>
-<span class="sourceLineNo">817</span><a name="line.817"></a>
-<span class="sourceLineNo">818</span>  public MergeTableRegionsProcedure createMergeProcedure(final RegionInfo regionToMergeA,<a name="line.818"></a>
-<span class="sourceLineNo">819</span>      final RegionInfo regionToMergeB) throws IOException {<a name="line.819"></a>
-<span class="sourceLineNo">820</span>    return new MergeTableRegionsProcedure(getProcedureEnvironment(), regionToMergeA,regionToMergeB);<a name="line.820"></a>
-<span class="sourceLineNo">821</span>  }<a name="line.821"></a>
-<span class="sourceLineNo">822</span><a name="line.822"></a>
-<span class="sourceLineNo">823</span>  /**<a name="line.823"></a>
-<span class="sourceLineNo">824</span>   * Delete the region states. This is called by "DeleteTable"<a name="line.824"></a>
-<span class="sourceLineNo">825</span>   */<a name="line.825"></a>
-<span class="sourceLineNo">826</span>  public void deleteTable(final TableName tableName) throws IOException {<a name="line.826"></a>
-<span class="sourceLineNo">827</span>    final ArrayList&lt;RegionInfo&gt; regions = regionStates.getTableRegionsInfo(tableName);<a name="line.827"></a>
-<span class="sourceLineNo">828</span>    regionStateStore.deleteRegions(regions);<a name="line.828"></a>
-<span class="sourceLineNo">829</span>    for (int i = 0; i &lt; regions.size(); ++i) {<a name="line.829"></a>
-<span class="sourceLineNo">830</span>      final RegionInfo regionInfo = regions.get(i);<a name="line.830"></a>
-<span class="sourceLineNo">831</span>      // we expect the region to be offline<a name="line.831"></a>
-<span class="sourceLineNo">832</span>      regionStates.removeFromOfflineRegions(regionInfo);<a name="line.832"></a>
-<span class="sourceLineNo">833</span>      regionStates.deleteRegion(regionInfo);<a name="line.833"></a>
-<span class="sourceLineNo">834</span>    }<a name="line.834"></a>
-<span class="sourceLineNo">835</span>  }<a name="line.835"></a>
-<span class="sourceLineNo">836</span><a name="line.836"></a>
-<span class="sourceLineNo">837</span>  // ============================================================================================<a name="line.837"></a>
-<span class="sourceLineNo">838</span>  //  RS Region Transition Report helpers<a name="line.838"></a>
-<span class="sourceLineNo">839</span>  // ============================================================================================<a name="line.839"></a>
-<span class="sourceLineNo">840</span>  private void reportRegionStateTransition(ReportRegionStateTransitionResponse.Builder builder,<a name="line.840"></a>
-<span class="sourceLineNo">841</span>      ServerName serverName, List&lt;RegionStateTransition&gt; transitionList) throws IOException {<a name="line.841"></a>
-<span class="sourceLineNo">842</span>    for (RegionStateTransition transition : transitionList) {<a name="line.842"></a>
-<span class="sourceLineNo">843</span>      switch (transition.getTransitionCode()) {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>        case OPENED:<a name="line.844"></a>
-<span class="sourceLineNo">845</span>        case FAILED_OPEN:<a name="line.845"></a>
-<span class="sourceLineNo">846</span>        case CLOSED:<a name="line.846"></a>
-<span class="sourceLineNo">847</span>          assert transition.getRegionInfoCount() == 1 : transition;<a name="line.847"></a>
-<span class="sourceLineNo">848</span>          final RegionInfo hri = ProtobufUtil.toRegionInfo(transition.getRegionInfo(0));<a name="line.848"></a>
-<span class="sourceLineNo">849</span>          long procId =<a name="line.849"></a>
-<span class="sourceLineNo">850</span>            transition.getProcIdCount() &gt; 0 ? transition.getProcId(0) : Procedure.NO_PROC_ID;<a name="line.850"></a>
-<span class="sourceLineNo">851</span>          updateRegionTransition(serverName, transition.getTransitionCode(), hri,<a name="line.851"></a>
-<span class="sourceLineNo">852</span>            transition.hasOpenSeqNum() ? transition.getOpenSeqNum() : HConstants.NO_SEQNUM, procId);<a name="line.852"></a>
-<span class="sourceLineNo">853</span>          break;<a name="line.853"></a>
-<span class="sourceLineNo">854</span>        case READY_TO_SPLIT:<a name="line.854"></a>
-<span class="sourceLineNo">855</span>        case SPLIT:<a name="line.855"></a>
-<span class="sourceLineNo">856</span>        case SPLIT_REVERTED:<a name="line.856"></a>
-<span class="sourceLineNo">857</span>          assert transition.getRegionInfoCount() == 3 : transition;<a name="line.857"></a>
-<span class="sourceLineNo">858</span>          final RegionInfo parent = ProtobufUtil.toRegionInfo(transition.getRegionInfo(0));<a name="line.858"></a>
-<span class="sourceLineNo">859</span>          final RegionInfo splitA = ProtobufUtil.toRegionInfo(transition.getRegionInfo(1));<a name="line.859"></a>
-<span class="sourceLineNo">860</span>          final RegionInfo splitB = ProtobufUtil.toRegionInfo(transition.getRegionInfo(2));<a name="line.860"></a>
-<span class="sourceLineNo">861</span>          updateRegionSplitTransition(serverName, transition.getTransitionCode(), parent, splitA,<a name="line.861"></a>
-<span class="sourceLineNo">862</span>            splitB);<a name="line.862"></a>
-<span class="sourceLineNo">863</span>          break;<a name="line.863"></a>
-<span class="sourceLineNo">864</span>        case READY_TO_MERGE:<a name="line.864"></a>
-<span class="sourceLineNo">865</span>        case MERGED:<a name="line.865"></a>
-<span class="sourceLineNo">866</span>        case MERGE_REVERTED:<a name="line.866"></a>
-<span class="sourceLineNo">867</span>          assert transition.getRegionInfoCount() == 3 : transition;<a name="line.867"></a>
-<span class="sourceLineNo">868</span>          final RegionInfo merged = ProtobufUtil.toRegionInfo(transition.getRegionInfo(0));<a name="line.868"></a>
-<span class="sourceLineNo">869</span>          final RegionInfo mergeA = ProtobufUtil.toRegionInfo(transition.getRegionInfo(1));<a name="line.869"></a>
-<span class="sourceLineNo">870</span>          final RegionInfo mergeB = ProtobufUtil.toRegionInfo(transition.getRegionInfo(2));<a name="line.870"></a>
-<span class="sourceLineNo">871</span>          updateRegionMergeTransition(serverName, transition.getTransitionCode(), merged, mergeA,<a name="line.871"></a>
-<span class="sourceLineNo">872</span>            mergeB);<a name="line.872"></a>
-<span class="sourceLineNo">873</span>          break;<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      }<a name="line.874"></a>
-<span class="sourceLineNo">875</span>    }<a name="line.875"></a>
-<span class="sourceLineNo">876</span>  }<a name="line.876"></a>
-<span class="sourceLineNo">877</span><a name="line.877"></a>
-<span class="sourceLineNo">878</span>  public ReportRegionStateTransitionResponse reportRegionStateTransition(<a name="line.878"></a>
-<span class="sourceLineNo">879</span>      final ReportRegionStateTransitionRequest req) throws PleaseHoldException {<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    ReportRegionStateTransitionResponse.Builder builder =<a name="line.880"></a>
-<span class="sourceLineNo">881</span>        ReportRegionStateTransitionResponse.newBuilder();<a name="line.881"></a>
-<span class="sourceLineNo">882</span>    ServerName serverName = ProtobufUtil.toServerName(req.getServer());<a name="line.882"></a>
-<span class="sourceLineNo">883</span>    ServerStateNode serverNode = regionStates.getOrCreateServer(serverName);<a name="line.883"></a>
-<span class="sourceLineNo">884</span>    // here we have to acquire a read lock instead of a simple exclusive lock. This is because that<a name="line.884"></a>
-<span class="sourceLineNo">885</span>    // we should not block other reportRegionStateTransition call from the same region server. This<a name="line.885"></a>
-<span class="sourceLineNo">886</span>    // is not only about performance, but also to prevent dead lock. Think of the meta region is<a name="line.886"></a>
-<span class="sourceLineNo">887</span>    // also on the same region server and you hold the lock which blocks the<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    // reportRegionStateTransition for meta, and since meta is not online, you will block inside the<a name="line.888"></a>
-<span class="sourceLineNo">889</span>    // lock protection to wait for meta online...<a name="line.889"></a>
-<span class="sourceLineNo">890</span>    serverNode.readLock().lock();<a name="line.890"></a>
-<span class="sourceLineNo">891</span>    try {<a name="line.891"></a>
-<span class="sourceLineNo">892</span>      // we only accept reportRegionStateTransition if the region server is online, see the comment<a name="line.892"></a>
-<span class="sourceLineNo">893</span>      // above in submitServerCrash method and HBASE-21508 for more details.<a name="line.893"></a>
-<span class="sourceLineNo">894</span>      if (serverNode.isInState(ServerState.ONLINE)) {<a name="line.894"></a>
-<span class="sourceLineNo">895</span>        try {<a name="line.895"></a>
-<span class="sourceLineNo">896</span>          reportRegionStateTransition(builder, serverName, req.getTransitionList());<a name="line.896"></a>
-<span class="sourceLineNo">897</span>        } catch (PleaseHoldException e) {<a name="line.897"></a>
-<span class="sourceLineNo">898</span>          LOG.trace("Failed transition ", e);<a name="line.898"></a>
-<span class="sourceLineNo">899</span>          throw e;<a name="line.899"></a>
-<span class="sourceLineNo">900</span>        } catch (UnsupportedOperationException | IOException e) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>          // TODO: at the moment we have a single error message and the RS will abort<a name="line.901"></a>
-<span class="sourceLineNo">902</span>          // if the master says that one of the region transitions failed.<a name="line.902"></a>
-<span class="sourceLineNo">903</span>          LOG.warn("Failed transition", e);<a name="line.903"></a>
-<span class="sourceLineNo">904</span>          builder.setErrorMessage("Failed transition " + e.getMessage());<a name="line.904"></a>
-<span class="sourceLineNo">905</span>        }<a name="line.905"></a>
-<span class="sourceLineNo">906</span>      } else {<a name="line.906"></a>
-<span class="sourceLineNo">907</span>        LOG.warn("The region server {} is already dead, skip reportRegionStateTransition call",<a name="line.907"></a>
-<span class="sourceLineNo">908</span>          serverName);<a name="line.908"></a>
-<span class="sourceLineNo">909</span>        builder.setErrorMessage("You are dead");<a name="line.909"></a>
-<span class="sourceLineNo">910</span>      }<a name="line.910"></a>
-<span class="sourceLineNo">911</span>    } finally {<a name="line.911"></a>
-<span class="sourceLineNo">912</span>      serverNode.readLock().unlock();<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    }<a name="line.913"></a>
-<span class="sourceLineNo">914</span><a name="line.914"></a>
-<span class="sourceLineNo">915</span>    return builder.build();<a name="line.915"></a>
-<span class="sourceLineNo">916</span>  }<a name="line.916"></a>
-<span class="sourceLineNo">917</span><a name="line.917"></a>
-<span class="sourceLineNo">918</span>  private void updateRegionTransition(ServerName serverName, TransitionCode state,<a name="line.918"></a>
-<span class="sourceLineNo">919</span>      RegionInfo regionInfo, long seqId, long procId) throws IOException {<a name="line.919"></a>
-<span class="sourceLineNo">920</span>    checkMetaLoaded(regionInfo);<a name="line.920"></a>
-<span class="sourceLineNo">921</span><a name="line.921"></a>
-<span class="sourceLineNo">922</span>    RegionStateNode regionNode = regionStates.getRegionStateNode(regionInfo);<a name="line.922"></a>
-<span class="sourceLineNo">923</span>    if (regionNode == null) {<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      // the table/region is gone. maybe a delete, split, merge<a name="line.924"></a>
-<span class="sourceLineNo">925</span>      throw new UnexpectedStateException(String.format(<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        "Server %s was trying to transition region %s to %s. but the region was removed.",<a name="line.926"></a>
-<span class="sourceLineNo">927</span>        serverName, regionInfo, state));<a name="line.927"></a>
-<span class="sourceLineNo">928</span>    }<a name="line.928"></a>
-<span class="sourceLineNo">929</span>    LOG.trace("Update region transition serverName={} region={} regionState={}", serverName,<a name="line.929"></a>
-<span class="sourceLineNo">930</span>      regionNode, state);<a name="line.930"></a>
-<span class="sourceLineNo">931</span><a name="line.931"></a>
-<span class="sourceLineNo">932</span>    ServerStateNode serverNode = regionStates.getOrCreateServer(serverName);<a name="line.932"></a>
-<span class="sourceLineNo">933</span>    regionNode.lock();<a name="line.933"></a>
-<span class="sourceLineNo">934</span>    try {<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      if (!reportTransition(regionNode, serverNode, state, seqId, procId)) {<a name="line.935"></a>
-<span class="sourceLineNo">936</span>        // Don't log WARN if shutting down cluster; during shutdown. Avoid the below messages:<a name="line.936"></a>
-<span class="sourceLineNo">937</span>        // 2018-08-13 10:45:10,551 WARN ...AssignmentManager: No matching procedure found for<a name="line.937"></a>
-<span class="sourceLineNo">938</span>        // rit=OPEN, location=ve0538.halxg.cloudera.com,16020,1533493000958,<a name="line.938"></a>
-<span class="sourceLineNo">939</span>        // table=IntegrationTestBigLinkedList, region=65ab289e2fc1530df65f6c3d7cde7aa5 transition<a name="line.939"></a>
-<span class="sourceLineNo">940</span>        // to CLOSED<a name="line.940"></a>
-<span class="sourceLineNo">941</span>        // These happen because on cluster shutdown, we currently let the RegionServers close<a name="line.941"></a>
-<span class="sourceLineNo">942</span>        // regions. This is the only time that region close is not run by the Master (so cluster<a name="line.942"></a>
-<span class="sourceLineNo">943</span>        // goes down fast). Consider changing it so Master runs all shutdowns.<a name="line.943"></a>
-<span class="sourceLineNo">944</span>        if (this.master.getServerManager().isClusterShutdown() &amp;&amp;<a name="line.944"></a>
-<span class="sourceLineNo">945</span>          state.equals(TransitionCode.CLOSED)) {<a name="line.945"></a>
-<span class="sourceLineNo">946</span>          LOG.info("RegionServer {} {}", state, regionNode.getRegionInfo().getEncodedName());<a name="line.946"></a>
-<span class="sourceLineNo">947</span>        } else {<a name="line.947"></a>
-<span class="sourceLineNo">948</span>          LOG.warn("No matching procedure found for {} transition to {}", regionNode, state);<a name="line.948"></a>
-<span class="sourceLineNo">949</span>        }<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      }<a name="line.950"></a>
-<span class="sourceLineNo">951</span>    } finally {<a name="line.951"></a>
-<span class="sourceLineNo">952</span>      regionNode.unlock();<a name="line.952"></a>
-<span class="sourceLineNo">953</span>    }<a name="line.953"></a>
-<span class="sourceLineNo">954</span>  }<a name="line.954"></a>
-<span class="sourceLineNo">955</span><a name="line.955"></a>
-<span class="sourceLineNo">956</span>  private boolean reportTransition(RegionStateNode regionNode, ServerStateNode serverNode,<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      TransitionCode state, long seqId, long procId) throws IOException {<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    ServerName serverName = serverNode.getServerName();<a name="line.958"></a>
-<span class="sourceLineNo">959</span>    TransitRegionStateProcedure proc = regionNode.getProcedure();<a name="line.959"></a>
-<span class="sourceLineNo">960</span>    if (proc == null) {<a name="line.960"></a>
-<span class="sourceLineNo">961</span>      return false;<a name="line.961"></a>
-<span class="sourceLineNo">962</span>    }<a name="line.962"></a>
-<span class="sourceLineNo">963</span>    proc.reportTransition(master.getMasterProcedureExecutor().getEnvironment(), regionNode,<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      serverName, state, seqId, procId);<a name="line.964"></a>
-<span class="sourceLineNo">965</span>    return true;<a name="line.965"></a>
-<span class="sourceLineNo">966</span>  }<a name="line.966"></a>
-<span class="sourceLineNo">967</span><a name="line.967"></a>
-<span class="sourceLineNo">968</span>  private void updateRegionSplitTransition(final ServerName serverName, final TransitionCode state,<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      final RegionInfo parent, final RegionInfo hriA, final RegionInfo hriB)<a name="line.969"></a>
-<span class="sourceLineNo">970</span>      throws IOException {<a name="line.970"></a>
-<span class="sourceLineNo">971</span>    checkMetaLoaded(parent);<a name="line.971"></a>
-<span class="sourceLineNo">972</span><a name="line.972"></a>
-<span class="sourceLineNo">973</span>    if (state != TransitionCode.READY_TO_SPLIT) {<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      throw new UnexpectedStateException("unsupported split regionState=" + state +<a name="line.974"></a>
-<span class="sourceLineNo">975</span>        " for parent region " + parent +<a name="line.975"></a>
-<span class="sourceLineNo">976</span>        " maybe an old RS (&lt; 2.0) had the operation in progress");<a name="line.976"></a>
-<span class="sourceLineNo">977</span>    }<a name="line.977"></a>
-<span class="sourceLineNo">978</span><a name="line.978"></a>
-<span class="sourceLineNo">979</span>    // sanity check on the request<a name="line.979"></a>
-<span class="sourceLineNo">980</span>    if (!Bytes.equals(hriA.getEndKey(), hriB.getStartKey())) {<a name="line.980"></a>
-<span class="sourceLineNo">981</span>      throw new UnsupportedOperationException(<a name="line.981"></a>
-<span class="sourceLineNo">982</span>        "unsupported split request with bad keys: parent=" + parent +<a name="line.982"></a>
-<span class="sourceLineNo">983</span>        " hriA=" + hriA + " hriB=" + hriB);<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    }<a name="line.984"></a>
-<span class="sourceLineNo">985</span><a name="line.985"></a>
-<span class="sourceLineNo">986</span>    // Submit the Split procedure<a name="line.986"></a>
-<span class="sourceLineNo">987</span>    final byte[] splitKey = hriB.getStartKey();<a name="line.987"></a>
-<span class="sourceLineNo">988</span>    if (LOG.isDebugEnabled()) {<a name="line.988"></a>
-<span class="sourceLineNo">989</span>      LOG.debug("Split request from " + serverName +<a name="line.989"></a>
-<span class="sourceLineNo">990</span>          ", parent=" + parent + " splitKey=" + Bytes.toStringBinary(splitKey));<a name="line.990"></a>
-<span class="sourceLineNo">991</span>    }<a name="line.991"></a>
-<span class="sourceLineNo">992</span>    master.getMasterProcedureExecutor().submitProcedure(createSplitProcedure(parent, splitKey));<a name="line.992"></a>
-<span class="sourceLineNo">993</span><a name="line.993"></a>
-<span class="sourceLineNo">994</span>    // If the RS is &lt; 2.0 throw an exception to abort the operation, we are handling the split<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    if (master.getServerManager().getVersionNumber(serverName) &lt; 0x0200000) {<a name="line.995"></a>
-<span class="sourceLineNo">996</span>      throw new UnsupportedOperationException(String.format(<a name="line.996"></a>
-<span class="sourceLineNo">997</span>        "Split handled by the master: parent=%s hriA=%s hriB=%s", parent.getShortNameToLog(), hriA, hriB));<a name="line.997"></a>
-<span class="sourceLineNo">998</span>    }<a name="line.998"></a>
-<span class="sourceLineNo">999</span>  }<a name="line.999"></a>
-<span class="sourceLineNo">1000</span><a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>  private void updateRegionMergeTransition(final ServerName serverName, final TransitionCode state,<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>      final RegionInfo merged, final RegionInfo hriA, final RegionInfo hriB) throws IOException {<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    checkMetaLoaded(merged);<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span><a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>    if (state != TransitionCode.READY_TO_MERGE) {<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      throw new UnexpectedStateException("Unsupported merge regionState=" + state +<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>        " for regionA=" + hriA + " regionB=" + hriB + " merged=" + merged +<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        " maybe an old RS (&lt; 2.0) had the operation in progress");<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>    }<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span><a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>    // Submit the Merge procedure<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>    if (LOG.isDebugEnabled()) {<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>      LOG.debug("Handling merge request from RS=" + merged + ", merged=" + merged);<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>    }<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>    master.getMasterProcedureExecutor().submitProcedure(createMergeProcedure(hriA, hriB));<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span><a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>    // If the RS is &lt; 2.0 throw an exception to abort the operation, we are handling the merge<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>    if (master.getServerManager().getVersionNumber(serverName) &lt; 0x0200000) {<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>      throw new UnsupportedOperationException(String.format(<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>        "Merge not handled yet: regionState=%s merged=%s hriA=%s hriB=%s", state, merged, hriA,<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>          hriB));<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>  }<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span><a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>  // ============================================================================================<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>  //  RS Status update (report online regions) helpers<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>  // ============================================================================================<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>  /**<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>   * The master will call this method when the RS send the regionServerReport(). The report will<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>   * contains the "online regions". This method will check the the online regions against the<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>   * in-memory state of the AM, and we will log a warn message if there is a mismatch. This is<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>   * because that there is no fencing between the reportRegionStateTransition method and<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>   * regionServerReport method, so there could be race and introduce inconsistency here, but<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>   * actually there is no problem.<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>   * &lt;p/&gt;<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>   * Please see HBASE-21421 and HBASE-21463 for more details.<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>   */<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>  public void reportOnlineRegions(ServerName serverName, Set&lt;byte[]&gt; regionNames) {<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>    if (!isRunning()) {<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>      return;<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>    }<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>    if (LOG.isTraceEnabled()) {<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>      LOG.trace("ReportOnlineRegions {} regionCount={}, metaLoaded={} {}", serverName,<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>        regionNames.size(), isMetaLoaded(),<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>        regionNames.stream().map(Bytes::toStringBinary).collect(Collectors.toList()));<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>    }<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span><a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>    ServerStateNode serverNode = regionStates.getOrCreateServer(serverName);<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span><a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    synchronized (serverNode) {<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>      if (!serverNode.isInState(ServerState.ONLINE)) {<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>        LOG.warn("Got a report from a server result in state " + serverNode.getState());<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>        return;<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>      }<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>    }<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    if (regionNames.isEmpty()) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      // nothing to do if we don't have regions<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      LOG.trace("no online region found on {}", serverName);<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      return;<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>    }<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>    if (!isMetaLoaded()) {<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>      // we are still on startup, skip checking<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>      return;<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    }<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>    // The Heartbeat tells us of what regions are on the region serve, check the state.<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>    checkOnlineRegionsReport(serverNode, regionNames);<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>  }<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span><a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>  // just check and output possible inconsistency, without actually doing anything<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>  private void checkOnlineRegionsReport(ServerStateNode serverNode, Set&lt;byte[]&gt; regionNames) {<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    ServerName serverName = serverNode.getServerName();<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>    for (byte[] regionName : regionNames) {<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      if (!isRunning()) {<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        return;<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>      RegionStateNode regionNode = regionStates.getRegionStateNodeFromName(regionName);<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>      if (regionNode == null) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>        LOG.warn("No region state node for {}, it should already be on {}",<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>          Bytes.toStringBinary(regionName), serverName);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>        continue;<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      }<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      regionNode.lock();<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>      try {<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>        long diff = EnvironmentEdgeManager.currentTime() - regionNode.getLastUpdate();<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>        if (regionNode.isInState(State.OPENING, State.OPEN)) {<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>          // This is possible as a region server has just closed a region but the region server<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>          // report is generated before the closing, but arrive after the closing. Make sure there<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>          // is some elapsed time so less false alarms.<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>          if (!regionNode.getRegionLocation().equals(serverName) &amp;&amp; diff &gt; 1000) {<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>            LOG.warn("{} reported OPEN on server={} but state has otherwise", regionNode,<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>              serverName);<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>          }<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>        } else if (!regionNode.isInState(State.CLOSING, State.SPLITTING)) {<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>          // So, we can get report that a region is CLOSED or SPLIT because a heartbeat<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>          // came in at about same time as a region transition. Make sure there is some<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>          // elapsed time so less false alarms.<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>          if (diff &gt; 1000) {<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>            LOG.warn("{} reported an unexpected OPEN on {}; time since last update={}ms",<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>              regionNode, serverName, diff);<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>          }<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>        }<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      } finally {<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>        regionNode.unlock();<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>      }<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    }<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>  }<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span><a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>  // ============================================================================================<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>  //  RIT chore<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>  // ============================================================================================<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>  private static class RegionInTransitionChore extends ProcedureInMemoryChore&lt;MasterProcedureEnv&gt; {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>    public RegionInTransitionChore(final int timeoutMsec) {<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>      super(timeoutMsec);<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>    }<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span><a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>    @Override<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    protected void periodicExecute(final MasterProcedureEnv env) {<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>      final AssignmentManager am = env.getAssignmentManager();<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span><a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>      final RegionInTransitionStat ritStat = am.computeRegionInTransitionStat();<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>      if (ritStat.hasRegionsOverThreshold()) {<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>        for (RegionState hri: ritStat.getRegionOverThreshold()) {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>          am.handleRegionOverStuckWarningThreshold(hri.getRegion());<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>        }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>      }<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span><a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      // update metrics<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>      am.updateRegionsInTransitionMetrics(ritStat);<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>    }<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>  }<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span><a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>  public RegionInTransitionStat computeRegionInTransitionStat() {<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    final RegionInTransitionStat rit = new RegionInTransitionStat(getConfiguration());<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>    rit.update(this);<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    return rit;<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>  }<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span><a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>  public static class RegionInTransitionStat {<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    private final int ritThreshold;<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span><a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>    private HashMap&lt;String, RegionState&gt; ritsOverThreshold = null;<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>    private long statTimestamp;<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>    private long oldestRITTime = 0;<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    private int totalRITsTwiceThreshold = 0;<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>    private int totalRITs = 0;<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span><a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>    @VisibleForTesting<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    public RegionInTransitionStat(final Configuration conf) {<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>      this.ritThreshold =<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>        conf.getInt(METRICS_RIT_STUCK_WARNING_THRESHOLD, DEFAULT_RIT_STUCK_WARNING_THRESHOLD);<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>    }<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span><a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>    public int getRITThreshold() {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      return ritThreshold;<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    }<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span><a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    public long getTimestamp() {<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      return statTimestamp;<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>    }<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span><a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    public int getTotalRITs() {<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>      return totalRITs;<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>    }<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span><a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>    public long getOldestRITTime() {<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>      return oldestRITTime;<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>    }<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span><a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>    public int getTotalRITsOverThreshold() {<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>      Map&lt;String, RegionState&gt; m = this.ritsOverThreshold;<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>      return m != null ? m.size() : 0;<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>    }<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span><a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>    public boolean hasRegionsTwiceOverThreshold() {<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      return totalRITsTwiceThreshold &gt; 0;<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>    }<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span><a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>    public boolean hasRegionsOverThreshold() {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>      Map&lt;String, RegionState&gt; m = this.ritsOverThreshold;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>      return m != null &amp;&amp; !m.isEmpty();<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>    }<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span><a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>    public Collection&lt;RegionState&gt; getRegionOverThreshold() {<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      Map&lt;String, RegionState&gt; m = this.ritsOverThreshold;<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>      return m != null? m.values(): Collections.emptySet();<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    }<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span><a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>    public boolean isRegionOverThreshold(final RegionInfo regionInfo) {<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>      Map&lt;String, RegionState&gt; m = this.ritsOverThreshold;<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      return m != null &amp;&amp; m.containsKey(regionInfo.getEncodedName());<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>    }<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span><a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>    public boolean isRegionTwiceOverThreshold(final RegionInfo regionInfo) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      Map&lt;String, RegionState&gt; m = this.ritsOverThreshold;<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>      if (m == null) return false;<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>      final RegionState state = m.get(regionInfo.getEncodedName());<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>      if (state == null) return false;<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>      return (statTimestamp - state.getStamp()) &gt; (ritThreshold * 2);<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>    }<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span><a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>    protected void update(final AssignmentManager am) {<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>      final RegionStates regionStates = am.getRegionStates();<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      this.statTimestamp = EnvironmentEdgeManager.currentTime();<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>      update(regionStates.getRegionsStateInTransition(), statTimestamp);<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>      update(regionStates.getRegionFailedOpen(), statTimestamp);<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>    }<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span><a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    private void update(final Collection&lt;RegionState&gt; regions, final long currentTime) {<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>      for (RegionState state: regions) {<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>        totalRITs++;<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>        final long ritStartedMs = state.getStamp();<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>        if (ritStartedMs == 0) {<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>          // Don't output bogus values to metrics if they accidentally make it here.<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>          LOG.warn("The RIT {} has no start time", state.getRegion());<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>          continue;<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>        }<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>        final long ritTime = currentTime - ritStartedMs;<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>        if (ritTime &gt; ritThreshold) {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>          if (ritsOverThreshold == null) {<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>            ritsOverThreshold = new HashMap&lt;String, RegionState&gt;();<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>          }<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>          ritsOverThreshold.put(state.getRegion().getEncodedName(), state);<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>          totalRITsTwiceThreshold += (ritTime &gt; (ritThreshold * 2)) ? 1 : 0;<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>        }<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>        if (oldestRITTime &lt; ritTime) {<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>          oldestRITTime = ritTime;<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>        }<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      }<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>  private void updateRegionsInTransitionMetrics(final RegionInTransitionStat ritStat) {<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    metrics.updateRITOldestAge(ritStat.getOldestRITTime());<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    metrics.updateRITCount(ritStat.getTotalRITs());<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    metrics.updateRITCountOverThreshold(ritStat.getTotalRITsOverThreshold());<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>  }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span><a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>  private void handleRegionOverStuckWarningThreshold(final RegionInfo regionInfo) {<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    final RegionStateNode regionNode = regionStates.getRegionStateNode(regionInfo);<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>    //if (regionNode.isStuck()) {<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    LOG.warn("STUCK Region-In-Transition {}", regionNode);<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>  }<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span><a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>  // ============================================================================================<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>  //  TODO: Master load/bootstrap<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>  // ============================================================================================<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>  public void joinCluster() throws IOException {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>    long startTime = System.nanoTime();<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>    LOG.debug("Joining cluster...");<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span><a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>    // Scan hbase:meta to build list of existing regions, servers, and assignment.<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    // hbase:meta is online now or will be. Inside loadMeta, we keep trying. Can't make progress<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    // w/o  meta.<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    loadMeta();<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span><a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    while (master.getServerManager().countOfRegionServers() &lt; 1) {<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      LOG.info("Waiting for RegionServers to join; current count={}",<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>        master.getServerManager().countOfRegionServers());<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>      Threads.sleep(250);<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>    }<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    LOG.info("Number of RegionServers={}", master.getServerManager().countOfRegionServers());<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span><a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    // Start the RIT chore<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    master.getMasterProcedureExecutor().addChore(this.ritChore);<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span><a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    long costMs = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startTime);<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    LOG.info("Joined the cluster in {}", StringUtils.humanTimeDiff(costMs));<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>  }<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span><a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>  /**<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>   * Create assign procedure for offline regions.<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>   * Just follow the old processofflineServersWithOnlineRegions method. Since now we do not need to<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>   * deal with dead server any more, we only deal with the regions in OFFLINE state in this method.<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>   * And this is a bit strange, that for new regions, we will add it in CLOSED state instead of<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>   * OFFLINE state, and usually there will be a procedure to track them. The<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>   * processofflineServersWithOnlineRegions is a legacy from long ago, as things are going really<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>   * different now, maybe we do not need this method any more. Need to revisit later.<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>   */<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>  // Public so can be run by the Master as part of the startup. Needs hbase:meta to be online.<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>  // Needs to be done after the table state manager has been started.<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>  public void processOfflineRegions() {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>    List&lt;RegionInfo&gt; offlineRegions = regionStates.getRegionStates().stream()<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      .filter(RegionState::isOffline).filter(s -&gt; isTableEnabled(s.getRegion().getTable()))<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>      .map(RegionState::getRegion).collect(Collectors.toList());<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>    if (!offlineRegions.isEmpty()) {<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>      master.getMasterProcedureExecutor().submitProcedures(<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>        master.getAssignmentManager().createRoundRobinAssignProcedures(offlineRegions));<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>    }<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>  }<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span><a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>  private void loadMeta() throws IOException {<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>    // TODO: use a thread pool<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    regionStateStore.visitMeta(new RegionStateStore.RegionStateVisitor() {<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>      @Override<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>      public void visitRegionState(Result result, final RegionInfo regionInfo, final State state,<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>          final ServerName regionLocation, final ServerName lastHost, final long openSeqNum) {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>        if (state == null &amp;&amp; regionLocation == null &amp;&amp; lastHost == null &amp;&amp;<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>            openSeqNum == SequenceId.NO_SEQUENCE_ID) {<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>          // This is a row with nothing in it.<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>          LOG.warn("Skipping empty row={}", result);<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>          return;<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>        }<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>        State localState = state;<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>        if (localState == null) {<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>          // No region state column data in hbase:meta table! Are I doing a rolling upgrade from<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>          // hbase1 to hbase2? Am I restoring a SNAPSHOT or otherwise adding a region to hbase:meta?<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>          // In any of these cases, state is empty. For now, presume OFFLINE but there are probably<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>          // cases where we need to probe more to be sure this correct; TODO informed by experience.<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>          LOG.info(regionInfo.getEncodedName() + " regionState=null; presuming " + State.OFFLINE);<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span><a name="line.1310"></a>
+<span class="sourceLineNo">216</span>        if (regionNode.getProcedure() != null) {<a name="line.216"></a>
+<span class="sourceLineNo">217</span>          regionNode.getProcedure().stateLoaded(this, regionNode);<a name="line.217"></a>
+<span class="sourceLineNo">218</span>        }<a name="line.218"></a>
+<span class="sourceLineNo">219</span>        setMetaAssigned(regionState.getRegion(), regionState.getState() == State.OPEN);<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      } finally {<a name="line.220"></a>
+<span class="sourceLineNo">221</span>        regionNode.unlock();<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      }<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    }<a name="line.223"></a>
+<span class="sourceLineNo">224</span>  }<a name="line.224"></a>
+<span class="sourceLineNo">225</span><a name="line.225"></a>
+<span class="sourceLineNo">226</span>  /**<a name="line.226"></a>
+<span class="sourceLineNo">227</span>   * Create RegionStateNode based on the TRSP list, and attach the TRSP to the RegionStateNode.<a name="line.227"></a>
+<span class="sourceLineNo">228</span>   * &lt;p&gt;<a name="line.228"></a>
+<span class="sourceLineNo">229</span>   * This is used to restore the RIT region list, so we do not need to restore it in the loadingMeta<a name="line.229"></a>
+<span class="sourceLineNo">230</span>   * method below. And it is also very important as now before submitting a TRSP, we need to attach<a name="line.230"></a>
+<span class="sourceLineNo">231</span>   * it to the RegionStateNode, which acts like a guard, so we need to restore this information at<a name="line.231"></a>
+<span class="sourceLineNo">232</span>   * the very beginning, before we start processing any procedures.<a name="line.232"></a>
+<span class="sourceLineNo">233</span>   */<a name="line.233"></a>
+<span class="sourceLineNo">234</span>  public void setupRIT(List&lt;TransitRegionStateProcedure&gt; procs) {<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    procs.forEach(proc -&gt; {<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      RegionInfo regionInfo = proc.getRegion();<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      RegionStateNode regionNode = regionStates.getOrCreateRegionStateNode(regionInfo);<a name="line.237"></a>
+<span class="sourceLineNo">238</span>      TransitRegionStateProcedure existingProc = regionNode.getProcedure();<a name="line.238"></a>
+<span class="sourceLineNo">239</span>      if (existingProc != null) {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>        // This is possible, as we will detach the procedure from the RSN before we<a name="line.240"></a>
+<span class="sourceLineNo">241</span>        // actually finish the procedure. This is because that, we will detach the TRSP from the RSN<a name="line.241"></a>
+<span class="sourceLineNo">242</span>        // during execution, at that time, the procedure has not been marked as done in the pv2<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        // framework yet, so it is possible that we schedule a new TRSP immediately and when<a name="line.243"></a>
+<span class="sourceLineNo">244</span>        // arriving here, we will find out that there are multiple TRSPs for the region. But we can<a name="line.244"></a>
+<span class="sourceLineNo">245</span>        // make sure that, only the last one can take the charge, the previous ones should have all<a name="line.245"></a>
+<span class="sourceLineNo">246</span>        // been finished already. So here we will compare the proc id, the greater one will win.<a name="line.246"></a>
+<span class="sourceLineNo">247</span>        if (existingProc.getProcId() &lt; proc.getProcId()) {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>          // the new one wins, unset and set it to the new one below<a name="line.248"></a>
+<span class="sourceLineNo">249</span>          regionNode.unsetProcedure(existingProc);<a name="line.249"></a>
+<span class="sourceLineNo">250</span>        } else {<a name="line.250"></a>
+<span class="sourceLineNo">251</span>          // the old one wins, skip<a name="line.251"></a>
+<span class="sourceLineNo">252</span>          return;<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>      LOG.info("Attach {} to {} to restore RIT", proc, regionNode);<a name="line.255"></a>
+<span class="sourceLineNo">256</span>      regionNode.setProcedure(proc);<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    });<a name="line.257"></a>
+<span class="sourceLineNo">258</span>  }<a name="line.258"></a>
+<span class="sourceLineNo">259</span><a name="line.259"></a>
+<span class="sourceLineNo">260</span>  public void stop() {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    if (!running.compareAndSet(true, false)) {<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      return;<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    }<a name="line.263"></a>
+<span class="sourceLineNo">264</span><a name="line.264"></a>
+<span class="sourceLineNo">265</span>    LOG.info("Stopping assignment manager");<a name="line.265"></a>
+<span class="sourceLineNo">266</span><a name="line.266"></a>
+<span class="sourceLineNo">267</span>    // The AM is started before the procedure executor,<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    // but the actual work will be loaded/submitted only once we have the executor<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    final boolean hasProcExecutor = master.getMasterProcedureExecutor() != null;<a name="line.269"></a>
+<span class="sourceLineNo">270</span><a name="line.270"></a>
+<span class="sourceLineNo">271</span>    // Remove the RIT chore<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    if (hasProcExecutor) {<a name="line.272"></a>
+<span class="sourceLineNo">273</span>      master.getMasterProcedureExecutor().removeChore(this.ritChore);<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    }<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>    // Stop the Assignment Thread<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    stopAssignmentThread();<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>    // Stop the RegionStateStore<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    regionStates.clear();<a name="line.280"></a>
+<span class="sourceLineNo">281</span><a name="line.281"></a>
+<span class="sourceLineNo">282</span>    // Update meta events (for testing)<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    if (hasProcExecutor) {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      metaLoadEvent.suspend();<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      for (RegionInfo hri: getMetaRegionSet()) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>        setMetaAssigned(hri, false);<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>  }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>  public boolean isRunning() {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    return running.get();<a name="line.292"></a>
+<span class="sourceLineNo">293</span>  }<a name="line.293"></a>
+<span class="sourceLineNo">294</span><a name="line.294"></a>
+<span class="sourceLineNo">295</span>  public Configuration getConfiguration() {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    return master.getConfiguration();<a name="line.296"></a>
+<span class="sourceLineNo">297</span>  }<a name="line.297"></a>
+<span class="sourceLineNo">298</span><a name="line.298"></a>
+<span class="sourceLineNo">299</span>  public MetricsAssignmentManager getAssignmentManagerMetrics() {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    return metrics;<a name="line.300"></a>
+<span class="sourceLineNo">301</span>  }<a name="line.301"></a>
+<span class="sourceLineNo">302</span><a name="line.302"></a>
+<span class="sourceLineNo">303</span>  private LoadBalancer getBalancer() {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    return master.getLoadBalancer();<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>  private MasterProcedureEnv getProcedureEnvironment() {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    return master.getMasterProcedureExecutor().getEnvironment();<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>  private MasterProcedureScheduler getProcedureScheduler() {<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    return getProcedureEnvironment().getProcedureScheduler();<a name="line.312"></a>
+<span class="sourceLineNo">313</span>  }<a name="line.313"></a>
+<span class="sourceLineNo">314</span><a name="line.314"></a>
+<span class="sourceLineNo">315</span>  int getAssignMaxAttempts() {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    return assignMaxAttempts;<a name="line.316"></a>
+<span class="sourceLineNo">317</span>  }<a name="line.317"></a>
+<span class="sourceLineNo">318</span><a name="line.318"></a>
+<span class="sourceLineNo">319</span>  int getAssignRetryImmediatelyMaxAttempts() {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    return assignRetryImmediatelyMaxAttempts;<a name="line.320"></a>
+<span class="sourceLineNo">321</span>  }<a name="line.321"></a>
+<span class="sourceLineNo">322</span><a name="line.322"></a>
+<span class="sourceLineNo">323</span>  public RegionStates getRegionStates() {<a name="line.323"></a>
+<span class="sourceLineNo">324</span>    return regionStates;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  }<a name="line.325"></a>
+<span class="sourceLineNo">326</span><a name="line.326"></a>
+<span class="sourceLineNo">327</span>  /**<a name="line.327"></a>
+<span class="sourceLineNo">328</span>   * Returns the regions hosted by the specified server.<a name="line.328"></a>
+<span class="sourceLineNo">329</span>   * &lt;p/&gt;<a name="line.329"></a>
+<span class="sourceLineNo">330</span>   * Notice that, for SCP, after we submit the SCP, no one can change the region list for the<a name="line.330"></a>
+<span class="sourceLineNo">331</span>   * ServerStateNode so we do not need any locks here. And for other usage, this can only give you a<a name="line.331"></a>
+<span class="sourceLineNo">332</span>   * snapshot of the current region list for this server, which means, right after you get the<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   * region list, new regions may be moved to this server or some regions may be moved out from this<a name="line.333"></a>
+<span class="sourceLineNo">334</span>   * server, so you should not use it critically if you need strong consistency.<a name="line.334"></a>
+<span class="sourceLineNo">335</span>   */<a name="line.335"></a>
+<span class="sourceLineNo">336</span>  public List&lt;RegionInfo&gt; getRegionsOnServer(ServerName serverName) {<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    ServerStateNode serverInfo = regionStates.getServerNode(serverName);<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    if (serverInfo == null) {<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      return Collections.emptyList();<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    }<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    return serverInfo.getRegionInfoList();<a name="line.341"></a>
+<span class="sourceLineNo">342</span>  }<a name="line.342"></a>
+<span class="sourceLineNo">343</span><a name="line.343"></a>
+<span class="sourceLineNo">344</span>  public RegionStateStore getRegionStateStore() {<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    return regionStateStore;<a name="line.345"></a>
+<span class="sourceLineNo">346</span>  }<a name="line.346"></a>
+<span class="sourceLineNo">347</span><a name="line.347"></a>
+<span class="sourceLineNo">348</span>  public List&lt;ServerName&gt; getFavoredNodes(final RegionInfo regionInfo) {<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    return this.shouldAssignRegionsWithFavoredNodes<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      ? ((FavoredStochasticBalancer) getBalancer()).getFavoredNodes(regionInfo)<a name="line.350"></a>
+<span class="sourceLineNo">351</span>      : ServerName.EMPTY_SERVER_LIST;<a name="line.351"></a>
+<span class="sourceLineNo">352</span>  }<a name="line.352"></a>
+<span class="sourceLineNo">353</span><a name="line.353"></a>
+<span class="sourceLineNo">354</span>  // ============================================================================================<a name="line.354"></a>
+<span class="sourceLineNo">355</span>  //  Table State Manager helpers<a name="line.355"></a>
+<span class="sourceLineNo">356</span>  // ============================================================================================<a name="line.356"></a>
+<span class="sourceLineNo">357</span>  TableStateManager getTableStateManager() {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    return master.getTableStateManager();<a name="line.358"></a>
+<span class="sourceLineNo">359</span>  }<a name="line.359"></a>
+<span class="sourceLineNo">360</span><a name="line.360"></a>
+<span class="sourceLineNo">361</span>  public boolean isTableEnabled(final TableName tableName) {<a name="line.361"></a>
+<span class="sourceLineNo">362</span>    return getTableStateManager().isTableState(tableName, TableState.State.ENABLED);<a name="line.362"></a>
+<span class="sourceLineNo">363</span>  }<a name="line.363"></a>
+<span class="sourceLineNo">364</span><a name="line.364"></a>
+<span class="sourceLineNo">365</span>  public boolean isTableDisabled(final TableName tableName) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>    return getTableStateManager().isTableState(tableName,<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      TableState.State.DISABLED, TableState.State.DISABLING);<a name="line.367"></a>
+<span class="sourceLineNo">368</span>  }<a name="line.368"></a>
+<span class="sourceLineNo">369</span><a name="line.369"></a>
+<span class="sourceLineNo">370</span>  // ============================================================================================<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  //  META Helpers<a name="line.371"></a>
+<span class="sourceLineNo">372</span>  // ============================================================================================<a name="line.372"></a>
+<span class="sourceLineNo">373</span>  private boolean isMetaRegion(final RegionInfo regionInfo) {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>    return regionInfo.isMetaRegion();<a name="line.374"></a>
+<span class="sourceLineNo">375</span>  }<a name="line.375"></a>
+<span class="sourceLineNo">376</span><a name="line.376"></a>
+<span class="sourceLineNo">377</span>  public boolean isMetaRegion(final byte[] regionName) {<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    return getMetaRegionFromName(regionName) != null;<a name="line.378"></a>
+<span class="sourceLineNo">379</span>  }<a name="line.379"></a>
+<span class="sourceLineNo">380</span><a name="line.380"></a>
+<span class="sourceLineNo">381</span>  public RegionInfo getMetaRegionFromName(final byte[] regionName) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>    for (RegionInfo hri: getMetaRegionSet()) {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      if (Bytes.equals(hri.getRegionName(), regionName)) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        return hri;<a name="line.384"></a>
+<span class="sourceLineNo">385</span>      }<a name="line.385"></a>
+<span class="sourceLineNo">386</span>    }<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    return null;<a name="line.387"></a>
+<span class="sourceLineNo">388</span>  }<a name="line.388"></a>
+<span class="sourceLineNo">389</span><a name="line.389"></a>
+<span class="sourceLineNo">390</span>  public boolean isCarryingMeta(final ServerName serverName) {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    // TODO: handle multiple meta<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    return isCarryingRegion(serverName, RegionInfoBuilder.FIRST_META_REGIONINFO);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>  }<a name="line.393"></a>
+<span class="sourceLineNo">394</span><a name="line.394"></a>
+<span class="sourceLineNo">395</span>  private boolean isCarryingRegion(final ServerName serverName, final RegionInfo regionInfo) {<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    // TODO: check for state?<a name="line.396"></a>
+<span class="sourceLineNo">397</span>    final RegionStateNode node = regionStates.getRegionStateNode(regionInfo);<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    return(node != null &amp;&amp; serverName.equals(node.getRegionLocation()));<a name="line.398"></a>
+<span class="sourceLineNo">399</span>  }<a name="line.399"></a>
+<span class="sourceLineNo">400</span><a name="line.400"></a>
+<span class="sourceLineNo">401</span>  private RegionInfo getMetaForRegion(final RegionInfo regionInfo) {<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    //if (regionInfo.isMetaRegion()) return regionInfo;<a name="line.402"></a>
+<span class="sourceLineNo">403</span>    // TODO: handle multiple meta. if the region provided is not meta lookup<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    // which meta the region belongs to.<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    return RegionInfoBuilder.FIRST_META_REGIONINFO;<a name="line.405"></a>
+<span class="sourceLineNo">406</span>  }<a name="line.406"></a>
+<span class="sourceLineNo">407</span><a name="line.407"></a>
+<span class="sourceLineNo">408</span>  // TODO: handle multiple meta.<a name="line.408"></a>
+<span class="sourceLineNo">409</span>  private static final Set&lt;RegionInfo&gt; META_REGION_SET =<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      Collections.singleton(RegionInfoBuilder.FIRST_META_REGIONINFO);<a name="line.410"></a>
+<span class="sourceLineNo">411</span>  public Set&lt;RegionInfo&gt; getMetaRegionSet() {<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    return META_REGION_SET;<a name="line.412"></a>
+<span class="sourceLineNo">413</span>  }<a name="line.413"></a>
+<span class="sourceLineNo">414</span><a name="line.414"></a>
+<span class="sourceLineNo">415</span>  // ============================================================================================<a name="line.415"></a>
+<span class="sourceLineNo">416</span>  //  META Event(s) helpers<a name="line.416"></a>
+<span class="sourceLineNo">417</span>  // ============================================================================================<a name="line.417"></a>
+<span class="sourceLineNo">418</span>  /**<a name="line.418"></a>
+<span class="sourceLineNo">419</span>   * Notice that, this only means the meta region is available on a RS, but the AM may still be<a name="line.419"></a>
+<span class="sourceLineNo">420</span>   * loading the region states from meta, so usually you need to check {@link #isMetaLoaded()} first<a name="line.420"></a>
+<span class="sourceLineNo">421</span>   * before checking this method, unless you can make sure that your piece of code can only be<a name="line.421"></a>
+<span class="sourceLineNo">422</span>   * executed after AM builds the region states.<a name="line.422"></a>
+<span class="sourceLineNo">423</span>   * @see #isMetaLoaded()<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   */<a name="line.424"></a>
+<span class="sourceLineNo">425</span>  public boolean isMetaAssigned() {<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    return metaAssignEvent.isReady();<a name="line.426"></a>
+<span class="sourceLineNo">427</span>  }<a name="line.427"></a>
+<span class="sourceLineNo">428</span><a name="line.428"></a>
+<span class="sourceLineNo">429</span>  public boolean isMetaRegionInTransition() {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    return !isMetaAssigned();<a name="line.430"></a>
+<span class="sourceLineNo">431</span>  }<a name="line.431"></a>
+<span class="sourceLineNo">432</span><a name="line.432"></a>
+<span class="sourceLineNo">433</span>  /**<a name="line.433"></a>
+<span class="sourceLineNo">434</span>   * Notice that this event does not mean the AM has already finished region state rebuilding. See<a name="line.434"></a>
+<span class="sourceLineNo">435</span>   * the comment of {@link #isMetaAssigned()} for more details.<a name="line.435"></a>
+<span class="sourceLineNo">436</span>   * @see #isMetaAssigned()<a name="line.436"></a>
+<span class="sourceLineNo">437</span>   */<a name="line.437"></a>
+<span class="sourceLineNo">438</span>  public boolean waitMetaAssigned(Procedure&lt;?&gt; proc, RegionInfo regionInfo) {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    return getMetaAssignEvent(getMetaForRegion(regionInfo)).suspendIfNotReady(proc);<a name="line.439"></a>
+<span class="sourceLineNo">440</span>  }<a name="line.440"></a>
+<span class="sourceLineNo">441</span><a name="line.441"></a>
+<span class="sourceLineNo">442</span>  private void setMetaAssigned(RegionInfo metaRegionInfo, boolean assigned) {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>    assert isMetaRegion(metaRegionInfo) : "unexpected non-meta region " + metaRegionInfo;<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    ProcedureEvent&lt;?&gt; metaAssignEvent = getMetaAssignEvent(metaRegionInfo);<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    if (assigned) {<a name="line.445"></a>
+<span class="sourceLineNo">446</span>      metaAssignEvent.wake(getProcedureScheduler());<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    } else {<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      metaAssignEvent.suspend();<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    }<a name="line.449"></a>
+<span class="sourceLineNo">450</span>  }<a name="line.450"></a>
+<span class="sourceLineNo">451</span><a name="line.451"></a>
+<span class="sourceLineNo">452</span>  private ProcedureEvent&lt;?&gt; getMetaAssignEvent(RegionInfo metaRegionInfo) {<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    assert isMetaRegion(metaRegionInfo) : "unexpected non-meta region " + metaRegionInfo;<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    // TODO: handle multiple meta.<a name="line.454"></a>
+<span class="sourceLineNo">455</span>    return metaAssignEvent;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>  }<a name="line.456"></a>
+<span class="sourceLineNo">457</span><a name="line.457"></a>
+<span class="sourceLineNo">458</span>  /**<a name="line.458"></a>
+<span class="sourceLineNo">459</span>   * Wait until AM finishes the meta loading, i.e, the region states rebuilding.<a name="line.459"></a>
+<span class="sourceLineNo">460</span>   * @see #isMetaLoaded()<a name="line.460"></a>
+<span class="sourceLineNo">461</span>   * @see #waitMetaAssigned(Procedure, RegionInfo)<a name="line.461"></a>
+<span class="sourceLineNo">462</span>   */<a name="line.462"></a>
+<span class="sourceLineNo">463</span>  public boolean waitMetaLoaded(Procedure&lt;?&gt; proc) {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    return metaLoadEvent.suspendIfNotReady(proc);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>  }<a name="line.465"></a>
+<span class="sourceLineNo">466</span><a name="line.466"></a>
+<span class="sourceLineNo">467</span>  @VisibleForTesting<a name="line.467"></a>
+<span class="sourceLineNo">468</span>  void wakeMetaLoadedEvent() {<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    metaLoadEvent.wake(getProcedureScheduler());<a name="line.469"></a>
+<span class="sourceLineNo">470</span>    assert isMetaLoaded() : "expected meta to be loaded";<a name="line.470"></a>
+<span class="sourceLineNo">471</span>  }<a name="line.471"></a>
+<span class="sourceLineNo">472</span><a name="line.472"></a>
+<span class="sourceLineNo">473</span>  /**<a name="line.473"></a>
+<span class="sourceLineNo">474</span>   * Return whether AM finishes the meta loading, i.e, the region states rebuilding.<a name="line.474"></a>
+<span class="sourceLineNo">475</span>   * @see #isMetaAssigned()<a name="line.475"></a>
+<span class="sourceLineNo">476</span>   * @see #waitMetaLoaded(Procedure)<a name="line.476"></a>
+<span class="sourceLineNo">477</span>   */<a name="line.477"></a>
+<span class="sourceLineNo">478</span>  public boolean isMetaLoaded() {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    return metaLoadEvent.isReady();<a name="line.479"></a>
+<span class="sourceLineNo">480</span>  }<a name="line.480"></a>
+<span class="sourceLineNo">481</span><a name="line.481"></a>
+<span class="sourceLineNo">482</span>  /**<a name="line.482"></a>
+<span class="sourceLineNo">483</span>   * Start a new thread to check if there are region servers whose versions are higher than others.<a name="line.483"></a>
+<span class="sourceLineNo">484</span>   * If so, move all system table regions to RS with the highest version to keep compatibility.<a name="line.484"></a>
+<span class="sourceLineNo">485</span>   * The reason is, RS in new version may not be able to access RS in old version when there are<a name="line.485"></a>
+<span class="sourceLineNo">486</span>   * some incompatible changes.<a name="line.486"></a>
+<span class="sourceLineNo">487</span>   * &lt;p&gt;This method is called when a new RegionServer is added to cluster only.&lt;/p&gt;<a name="line.487"></a>
+<span class="sourceLineNo">488</span>   */<a name="line.488"></a>
+<span class="sourceLineNo">489</span>  public void checkIfShouldMoveSystemRegionAsync() {<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    // TODO: Fix this thread. If a server is killed and a new one started, this thread thinks that<a name="line.490"></a>
+<span class="sourceLineNo">491</span>    // it should 'move' the system tables from the old server to the new server but<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    // ServerCrashProcedure is on it; and it will take care of the assign without dataloss.<a name="line.492"></a>
+<span class="sourceLineNo">493</span>    if (this.master.getServerManager().countOfRegionServers() &lt;= 1) {<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      return;<a name="line.494"></a>
+<span class="sourceLineNo">495</span>    }<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    // This thread used to run whenever there was a change in the cluster. The ZooKeeper<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    // childrenChanged notification came in before the nodeDeleted message and so this method<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    // cold run before a ServerCrashProcedure could run. That meant that this thread could see<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    // a Crashed Server before ServerCrashProcedure and it could find system regions on the<a name="line.499"></a>
+<span class="sourceLineNo">500</span>    // crashed server and go move them before ServerCrashProcedure had a chance; could be<a name="line.500"></a>
+<span class="sourceLineNo">501</span>    // dataloss too if WALs were not recovered.<a name="line.501"></a>
+<span class="sourceLineNo">502</span>    new Thread(() -&gt; {<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      try {<a name="line.503"></a>
+<span class="sourceLineNo">504</span>        synchronized (checkIfShouldMoveSystemRegionLock) {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>          List&lt;RegionPlan&gt; plans = new ArrayList&lt;&gt;();<a name="line.505"></a>
+<span class="sourceLineNo">506</span>          // TODO: I don't think this code does a good job if all servers in cluster have same<a name="line.506"></a>
+<span class="sourceLineNo">507</span>          // version. It looks like it will schedule unnecessary moves.<a name="line.507"></a>
+<span class="sourceLineNo">508</span>          for (ServerName server : getExcludedServersForSystemTable()) {<a name="line.508"></a>
+<span class="sourceLineNo">509</span>            if (master.getServerManager().isServerDead(server)) {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>              // TODO: See HBASE-18494 and HBASE-18495. Though getExcludedServersForSystemTable()<a name="line.510"></a>
+<span class="sourceLineNo">511</span>              // considers only online servers, the server could be queued for dead server<a name="line.511"></a>
+<span class="sourceLineNo">512</span>              // processing. As region assignments for crashed server is handled by<a name="line.512"></a>
+<span class="sourceLineNo">513</span>              // ServerCrashProcedure, do NOT handle them here. The goal is to handle this through<a name="line.513"></a>
+<span class="sourceLineNo">514</span>              // regular flow of LoadBalancer as a favored node and not to have this special<a name="line.514"></a>
+<span class="sourceLineNo">515</span>              // handling.<a name="line.515"></a>
+<span class="sourceLineNo">516</span>              continue;<a name="line.516"></a>
+<span class="sourceLineNo">517</span>            }<a name="line.517"></a>
+<span class="sourceLineNo">518</span>            List&lt;RegionInfo&gt; regionsShouldMove = getSystemTables(server);<a name="line.518"></a>
+<span class="sourceLineNo">519</span>            if (!regionsShouldMove.isEmpty()) {<a name="line.519"></a>
+<span class="sourceLineNo">520</span>              for (RegionInfo regionInfo : regionsShouldMove) {<a name="line.520"></a>
+<span class="sourceLineNo">521</span>                // null value for dest forces destination server to be selected by balancer<a name="line.521"></a>
+<span class="sourceLineNo">522</span>                RegionPlan plan = new RegionPlan(regionInfo, server, null);<a name="line.522"></a>
+<span class="sourceLineNo">523</span>                if (regionInfo.isMetaRegion()) {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>                  // Must move meta region first.<a name="line.524"></a>
+<span class="sourceLineNo">525</span>                  LOG.info("Async MOVE of {} to newer Server={}",<a name="line.525"></a>
+<span class="sourceLineNo">526</span>                      regionInfo.getEncodedName(), server);<a name="line.526"></a>
+<span class="sourceLineNo">527</span>                  moveAsync(plan);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>                } else {<a name="line.528"></a>
+<span class="sourceLineNo">529</span>                  plans.add(plan);<a name="line.529"></a>
+<span class="sourceLineNo">530</span>                }<a name="line.530"></a>
+<span class="sourceLineNo">531</span>              }<a name="line.531"></a>
+<span class="sourceLineNo">532</span>            }<a name="line.532"></a>
+<span class="sourceLineNo">533</span>            for (RegionPlan plan : plans) {<a name="line.533"></a>
+<span class="sourceLineNo">534</span>              LOG.info("Async MOVE of {} to newer Server={}",<a name="line.534"></a>
+<span class="sourceLineNo">535</span>                  plan.getRegionInfo().getEncodedName(), server);<a name="line.535"></a>
+<span class="sourceLineNo">536</span>              moveAsync(plan);<a name="line.536"></a>
+<span class="sourceLineNo">537</span>            }<a name="line.537"></a>
+<span class="sourceLineNo">538</span>          }<a name="line.538"></a>
+<span class="sourceLineNo">539</span>        }<a name="line.539"></a>
+<span class="sourceLineNo">540</span>      } catch (Throwable t) {<a name="line.540"></a>
+<span class="sourceLineNo">541</span>        LOG.error(t.toString(), t);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>      }<a name="line.542"></a>
+<span class="sourceLineNo">543</span>    }).start();<a name="line.543"></a>
+<span class="sourceLineNo">544</span>  }<a name="line.544"></a>
+<span class="sourceLineNo">545</span><a name="line.545"></a>
+<span class="sourceLineNo">546</span>  private List&lt;RegionInfo&gt; getSystemTables(ServerName serverName) {<a name="line.546"></a>
+<span class="sourceLineNo">547</span>    ServerStateNode serverNode = regionStates.getServerNode(serverName);<a name="line.547"></a>
+<span class="sourceLineNo">548</span>    if (serverNode == null) {<a name="line.548"></a>
+<span class="sourceLineNo">549</span>      return Collections.emptyList();<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    }<a name="line.550"></a>
+<span class="sourceLineNo">551</span>    return serverNode.getSystemRegionInfoList();<a name="line.551"></a>
+<span class="sourceLineNo">552</span>  }<a name="line.552"></a>
+<span class="sourceLineNo">553</span><a name="line.553"></a>
+<span class="sourceLineNo">554</span>  private void preTransitCheck(RegionStateNode regionNode, RegionState.State[] expectedStates)<a name="line.554"></a>
+<span class="sourceLineNo">555</span>      throws HBaseIOException {<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    if (regionNode.getProcedure() != null) {<a name="line.556"></a>
+<span class="sourceLineNo">557</span>      throw new HBaseIOException(regionNode + " is currently in transition");<a name="line.557"></a>
+<span class="sourceLineNo">558</span>    }<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    if (!regionNode.isInState(expectedStates)) {<a name="line.559"></a>
+<span class="sourceLineNo">560</span>      throw new DoNotRetryRegionException("Unexpected state for " + regionNode);<a name="line.560"></a>
+<span class="sourceLineNo">561</span>    }<a name="line.561"></a>
+<span class="sourceLineNo">562</span>    if (getTableStateManager().isTableState(regionNode.getTable(), TableState.State.DISABLING,<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      TableState.State.DISABLED)) {<a name="line.563"></a>
+<span class="sourceLineNo">564</span>      throw new DoNotRetryIOException(regionNode.getTable() + " is disabled for " + regionNode);<a name="line.564"></a>
+<span class="sourceLineNo">565</span>    }<a name="line.565"></a>
+<span class="sourceLineNo">566</span>  }<a name="line.566"></a>
+<span class="sourceLineNo">567</span><a name="line.567"></a>
+<span class="sourceLineNo">568</span>  // TODO: Need an async version of this for hbck2.<a name="line.568"></a>
+<span class="sourceLineNo">569</span>  public long assign(RegionInfo regionInfo, ServerName sn) throws IOException {<a name="line.569"></a>
+<span class="sourceLineNo">570</span>    // TODO: should we use getRegionStateNode?<a name="line.570"></a>
+<span class="sourceLineNo">571</span>    RegionStateNode regionNode = regionStates.getOrCreateRegionStateNode(regionInfo);<a name="line.571"></a>
+<span class="sourceLineNo">572</span>    TransitRegionStateProcedure proc;<a name="line.572"></a>
+<span class="sourceLineNo">573</span>    regionNode.lock();<a name="line.573"></a>
+<span class="sourceLineNo">574</span>    try {<a name="line.574"></a>
+<span class="sourceLineNo">575</span>      preTransitCheck(regionNode, STATES_EXPECTED_ON_ASSIGN);<a name="line.575"></a>
+<span class="sourceLineNo">576</span>      proc = TransitRegionStateProcedure.assign(getProcedureEnvironment(), regionInfo, sn);<a name="line.576"></a>
+<span class="sourceLineNo">577</span>      regionNode.setProcedure(proc);<a name="line.577"></a>
+<span class="sourceLineNo">578</span>    } finally {<a name="line.578"></a>
+<span class="sourceLineNo">579</span>      regionNode.unlock();<a name="line.579"></a>
+<span class="sourceLineNo">580</span>    }<a name="line.580"></a>
+<span class="sourceLineNo">581</span>    ProcedureSyncWait.submitAndWaitProcedure(master.getMasterProcedureExecutor(), proc);<a name="line.581"></a>
+<span class="sourceLineNo">582</span>    return proc.getProcId();<a name="line.582"></a>
+<span class="sourceLineNo">583</span>  }<a name="line.583"></a>
+<span class="sourceLineNo">584</span><a name="line.584"></a>
+<span class="sourceLineNo">585</span>  public long assign(RegionInfo regionInfo) throws IOException {<a name="line.585"></a>
+<span class="sourceLineNo">586</span>    return assign(regionInfo, null);<a name="line.586"></a>
+<span class="sourceLineNo">587</span>  }<a name="line.587"></a>
+<span class="sourceLineNo">588</span><a name="line.588"></a>
+<span class="sourceLineNo">589</span>  public long unassign(RegionInfo regionInfo) throws IOException {<a name="line.589"></a>
+<span class="sourceLineNo">590</span>    RegionStateNode regionNode = regionStates.getRegionStateNode(regionInfo);<a name="line.590"></a>
+<span class="sourceLineNo">591</span>    if (regionNode == null) {<a name="line.591"></a>
+<span class="sourceLineNo">592</span>      throw new UnknownRegionException("No RegionState found for " + regionInfo.getEncodedName());<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    }<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    TransitRegionStateProcedure proc;<a name="line.594"></a>
+<span class="sourceLineNo">595</span>    regionNode.lock();<a name="line.595"></a>
+<span class="sourceLineNo">596</span>    try {<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      preTransitCheck(regionNode, STATES_EXPECTED_ON_UNASSIGN_OR_MOVE);<a name="line.597"></a>
+<span class="sourceLineNo">598</span>      proc = TransitRegionStateProcedure.unassign(getProcedureEnvironment(), regionInfo);<a name="line.598"></a>
+<span class="sourceLineNo">599</span>      regionNode.setProcedure(proc);<a name="line.599"></a>
+<span class="sourceLineNo">600</span>    } finally {<a name="line.600"></a>
+<span class="sourceLineNo">601</span>      regionNode.unlock();<a name="line.601"></a>
+<span class="sourceLineNo">602</span>    }<a name="line.602"></a>
+<span class="sourceLineNo">603</span>    ProcedureSyncWait.submitAndWaitProcedure(master.getMasterProcedureExecutor(), proc);<a name="line.603"></a>
+<span class="sourceLineNo">604</span>    return proc.getProcId();<a name="line.604"></a>
+<span class="sourceLineNo">605</span>  }<a name="line.605"></a>
+<span class="sourceLineNo">606</span><a name="line.606"></a>
+<span class="sourceLineNo">607</span>  public TransitRegionStateProcedure createMoveRegionProcedure(RegionInfo regionInfo,<a name="line.607"></a>
+<span class="sourceLineNo">608</span>      ServerName targetServer) throws HBaseIOException {<a name="line.608"></a>
+<span class="sourceLineNo">609</span>    RegionStateNode regionNode = this.regionStates.getRegionStateNode(regionInfo);<a name="line.609"></a>
+<span class="sourceLineNo">610</span>    if (regionNode == null) {<a name="line.610"></a>
+<span class="sourceLineNo">611</span>      throw new UnknownRegionException("No RegionState found for " + regionInfo.getEncodedName());<a name="line.611"></a>
+<span class="sourceLineNo">612</span>    }<a name="line.612"></a>
+<span class="sourceLineNo">613</span>    TransitRegionStateProcedure proc;<a name="line.613"></a>
+<span class="sourceLineNo">614</span>    regionNode.lock();<a name="line.614"></a>
+<span class="sourceLineNo">615</span>    try {<a name="line.615"></a>
+<span class="sourceLineNo">616</span>      preTransitCheck(regionNode, STATES_EXPECTED_ON_UNASSIGN_OR_MOVE);<a name="line.616"></a>
+<span class="sourceLineNo">617</span>      regionNode.checkOnline();<a name="line.617"></a>
+<span class="sourceLineNo">618</span>      proc = TransitRegionStateProcedure.move(getProcedureEnvironment(), regionInfo, targetServer);<a name="line.618"></a>
+<span class="sourceLineNo">619</span>      regionNode.setProcedure(proc);<a name="line.619"></a>
+<span class="sourceLineNo">620</span>    } finally {<a name="line.620"></a>
+<span class="sourceLineNo">621</span>      regionNode.unlock();<a name="line.621"></a>
+<span class="sourceLineNo">622</span>    }<a name="line.622"></a>
+<span class="sourceLineNo">623</span>    return proc;<a name="line.623"></a>
+<span class="sourceLineNo">624</span>  }<a name="line.624"></a>
+<span class="sourceLineNo">625</span><a name="line.625"></a>
+<span class="sourceLineNo">626</span>  public void move(RegionInfo regionInfo) throws IOException {<a name="line.626"></a>
+<span class="sourceLineNo">627</span>    TransitRegionStateProcedure proc = createMoveRegionProcedure(regionInfo, null);<a name="line.627"></a>
+<span class="sourceLineNo">628</span>    ProcedureSyncWait.submitAndWaitProcedure(master.getMasterProcedureExecutor(), proc);<a name="line.628"></a>
+<span class="sourceLineNo">629</span>  }<a name="line.629"></a>
+<span class="sourceLineNo">630</span><a name="line.630"></a>
+<span class="sourceLineNo">631</span>  public Future&lt;byte[]&gt; moveAsync(RegionPlan regionPlan) throws HBaseIOException {<a name="line.631"></a>
+<span class="sourceLineNo">632</span>    TransitRegionStateProcedure proc =<a name="line.632"></a>
+<span class="sourceLineNo">633</span>      createMoveRegionProcedure(regionPlan.getRegionInfo(), regionPlan.getDestination());<a name="line.633"></a>
+<span class="sourceLineNo">634</span>    return ProcedureSyncWait.submitProcedure(master.getMasterProcedureExecutor(), proc);<a name="line.634"></a>
+<span class="sourceLineNo">635</span>  }<a name="line.635"></a>
+<span class="sourceLineNo">636</span><a name="line.636"></a>
+<span class="sourceLineNo">637</span>  // ============================================================================================<a name="line.637"></a>
+<span class="sourceLineNo">638</span>  //  RegionTransition procedures helpers<a name="line.638"></a>
+<span class="sourceLineNo">639</span>  // ============================================================================================<a name="line.639"></a>
+<span class="sourceLineNo">640</span><a name="line.640"></a>
+<span class="sourceLineNo">641</span>  /**<a name="line.641"></a>
+<span class="sourceLineNo">642</span>   * Create round-robin assigns. Use on table creation to distribute out regions across cluster.<a name="line.642"></a>
+<span class="sourceLineNo">643</span>   * @return AssignProcedures made out of the passed in &lt;code&gt;hris&lt;/code&gt; and a call to the balancer<a name="line.643"></a>
+<span class="sourceLineNo">644</span>   *         to populate the assigns with targets chosen using round-robin (default balancer<a name="line.644"></a>
+<span class="sourceLineNo">645</span>   *         scheme). If at assign-time, the target chosen is no longer up, thats fine, the<a name="line.645"></a>
+<span class="sourceLineNo">646</span>   *         AssignProcedure will ask the balancer for a new target, and so on.<a name="line.646"></a>
+<span class="sourceLineNo">647</span>   */<a name="line.647"></a>
+<span class="sourceLineNo">648</span>  public TransitRegionStateProcedure[] createRoundRobinAssignProcedures(List&lt;RegionInfo&gt; hris,<a name="line.648"></a>
+<span class="sourceLineNo">649</span>      List&lt;ServerName&gt; serversToExclude) {<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    if (hris.isEmpty()) {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>      return new TransitRegionStateProcedure[0];<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    }<a name="line.652"></a>
+<span class="sourceLineNo">653</span><a name="line.653"></a>
+<span class="sourceLineNo">654</span>    if (serversToExclude != null<a name="line.654"></a>
+<span class="sourceLineNo">655</span>        &amp;&amp; this.master.getServerManager().getOnlineServersList().size() == 1) {<a name="line.655"></a>
+<span class="sourceLineNo">656</span>      LOG.debug("Only one region server found and hence going ahead with the assignment");<a name="line.656"></a>
+<span class="sourceLineNo">657</span>      serversToExclude = null;<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    }<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    try {<a name="line.659"></a>
+<span class="sourceLineNo">660</span>      // Ask the balancer to assign our regions. Pass the regions en masse. The balancer can do<a name="line.660"></a>
+<span class="sourceLineNo">661</span>      // a better job if it has all the assignments in the one lump.<a name="line.661"></a>
+<span class="sourceLineNo">662</span>      Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = getBalancer().roundRobinAssignment(hris,<a name="line.662"></a>
+<span class="sourceLineNo">663</span>        this.master.getServerManager().createDestinationServersList(serversToExclude));<a name="line.663"></a>
+<span class="sourceLineNo">664</span>      // Return mid-method!<a name="line.664"></a>
+<span class="sourceLineNo">665</span>      return createAssignProcedures(assignments);<a name="line.665"></a>
+<span class="sourceLineNo">666</span>    } catch (HBaseIOException hioe) {<a name="line.666"></a>
+<span class="sourceLineNo">667</span>      LOG.warn("Failed roundRobinAssignment", hioe);<a name="line.667"></a>
+<span class="sourceLineNo">668</span>    }<a name="line.668"></a>
+<span class="sourceLineNo">669</span>    // If an error above, fall-through to this simpler assign. Last resort.<a name="line.669"></a>
+<span class="sourceLineNo">670</span>    return createAssignProcedures(hris);<a name="line.670"></a>
+<span class="sourceLineNo">671</span>  }<a name="line.671"></a>
+<span class="sourceLineNo">672</span><a name="line.672"></a>
+<span class="sourceLineNo">673</span>  /**<a name="line.673"></a>
+<span class="sourceLineNo">674</span>   * Create round-robin assigns. Use on table creation to distribute out regions across cluster.<a name="line.674"></a>
+<span class="sourceLineNo">675</span>   * @return AssignProcedures made out of the passed in &lt;code&gt;hris&lt;/code&gt; and a call to the balancer<a name="line.675"></a>
+<span class="sourceLineNo">676</span>   *         to populate the assigns with targets chosen using round-robin (default balancer<a name="line.676"></a>
+<span class="sourceLineNo">677</span>   *         scheme). If at assign-time, the target chosen is no longer up, thats fine, the<a name="line.677"></a>
+<span class="sourceLineNo">678</span>   *         AssignProcedure will ask the balancer for a new target, and so on.<a name="line.678"></a>
+<span class="sourceLineNo">679</span>   */<a name="line.679"></a>
+<span class="sourceLineNo">680</span>  public TransitRegionStateProcedure[] createRoundRobinAssignProcedures(List&lt;RegionInfo&gt; hris) {<a name="line.680"></a>
+<span class="sourceLineNo">681</span>    return createRoundRobinAssignProcedures(hris, null);<a name="line.681"></a>
+<span class="sourceLineNo">682</span>  }<a name="line.682"></a>
+<span class="sourceLineNo">683</span><a name="line.683"></a>
+<span class="sourceLineNo">684</span>  @VisibleForTesting<a name="line.684"></a>
+<span class="sourceLineNo">685</span>  static int compare(TransitRegionStateProcedure left, TransitRegionStateProcedure right) {<a name="line.685"></a>
+<span class="sourceLineNo">686</span>    if (left.getRegion().isMetaRegion()) {<a name="line.686"></a>
+<span class="sourceLineNo">687</span>      if (right.getRegion().isMetaRegion()) {<a name="line.687"></a>
+<span class="sourceLineNo">688</span>        return RegionInfo.COMPARATOR.compare(left.getRegion(), right.getRegion());<a name="line.688"></a>
+<span class="sourceLineNo">689</span>      }<a name="line.689"></a>
+<span class="sourceLineNo">690</span>      return -1;<a name="line.690"></a>
+<span class="sourceLineNo">691</span>    } else if (right.getRegion().isMetaRegion()) {<a name="line.691"></a>
+<span class="sourceLineNo">692</span>      return +1;<a name="line.692"></a>
+<span class="sourceLineNo">693</span>    }<a name="line.693"></a>
+<span class="sourceLineNo">694</span>    if (left.getRegion().getTable().isSystemTable()) {<a name="line.694"></a>
+<span class="sourceLineNo">695</span>      if (right.getRegion().getTable().isSystemTable()) {<a name="line.695"></a>
+<span class="sourceLineNo">696</span>        return RegionInfo.COMPARATOR.compare(left.getRegion(), right.getRegion());<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      }<a name="line.697"></a>
+<span class="sourceLineNo">698</span>      return -1;<a name="line.698"></a>
+<span class="sourceLineNo">699</span>    } else if (right.getRegion().getTable().isSystemTable()) {<a name="line.699"></a>
+<span class="sourceLineNo">700</span>      return +1;<a name="line.700"></a>
+<span class="sourceLineNo">701</span>    }<a name="line.701"></a>
+<span class="sourceLineNo">702</span>    return RegionInfo.COMPARATOR.compare(left.getRegion(), right.getRegion());<a name="line.702"></a>
+<span class="sourceLineNo">703</span>  }<a name="line.703"></a>
+<span class="sourceLineNo">704</span><a name="line.704"></a>
+<span class="sourceLineNo">705</span>  private TransitRegionStateProcedure createAssignProcedure(RegionStateNode regionNode,<a name="line.705"></a>
+<span class="sourceLineNo">706</span>      ServerName targetServer, boolean override) {<a name="line.706"></a>
+<span class="sourceLineNo">707</span>    TransitRegionStateProcedure proc;<a name="line.707"></a>
+<span class="sourceLineNo">708</span>    regionNode.lock();<a name="line.708"></a>
+<span class="sourceLineNo">709</span>    try {<a name="line.709"></a>
+<span class="sourceLineNo">710</span>      if(override &amp;&amp; regionNode.getProcedure() != null) {<a name="line.710"></a>
+<span class="sourceLineNo">711</span>        regionNode.unsetProcedure(regionNode.getProcedure());<a name="line.711"></a>
+<span class="sourceLineNo">712</span>      }<a name="line.712"></a>
+<span class="sourceLineNo">713</span>      assert regionNode.getProcedure() == null;<a name="line.713"></a>
+<span class="sourceLineNo">714</span>      proc = TransitRegionStateProcedure.assign(getProcedureEnvironment(),<a name="line.714"></a>
+<span class="sourceLineNo">715</span>        regionNode.getRegionInfo(), targetServer);<a name="line.715"></a>
+<span class="sourceLineNo">716</span>      regionNode.setProcedure(proc);<a name="line.716"></a>
+<span class="sourceLineNo">717</span>    } finally {<a name="line.717"></a>
+<span class="sourceLineNo">718</span>      regionNode.unlock();<a name="line.718"></a>
+<span class="sourceLineNo">719</span>    }<a name="line.719"></a>
+<span class="sourceLineNo">720</span>    return proc;<a name="line.720"></a>
+<span class="sourceLineNo">721</span>  }<a name="line.721"></a>
+<span class="sourceLineNo">722</span><a name="line.722"></a>
+<span class="sourceLineNo">723</span>  private TransitRegionStateProcedure createUnassignProcedure(RegionStateNode regionNode,<a name="line.723"></a>
+<span class="sourceLineNo">724</span>      boolean override) {<a name="line.724"></a>
+<span class="sourceLineNo">725</span>    TransitRegionStateProcedure proc;<a name="line.725"></a>
+<span class="sourceLineNo">726</span>    regionNode.lock();<a name="line.726"></a>
+<span class="sourceLineNo">727</span>    try {<a name="line.727"></a>
+<span class="sourceLineNo">728</span>      if(override &amp;&amp; regionNode.getProcedure() != null) {<a name="line.728"></a>
+<span class="sourceLineNo">729</span>        regionNode.unsetProcedure(regionNode.getProcedure());<a name="line.729"></a>
+<span class="sourceLineNo">730</span>      }<a name="line.730"></a>
+<span class="sourceLineNo">731</span>      assert regionNode.getProcedure() == null;<a name="line.731"></a>
+<span class="sourceLineNo">732</span>      proc = TransitRegionStateProcedure.unassign(getProcedureEnvironment(),<a name="line.732"></a>
+<span class="sourceLineNo">733</span>          regionNode.getRegionInfo());<a name="line.733"></a>
+<span class="sourceLineNo">734</span>      regionNode.setProcedure(proc);<a name="line.734"></a>
+<span class="sourceLineNo">735</span>    } finally {<a name="line.735"></a>
+<span class="sourceLineNo">736</span>      regionNode.unlock();<a name="line.736"></a>
+<span class="sourceLineNo">737</span>    }<a name="line.737"></a>
+<span class="sourceLineNo">738</span>    return proc;<a name="line.738"></a>
+<span class="sourceLineNo">739</span>  }<a name="line.739"></a>
+<span class="sourceLineNo">740</span><a name="line.740"></a>
+<span class="sourceLineNo">741</span>  /**<a name="line.741"></a>
+<span class="sourceLineNo">742</span>   * Create one TransitRegionStateProcedure to assign a region w/o specifying a target server.<a name="line.742"></a>
+<span class="sourceLineNo">743</span>   * This method is specified for HBCK2<a name="line.743"></a>
+<span class="sourceLineNo">744</span>   */<a name="line.744"></a>
+<span class="sourceLineNo">745</span>  public TransitRegionStateProcedure createOneAssignProcedure(RegionInfo hri, boolean override) {<a name="line.745"></a>
+<span class="sourceLineNo">746</span>    RegionStateNode regionNode = regionStates.getOrCreateRegionStateNode(hri);<a name="line.746"></a>
+<span class="sourceLineNo">747</span>    return createAssignProcedure(regionNode, null, override);<a name="line.747"></a>
+<span class="sourceLineNo">748</span>  }<a name="line.748"></a>
+<span class="sourceLineNo">749</span><a name="line.749"></a>
+<span class="sourceLineNo">750</span>  /**<a name="line.750"></a>
+<span class="sourceLineNo">751</span>   * Create one TransitRegionStateProcedure to unassign a region.<a name="line.751"></a>
+<span class="sourceLineNo">752</span>   * This method is specified for HBCK2<a name="line.752"></a>
+<span class="sourceLineNo">753</span>   */<a name="line.753"></a>
+<span class="sourceLineNo">754</span>  public TransitRegionStateProcedure createOneUnassignProcedure(RegionInfo hri, boolean override) {<a name="line.754"></a>
+<span class="sourceLineNo">755</span>    RegionStateNode regionNode = regionStates.getOrCreateRegionStateNode(hri);<a name="line.755"></a>
+<span class="sourceLineNo">756</span>    return createUnassignProcedure(regionNode, override);<a name="line.756"></a>
+<span class="sourceLineNo">757</span>  }<a name="line.757"></a>
+<span class="sourceLineNo">758</span><a name="line.758"></a>
+<span class="sourceLineNo">759</span>  /**<a name="line.759"></a>
+<span class="sourceLineNo">760</span>   * Create an array of TransitRegionStateProcedure w/o specifying a target server.<a name="line.760"></a>
+<span class="sourceLineNo">761</span>   * &lt;p/&gt;<a name="line.761"></a>
+<span class="sourceLineNo">762</span>   * If no target server, at assign time, we will try to use the former location of the region if<a name="line.762"></a>
+<span class="sourceLineNo">763</span>   * one exists. This is how we 'retain' the old location across a server restart.<a name="line.763"></a>
+<span class="sourceLineNo">764</span>   * &lt;p/&gt;<a name="line.764"></a>
+<span class="sourceLineNo">765</span>   * Should only be called when you can make sure that no one can touch these regions other than<a name="line.765"></a>
+<span class="sourceLineNo">766</span>   * you. For example, when you are creating table.<a name="line.766"></a>
+<span class="sourceLineNo">767</span>   */<a name="line.767"></a>
+<span class="sourceLineNo">768</span>  public TransitRegionStateProcedure[] createAssignProcedures(List&lt;RegionInfo&gt; hris) {<a name="line.768"></a>
+<span class="sourceLineNo">769</span>    return hris.stream().map(hri -&gt; regionStates.getOrCreateRegionStateNode(hri))<a name="line.769"></a>
+<span class="sourceLineNo">770</span>        .map(regionNode -&gt; createAssignProcedure(regionNode, null, false))<a name="line.770"></a>
+<span class="sourceLineNo">771</span>        .sorted(AssignmentManager::compare).toArray(TransitRegionStateProcedure[]::new);<a name="line.771"></a>
+<span class="sourceLineNo">772</span>  }<a name="line.772"></a>
+<span class="sourceLineNo">773</span><a name="line.773"></a>
+<span class="sourceLineNo">774</span>  /**<a name="line.774"></a>
+<span class="sourceLineNo">775</span>   * @param assignments Map of assignments from which we produce an array of AssignProcedures.<a name="line.775"></a>
+<span class="sourceLineNo">776</span>   * @return Assignments made from the passed in &lt;code&gt;assignments&lt;/code&gt;<a name="line.776"></a>
+<span class="sourceLineNo">777</span>   */<a name="line.777"></a>
+<span class="sourceLineNo">778</span>  private TransitRegionStateProcedure[] createAssignProcedures(<a name="line.778"></a>
+<span class="sourceLineNo">779</span>      Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments) {<a name="line.779"></a>
+<span class="sourceLineNo">780</span>    return assignments.entrySet().stream()<a name="line.780"></a>
+<span class="sourceLineNo">781</span>      .flatMap(e -&gt; e.getValue().stream().map(hri -&gt; regionStates.getOrCreateRegionStateNode(hri))<a name="line.781"></a>
+<span class="sourceLineNo">782</span>        .map(regionNode -&gt; createAssignProcedure(regionNode, e.getKey(), false)))<a name="line.782"></a>
+<span class="sourceLineNo">783</span>      .sorted(AssignmentManager::compare).toArray(TransitRegionStateProcedure[]::new);<a name="line.783"></a>
+<span class="sourceLineNo">784</span>  }<a name="line.784"></a>
+<span class="sourceLineNo">785</span><a name="line.785"></a>
+<span class="sourceLineNo">786</span>  /**<a name="line.786"></a>
+<span class="sourceLineNo">787</span>   * Called by DisableTableProcedure to unassign all the regions for a table.<a name="line.787"></a>
+<span class="sourceLineNo">788</span>   */<a name="line.788"></a>
+<span class="sourceLineNo">789</span>  public TransitRegionStateProcedure[] createUnassignProceduresForDisabling(TableName tableName) {<a name="line.789"></a>
+<span class="sourceLineNo">790</span>    return regionStates.getTableRegionStateNodes(tableName).stream().map(regionNode -&gt; {<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      regionNode.lock();<a name="line.791"></a>
+<span class="sourceLineNo">792</span>      try {<a name="line.792"></a>
+<span class="sourceLineNo">793</span>        if (!regionStates.include(regionNode, false) ||<a name="line.793"></a>
+<span class="sourceLineNo">794</span>          regionStates.isRegionOffline(regionNode.getRegionInfo())) {<a name="line.794"></a>
+<span class="sourceLineNo">795</span>          return null;<a name="line.795"></a>
+<span class="sourceLineNo">796</span>        }<a name="line.796"></a>
+<span class="sourceLineNo">797</span>        // As in DisableTableProcedure, we will hold the xlock for table, so we can make sure that<a name="line.797"></a>
+<span class="sourceLineNo">798</span>        // this procedure has not been executed yet, as TRSP will hold the shared lock for table all<a name="line.798"></a>
+<span class="sourceLineNo">799</span>        // the time. So here we will unset it and when it is actually executed, it will find that<a name="line.799"></a>
+<span class="sourceLineNo">800</span>        // the attach procedure is not itself and quit immediately.<a name="line.800"></a>
+<span class="sourceLineNo">801</span>        if (regionNode.getProcedure() != null) {<a name="line.801"></a>
+<span class="sourceLineNo">802</span>          regionNode.unsetProcedure(regionNode.getProcedure());<a name="line.802"></a>
+<span class="sourceLineNo">803</span>        }<a name="line.803"></a>
+<span class="sourceLineNo">804</span>        TransitRegionStateProcedure proc = TransitRegionStateProcedure<a name="line.804"></a>
+<span class="sourceLineNo">805</span>          .unassign(getProcedureEnvironment(), regionNode.getRegionInfo());<a name="line.805"></a>
+<span class="sourceLineNo">806</span>        regionNode.setProcedure(proc);<a name="line.806"></a>
+<span class="sourceLineNo">807</span>        return proc;<a name="line.807"></a>
+<span class="sourceLineNo">808</span>      } finally {<a name="line.808"></a>
+<span class="sourceLineNo">809</span>        regionNode.unlock();<a name="line.809"></a>
+<span class="sourceLineNo">810</span>      }<a name="line.810"></a>
+<span class="sourceLineNo">811</span>    }).filter(p -&gt; p != null).toArray(TransitRegionStateProcedure[]::new);<a name="line.811"></a>
+<span class="sourceLineNo">812</span>  }<a name="line.812"></a>
+<span class="sourceLineNo">813</span><a name="line.813"></a>
+<span class="sourceLineNo">814</span>  public SplitTableRegionProcedure createSplitProcedure(final RegionInfo regionToSplit,<a name="line.814"></a>
+<span class="sourceLineNo">815</span>      final byte[] splitKey) throws IOException {<a name="line.815"></a>
+<span class="sourceLineNo">816</span>    return new SplitTableRegionProcedure(getProcedureEnvironment(), regionToSplit, splitKey);<a name="line.816"></a>
+<span class="sourceLineNo">817</span>  }<a name="line.817"></a>
+<span class="sourceLineNo">818</span><a name="line.818"></a>
+<span class="sourceLineNo">819</span>  public MergeTableRegionsProcedure createMergeProcedure(final RegionInfo regionToMergeA,<a name="line.819"></a>
+<span class="sourceLineNo">820</span>      final RegionInfo regionToMergeB) throws IOException {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>    return new MergeTableRegionsProcedure(getProcedureEnvironment(), regionToMergeA,regionToMergeB);<a name="line.821"></a>
+<span class="sourceLineNo">822</span>  }<a name="line.822"></a>
+<span class="sourceLineNo">823</span><a name="line.823"></a>
+<span class="sourceLineNo">824</span>  /**<a name="line.824"></a>
+<span class="sourceLineNo">825</span>   * Delete the region states. This is called by "DeleteTable"<a name="line.825"></a>
+<span class="sourceLineNo">826</span>   */<a name="line.826"></a>
+<span class="sourceLineNo">827</span>  public void deleteTable(final TableName tableName) throws IOException {<a name="line.827"></a>
+<span class="sourceLineNo">828</span>    final ArrayList&lt;RegionInfo&gt; regions = regionStates.getTableRegionsInfo(tableName);<a name="line.828"></a>
+<span class="sourceLineNo">829</span>    regionStateStore.deleteRegions(regions);<a name="line.829"></a>
+<span class="sourceLineNo">830</span>    for (int i = 0; i &lt; regions.size(); ++i) {<a name="line.830"></a>
+<span class="sourceLineNo">831</span>      final RegionInfo regionInfo = regions.get(i);<a name="line.831"></a>
+<span class="sourceLineNo">832</span>      // we expect the region to be offline<a name="line.832"></a>
+<span class="sourceLineNo">833</span>      regionStates.removeFromOfflineRegions(regionInfo);<a name="line.833"></a>
+<span class="sourceLineNo">834</span>      regionStates.deleteRegion(regionInfo);<a name="line.834"></a>
+<span class="sourceLineNo">835</span>    }<a name="line.835"></a>
+<span class="sourceLineNo">836</span>  }<a name="line.836"></a>
+<span class="sourceLineNo">837</span><a name="line.837"></a>
+<span class="sourceLineNo">838</span>  // ============================================================================================<a name="line.838"></a>
+<span class="sourceLineNo">839</span>  //  RS Region Transition Report helpers<a name="line.839"></a>
+<span class="sourceLineNo">840</span>  // ============================================================================================<a name="line.840"></a>
+<span class="sourceLineNo">841</span>  private void reportRegionStateTransition(ReportRegionStateTransitionResponse.Builder builder,<a name="line.841"></a>
+<span class="sourceLineNo">842</span>      ServerName serverName, List&lt;RegionStateTransition&gt; transitionList) throws IOException {<a name="line.842"></a>
+<span class="sourceLineNo">843</span>    for (RegionStateTransition transition : transitionList) {<a name="line.843"></a>
+<span class="sourceLineNo">844</span>      switch (transition.getTransitionCode()) {<a name="line.844"></a>
+<span class="sourceLineNo">845</span>        case OPENED:<a name="line.845"></a>
+<span class="sourceLineNo">846</span>        case FAILED_OPEN:<a name="line.846"></a>
+<span class="sourceLineNo">847</span>        case CLOSED:<a name="line.847"></a>
+<span class="sourceLineNo">848</span>          assert transition.getRegionInfoCount() == 1 : transition;<a name="line.848"></a>
+<span class="sourceLineNo">849</span>          final RegionInfo hri = ProtobufUtil.toRegionInfo(transition.getRegionInfo(0));<a name="line.849"></a>
+<span class="sourceLineNo">850</span>          long procId =<a name="line.850"></a>
+<span class="sourceLineNo">851</span>            transition.getProcIdCount() &gt; 0 ? transition.getProcId(0) : Procedure.NO_PROC_ID;<a name="line.851"></a>
+<span class="sourceLineNo">852</span>          updateRegionTransition(serverName, transition.getTransitionCode(), hri,<a name="line.852"></a>
+<span class="sourceLineNo">853</span>            transition.hasOpenSeqNum() ? transition.getOpenSeqNum() : HConstants.NO_SEQNUM, procId);<a name="line.853"></a>
+<span class="sourceLineNo">854</span>          break;<a name="line.854"></a>
+<span class="sourceLineNo">855</span>        case READY_TO_SPLIT:<a name="line.855"></a>
+<span class="sourceLineNo">856</span>        case SPLIT:<a name="line.856"></a>
+<span class="sourceLineNo">857</span>        case SPLIT_REVERTED:<a name="line.857"></a>
+<span class="sourceLineNo">858</span>          assert transition.getRegionInfoCount() == 3 : transition;<a name="line.858"></a>
+<span class="sourceLineNo">859</span>          final RegionInfo parent = ProtobufUtil.toRegionInfo(transition.getRegionInfo(0));<a name="line.859"></a>
+<span class="sourceLineNo">860</span>          final RegionInfo splitA = ProtobufUtil.toRegionInfo(transition.getRegionInfo(1));<a name="line.860"></a>
+<span class="sourceLineNo">861</span>          final RegionInfo splitB = ProtobufUtil.toRegionInfo(transition.getRegionInfo(2));<a name="line.861"></a>
+<span class="sourceLineNo">862</span>          updateRegionSplitTransition(serverName, transition.getTransitionCode(), parent, splitA,<a name="line.862"></a>
+<span class="sourceLineNo">863</span>            splitB);<a name="line.863"></a>
+<span class="sourceLineNo">864</span>          break;<a name="line.864"></a>
+<span class="sourceLineNo">865</span>        case READY_TO_MERGE:<a name="line.865"></a>
+<span class="sourceLineNo">866</span>        case MERGED:<a name="line.866"></a>
+<span class="sourceLineNo">867</span>        case MERGE_REVERTED:<a name="line.867"></a>
+<span class="sourceLineNo">868</span>          assert transition.getRegionInfoCount() == 3 : transition;<a name="line.868"></a>
+<span class="sourceLineNo">869</span>          final RegionInfo merged = ProtobufUtil.toRegionInfo(transition.getRegionInfo(0));<a name="line.869"></a>
+<span class="sourceLineNo">870</span>          final RegionInfo mergeA = ProtobufUtil.toRegionInfo(transition.getRegionInfo(1));<a name="line.870"></a>
+<span class="sourceLineNo">871</span>          final RegionInfo mergeB = ProtobufUtil.toRegionInfo(transition.getRegionInfo(2));<a name="line.871"></a>
+<span class="sourceLineNo">872</span>          updateRegionMergeTransition(serverName, transition.getTransitionCode(), merged, mergeA,<a name="line.872"></a>
+<span class="sourceLineNo">873</span>            mergeB);<a name="line.873"></a>
+<span class="sourceLineNo">874</span>          break;<a name="line.874"></a>
+<span class="sourceLineNo">875</span>      }<a name="line.875"></a>
+<span class="sourceLineNo">876</span>    }<a name="line.876"></a>
+<span class="sourceLineNo">877</span>  }<a name="line.877"></a>
+<span class="sourceLineNo">878</span><a name="line.878"></a>
+<span class="sourceLineNo">879</span>  public ReportRegionStateTransitionResponse reportRegionStateTransition(<a name="line.879"></a>
+<span class="sourceLineNo">880</span>      final ReportRegionStateTransitionRequest req) throws PleaseHoldException {<a name="line.880"></a>
+<span class="sourceLineNo">881</span>    ReportRegionStateTransitionResponse.Builder builder =<a name="line.881"></a>
+<span class="sourceLineNo">882</span>        ReportRegionStateTransitionResponse.newBuilder();<a name="line.882"></a>
+<span class="sourceLineNo">883</span>    ServerName serverName = ProtobufUtil.toServerName(req.getServer());<a name="line.883"></a>
+<span class="sourceLineNo">884</span>    ServerStateNode serverNode = regionStates.getOrCreateServer(serverName);<a name="line.884"></a>
+<span class="sourceLineNo">885</span>    // here we have to acquire a read lock instead of a simple exclusive lock. This is because that<a name="line.885"></a>
+<span class="sourceLineNo">886</span>    // we should not block other reportRegionStateTransition call from the same region server. This<a name="line.886"></a>
+<span class="sourceLineNo">887</span>    // is not only about performance, but also to prevent dead lock. Think of the meta region is<a name="line.887"></a>
+<span class="sourceLineNo">888</span>    // also on the same region server and you hold the lock which blocks the<a name="line.888"></a>
+<span class="sourceLineNo">889</span>    // reportRegionStateTransition for meta, and since meta is not online, you will block inside the<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    // lock protection to wait for meta online...<a name="line.890"></a>
+<span class="sourceLineNo">891</span>    serverNode.readLock().lock();<a name="line.891"></a>
+<span class="sourceLineNo">892</span>    try {<a name="line.892"></a>
+<span class="sourceLineNo">893</span>      // we only accept reportRegionStateTransition if the region server is online, see the comment<a name="line.893"></a>
+<span class="sourceLineNo">894</span>      // above in submitServerCrash method and HBASE-21508 for more details.<a name="line.894"></a>
+<span class="sourceLineNo">895</span>      if (serverNode.isInState(ServerState.ONLINE)) {<a name="line.895"></a>
+<span class="sourceLineNo">896</span>        try {<a name="line.896"></a>
+<span class="sourceLineNo">897</span>          reportRegionStateTransition(builder, serverName, req.getTransitionList());<a name="line.897"></a>
+<span class="sourceLineNo">898</span>        } catch (PleaseHoldException e) {<a name="line.898"></a>
+<span class="sourceLineNo">899</span>          LOG.trace("Failed transition ", e);<a name="line.899"></a>
+<span class="sourceLineNo">900</span>          throw e;<a name="line.900"></a>
+<span class="sourceLineNo">901</span>        } catch (UnsupportedOperationException | IOException e) {<a name="line.901"></a>
+<span class="sourceLineNo">902</span>          // TODO: at the moment we have a single error message and the RS will abort<a name="line.902"></a>
+<span class="sourceLineNo">903</span>          // if the master says that one of the region transitions failed.<a name="line.903"></a>
+<span class="sourceLineNo">904</span>          LOG.warn("Failed transition", e);<a name="line.904"></a>
+<span class="sourceLineNo">905</span>          builder.setErrorMessage("Failed transition " + e.getMessage());<a name="line.905"></a>
+<span class="sourceLineNo">906</span>        }<a name="line.906"></a>
+<span class="sourceLineNo">907</span>      } else {<a name="line.907"></a>
+<span class="sourceLineNo">908</span>        LOG.warn("The region server {} is already dead, skip reportRegionStateTransition call",<a name="line.908"></a>
+<span class="sourceLineNo">909</span>          serverName);<a name="line.909"></a>
+<span class="sourceLineNo">910</span>        builder.setErrorMessage("You are dead");<a name="line.910"></a>
+<span class="sourceLineNo">911</span>      }<a name="line.911"></a>
+<span class="sourceLineNo">912</span>    } finally {<a name="line.912"></a>
+<span class="sourceLineNo">913</span>      serverNode.readLock().unlock();<a name="line.913"></a>
+<span class="sourceLineNo">914</span>    }<a name="line.914"></a>
+<span class="sourceLineNo">915</span><a name="line.915"></a>
+<span class="sourceLineNo">916</span>    return builder.build();<a name="line.916"></a>
+<span class="sourceLineNo">917</span>  }<a name="line.917"></a>
+<span class="sourceLineNo">918</span><a name="line.918"></a>
+<span class="sourceLineNo">919</span>  private void updateRegionTransition(ServerName serverName, TransitionCode state,<a name="line.919"></a>
+<span class="sourceLineNo">920</span>      RegionInfo regionInfo, long seqId, long procId) throws IOException {<a name="line.920"></a>
+<span class="sourceLineNo">921</span>    checkMetaLoaded(regionInfo);<a name="line.921"></a>
+<span class="sourceLineNo">922</span><a name="line.922"></a>
+<span class="sourceLineNo">923</span>    RegionStateNode regionNode = regionStates.getRegionStateNode(regionInfo);<a name="line.923"></a>
+<span class="sourceLineNo">924</span>    if (regionNode == null) {<a name="line.924"></a>
+<span class="sourceLineNo">925</span>      // the table/region is gone. maybe a delete, split, merge<a name="line.925"></a>
+<span class="sourceLineNo">926</span>      throw new UnexpectedStateException(String.format(<a name="line.926"></a>
+<span class="sourceLineNo">927</span>        "Server %s was trying to transition region %s to %s. but the region was removed.",<a name="line.927"></a>
+<span class="sourceLineNo">928</span>        serverName, regionInfo, state));<a name="line.928"></a>
+<span class="sourceLineNo">929</span>    }<a name="line.929"></a>
+<span class="sourceLineNo">930</span>    LOG.trace("Update region transition serverName={} region={} regionState={}", serverName,<a name="line.930"></a>
+<span class="sourceLineNo">931</span>      regionNode, state);<a name="line.931"></a>
+<span class="sourceLineNo">932</span><a name="line.932"></a>
+<span class="sourceLineNo">933</span>    ServerStateNode serverNode = regionStates.getOrCreateServer(serverName);<a name="line.933"></a>
+<span class="sourceLineNo">934</span>    regionNode.lock();<a name="line.934"></a>
+<span class="sourceLineNo">935</span>    try {<a name="line.935"></a>
+<span class="sourceLineNo">936</span>      if (!reportTransition(regionNode, serverNode, state, seqId, procId)) {<a name="line.936"></a>
+<span class="sourceLineNo">937</span>        // Don't log WARN if shutting down cluster; during shutdown. Avoid the below messages:<a name="line.937"></a>
+<span class="sourceLineNo">938</span>        // 2018-08-13 10:45:10,551 WARN ...AssignmentManager: No matching procedure found for<a name="line.938"></a>
+<span class="sourceLineNo">939</span>        // rit=OPEN, location=ve0538.halxg.cloudera.com,16020,1533493000958,<a name="line.939"></a>
+<span class="sourceLineNo">940</span>        // table=IntegrationTestBigLinkedList, region=65ab289e2fc1530df65f6c3d7cde7aa5 transition<a name="line.940"></a>
+<span class="sourceLineNo">941</span>        // to CLOSED<a name="line.941"></a>
+<span class="sourceLineNo">942</span>        // These happen because on cluster shutdown, we currently let the RegionServers close<a name="line.942"></a>
+<span class="sourceLineNo">943</span>        // regions. This is the only time that region close is not run by the Master (so cluster<a name="line.943"></a>
+<span class="sourceLineNo">944</span>        // goes down fast). Consider changing it so Master runs all shutdowns.<a name="line.944"></a>
+<span class="sourceLineNo">945</span>        if (this.master.getServerManager().isClusterShutdown() &amp;&amp;<a name="line.945"></a>
+<span class="sourceLineNo">946</span>          state.equals(TransitionCode.CLOSED)) {<a name="line.946"></a>
+<span class="sourceLineNo">947</span>          LOG.info("RegionServer {} {}", state, regionNode.getRegionInfo().getEncodedName());<a name="line.947"></a>
+<span class="sourceLineNo">948</span>        } else {<a name="line.948"></a>
+<span class="sourceLineNo">949</span>          LOG.warn("No matching procedure found for {} transition to {}", regionNode, state);<a name="line.949"></a>
+<span class="sourceLineNo">950</span>        }<a name="line.950"></a>
+<span class="sourceLineNo">951</span>      }<a name="line.951"></a>
+<span class="sourceLineNo">952</span>    } finally {<a name="line.952"></a>
+<span class="sourceLineNo">953</span>      regionNode.unlock();<a name="line.953"></a>
+<span class="sourceLineNo">954</span>    }<a name="line.954"></a>
+<span class="sourceLineNo">955</span>  }<a name="line.955"></a>
+<span class="sourceLineNo">956</span><a name="line.956"></a>
+<span class="sourceLineNo">957</span>  private boolean reportTransition(RegionStateNode regionNode, ServerStateNode serverNode,<a name="line.957"></a>
+<span class="sourceLineNo">958</span>      TransitionCode state, long seqId, long procId) throws IOException {<a name="line.958"></a>
+<span class="sourceLineNo">959</span>    ServerName serverName = serverNode.getServerName();<a name="line.959"></a>
+<span class="sourceLineNo">960</span>    TransitRegionStateProcedure proc = regionNode.getProcedure();<a name="line.960"></a>
+<span class="sourceLineNo">961</span>    if (proc == null) {<a name="line.961"></a>
+<span class="sourceLineNo">962</span>      return false;<a name="line.962"></a>
+<span class="sourceLineNo">963</span>    }<a name="line.963"></a>
+<span class="sourceLineNo">964</span>    proc.reportTransition(master.getMasterProcedureExecutor().getEnvironment(), regionNode,<a name="line.964"></a>
+<span class="sourceLineNo">965</span>      serverName, state, seqId, procId);<a name="line.965"></a>
+<span class="sourceLineNo">966</span>    return true;<a name="line.966"></a>
+<span class="sourceLineNo">967</span>  }<a name="line.967"></a>
+<span class="sourceLineNo">968</span><a name="line.968"></a>
+<span class="sourceLineNo">969</span>  private void updateRegionSplitTransition(final ServerName serverName, final TransitionCode state,<a name="line.969"></a>
+<span class="sourceLineNo">970</span>      final RegionInfo parent, final RegionInfo hriA, final RegionInfo hriB)<a name="line.970"></a>
+<span class="sourceLineNo">971</span>      throws IOException {<a name="line.971"></a>
+<span class="sourceLineNo">972</span>    checkMetaLoaded(parent);<a name="line.972"></a>
+<span class="sourceLineNo">973</span><a name="line.973"></a>
+<span class="sourceLineNo">974</span>    if (state != TransitionCode.READY_TO_SPLIT) {<a name="line.974"></a>
+<span class="sourceLineNo">975</span>      throw new UnexpectedStateException("unsupported split regionState=" + state +<a name="line.975"></a>
+<span class="sourceLineNo">976</span>        " for parent region " + parent +<a name="line.976"></a>
+<span class="sourceLineNo">977</span>        " maybe an old RS (&lt; 2.0) had the operation in progress");<a name="line.977"></a>
+<span class="sourceLineNo">978</span>    }<a name="line.978"></a>
+<span class="sourceLineNo">979</span><a name="line.979"></a>
+<span class="sourceLineNo">980</span>    // sanity check on the request<a name="line.980"></a>
+<span class="sourceLineNo">981</span>    if (!Bytes.equals(hriA.getEndKey(), hriB.getStartKey())) {<a name="line.981"></a>
+<span class="sourceLineNo">982</span>      throw new UnsupportedOperationException(<a name="line.982"></a>
+<span class="sourceLineNo">983</span>        "unsupported split request with bad keys: parent=" + parent +<a name="line.983"></a>
+<span class="sourceLineNo">984</span>        " hriA=" + hriA + " hriB=" + hriB);<a name="line.984"></a>
+<span class="sourceLineNo">985</span>    }<a name="line.985"></a>
+<span class="sourceLineNo">986</span><a name="line.986"></a>
+<span class="sourceLineNo">987</span>    // Submit the Split procedure<a name="line.987"></a>
+<span class="sourceLineNo">988</span>    final byte[] splitKey = hriB.getStartKey();<a name="line.988"></a>
+<span class="sourceLineNo">989</span>    if (LOG.isDebugEnabled()) {<a name="line.989"></a>
+<span class="sourceLineNo">990</span>      LOG.debug("Split request from " + serverName +<a name="line.990"></a>
+<span class="sourceLineNo">991</span>          ", parent=" + parent + " splitKey=" + Bytes.toStringBinary(splitKey));<a name="line.991"></a>
+<span class="sourceLineNo">992</span>    }<a name="line.992"></a>
+<span class="sourceLineNo">993</span>    master.getMasterProcedureExecutor().submitProcedure(createSplitProcedure(parent, splitKey));<a name="line.993"></a>
+<span class="sourceLineNo">994</span><a name="line.994"></a>
+<span class="sourceLineNo">995</span>    // If the RS is &lt; 2.0 throw an exception to abort the operation, we are handling the split<a name="line.995"></a>
+<span class="sourceLineNo">996</span>    if (master.getServerManager().getVersionNumber(serverName) &lt; 0x0200000) {<a name="line.996"></a>
+<span class="sourceLineNo">997</span>      throw new UnsupportedOperationException(String.format(<a name="line.997"></a>
+<span class="sourceLineNo">998</span>        "Split handled by the master: parent=%s hriA=%s hriB=%s", parent.getShortNameToLog(), hriA, hriB));<a name="line.998"></a>
+<span class="sourceLineNo">999</span>    }<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>  }<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span><a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>  private void updateRegionMergeTransition(final ServerName serverName, final TransitionCode state,<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>      final RegionInfo merged, final RegionInfo hriA, final RegionInfo hriB) throws IOException {<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>    checkMetaLoaded(merged);<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span><a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>    if (state != TransitionCode.READY_TO_MERGE) {<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>      throw new UnexpectedStateException("Unsupported merge regionState=" + state +<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>        " for regionA=" + hriA + " regionB=" + hriB + " merged=" + merged +<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>        " maybe an old RS (&lt; 2.0) had the operation in progress");<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>    }<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span><a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>    // Submit the Merge procedure<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>    if (LOG.isDebugEnabled()) {<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>      LOG.debug("Handling merge request from RS=" + merged + ", merged=" + merged);<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>    }<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>    master.getMasterProcedureExecutor().submitProcedure(createMergeProcedure(hriA, hriB));<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span><a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>    // If the RS is &lt; 2.0 throw an exception to abort the operation, we are handling the merge<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>    if (master.getServerManager().getVersionNumber(serverName) &lt; 0x0200000) {<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>      throw new UnsupportedOperationException(String.format(<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>        "Merge not handled yet: regionState=%s merged=%s hriA=%s hriB=%s", state, merged, hriA,<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>          hriB));<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>    }<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>  }<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span><a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>  // ============================================================================================<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>  //  RS Status update (report online regions) helpers<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>  // ============================================================================================<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>  /**<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>   * The master will call this method when the RS send the regionServerReport(). The report will<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>   * contains the "online regions". This method will check the the online regions against the<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>   * in-memory state of the AM, and we will log a warn message if there is a mismatch. This is<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>   * because that there is no fencing between the reportRegionStateTransition method and<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>   * regionServerReport method, so there could be race and introduce inconsistency here, but<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>   * actually there is no problem.<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>   * &lt;p/&gt;<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>   * Please see HBASE-21421 and HBASE-21463 for more details.<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>   */<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>  public void reportOnlineRegions(ServerName serverName, Set&lt;byte[]&gt; regionNames) {<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>    if (!isRunning()) {<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>      return;<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>    }<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>    if (LOG.isTraceEnabled()) {<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>      LOG.trace("ReportOnlineRegions {} regionCount={}, metaLoaded={} {}", serverName,<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>        regionNames.size(), isMetaLoaded(),<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>        regionNames.stream().map(Bytes::toStringBinary).collect(Collectors.toList()));<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>    }<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span><a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>    ServerStateNode serverNode = regionStates.getOrCreateServer(serverName);<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span><a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>    synchronized (serverNode) {<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>      if (!serverNode.isInState(ServerState.ONLINE)) {<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>        LOG.warn("Got a report from a server result in state " + serverNode.getState());<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>        return;<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>      }<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    }<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>    if (regionNames.isEmpty()) {<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>      // nothing to do if we don't have regions<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>      LOG.trace("no online region found on {}", serverName);<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>      return;<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>    }<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    if (!isMetaLoaded()) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>      // we are still on startup, skip checking<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      return;<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>    }<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>    // The Heartbeat tells us of what regions are on the region serve, check the state.<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>    checkOnlineRegionsReport(serverNode, regionNames);<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>  }<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span><a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>  // just check and output possible inconsistency, without actually doing anything<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>  private void checkOnlineRegionsReport(ServerStateNode serverNode, Set&lt;byte[]&gt; regionNames) {<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>    ServerName serverName = serverNode.getServerName();<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>    for (byte[] regionName : regionNames) {<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>      if (!isRunning()) {<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>        return;<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>      }<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      RegionStateNode regionNode = regionStates.getRegionStateNodeFromName(regionName);<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>      if (regionNode == null) {<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>        LOG.warn("No region state node for {}, it should already be on {}",<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>          Bytes.toStringBinary(regionName), serverName);<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>        continue;<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>      }<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>      regionNode.lock();<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      try {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>        long diff = EnvironmentEdgeManager.currentTime() - regionNode.getLastUpdate();<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>        if (regionNode.isInState(State.OPENING, State.OPEN)) {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>          // This is possible as a region server has just closed a region but the region server<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>          // report is generated before the closing, but arrive after the closing. Make sure there<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>          // is some elapsed time so less false alarms.<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>          if (!regionNode.getRegionLocation().equals(serverName) &amp;&amp; diff &gt; 1000) {<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>            LOG.warn("{} reported OPEN on server={} but state has otherwise", regionNode,<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>              serverName);<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>          }<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>        } else if (!regionNode.isInState(State.CLOSING, State.SPLITTING)) {<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>          // So, we can get report that a region is CLOSED or SPLIT because a heartbeat<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>          // came in at about same time as a region transition. Make sure there is some<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>          // elapsed time so less false alarms.<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>          if (diff &gt; 1000) {<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>            LOG.warn("{} reported an unexpected OPEN on {}; time since last update={}ms",<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>              regionNode, serverName, diff);<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>          }<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>        }<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      } finally {<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>        regionNode.unlock();<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>      }<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>    }<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>  }<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span><a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>  // ============================================================================================<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>  //  RIT chore<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>  // ============================================================================================<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>  private static class RegionInTransitionChore extends ProcedureInMemoryChore&lt;MasterProcedureEnv&gt; {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>    public RegionInTransitionChore(final int timeoutMsec) {<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>      super(timeoutMsec);<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>    }<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span><a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>    @Override<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>    protected void periodicExecute(final MasterProcedureEnv env) {<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>      final AssignmentManager am = env.getAssignmentManager();<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span><a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>      final RegionInTransitionStat ritStat = am.computeRegionInTransitionStat();<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      if (ritStat.hasRegionsOverThreshold()) {<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>        for (RegionState hri: ritStat.getRegionOverThreshold()) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>          am.handleRegionOverStuckWarningThreshold(hri.getRegion());<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>        }<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>      }<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span><a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>      // update metrics<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>      am.updateRegionsInTransitionMetrics(ritStat);<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>    }<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>  }<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span><a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>  public RegionInTransitionStat computeRegionInTransitionStat() {<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>    final RegionInTransitionStat rit = new RegionInTransitionStat(getConfiguration());<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>    rit.update(this);<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>    return rit;<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>  }<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span><a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>  public static class RegionInTransitionStat {<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    private final int ritThreshold;<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span><a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>    private HashMap&lt;String, RegionState&gt; ritsOverThreshold = null;<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    private long statTimestamp;<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>    private long oldestRITTime = 0;<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>    private int totalRITsTwiceThreshold = 0;<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>    private int totalRITs = 0;<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span><a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>    @VisibleForTesting<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    public RegionInTransitionStat(final Configuration conf) {<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>      this.ritThreshold =<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>        conf.getInt(METRICS_RIT_STUCK_WARNING_THRESHOLD, DEFAULT_RIT_STUCK_WARNING_THRESHOLD);<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    }<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span><a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>    public int getRITThreshold() {<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>      return ritThreshold;<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    }<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span><a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    public long getTimestamp() {<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>      return statTimestamp;<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    }<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span><a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>    public int getTotalRITs() {<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>      return totalRITs;<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>    }<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span><a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>    public long getOldestRITTime() {<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>      return oldestRITTime;<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>    }<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span><a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>    public int getTotalRITsOverThreshold() {<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>      Map&lt;String, RegionState&gt; m = this.ritsOverThreshold;<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>      return m != null ? m.size() : 0;<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>    }<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span><a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>    public boolean hasRegionsTwiceOverThreshold() {<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>      return totalRITsTwiceThreshold &gt; 0;<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>    }<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span><a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>    public boolean hasRegionsOverThreshold() {<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>      Map&lt;String, RegionState&gt; m = this.ritsOverThreshold;<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>      return m != null &amp;&amp; !m.isEmpty();<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>    }<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span><a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>    public Collection&lt;RegionState&gt; getRegionOverThreshold() {<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>      Map&lt;String, RegionState&gt; m = this.ritsOverThreshold;<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>      return m != null? m.values(): Collections.emptySet();<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>    }<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span><a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>    public boolean isRegionOverThreshold(final RegionInfo regionInfo) {<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>      Map&lt;String, RegionState&gt; m = this.ritsOverThreshold;<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>      return m != null &amp;&amp; m.containsKey(regionInfo.getEncodedName());<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>    }<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span><a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>    public boolean isRegionTwiceOverThreshold(final RegionInfo regionInfo) {<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>      Map&lt;String, RegionState&gt; m = this.ritsOverThreshold;<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>      if (m == null) return false;<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>      final RegionState state = m.get(regionInfo.getEncodedName());<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>      if (state == null) return false;<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>      return (statTimestamp - state.getStamp()) &gt; (ritThreshold * 2);<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>    }<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span><a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>    protected void update(final AssignmentManager am) {<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>      final RegionStates regionStates = am.getRegionStates();<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      this.statTimestamp = EnvironmentEdgeManager.currentTime();<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>      update(regionStates.getRegionsStateInTransition(), statTimestamp);<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>      update(regionStates.getRegionFailedOpen(), statTimestamp);<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>    }<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span><a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>    private void update(final Collection&lt;RegionState&gt; regions, final long currentTime) {<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>      for (RegionState state: regions) {<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>        totalRITs++;<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>        final long ritStartedMs = state.getStamp();<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>        if (ritStartedMs == 0) {<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>          // Don't output bogus values to metrics if they accidentally make it here.<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>          LOG.warn("The RIT {} has no start time", state.getRegion());<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>          continue;<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>        }<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>        final long ritTime = currentTime - ritStartedMs;<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>        if (ritTime &gt; ritThreshold) {<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>          if (ritsOverThreshold == null) {<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>            ritsOverThreshold = new HashMap&lt;String, RegionState&gt;();<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>          }<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>          ritsOverThreshold.put(state.getRegion().getEncodedName(), state);<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>          totalRITsTwiceThreshold += (ritTime &gt; (ritThreshold * 2)) ? 1 : 0;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>        }<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>        if (oldestRITTime &lt; ritTime) {<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>          oldestRITTime = ritTime;<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>        }<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><a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>  private void updateRegionsInTransitionMetrics(final RegionInTransitionStat ritStat) {<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>    metrics.updateRITOldestAge(ritStat.getOldestRITTime());<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>    metrics.updateRITCount(ritStat.getTotalRITs());<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>    metrics.updateRITCountOverThreshold(ritStat.getTotalRITsOverThreshold());<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>  }<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span><a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>  private void handleRegionOverStuckWarningThreshold(final RegionInfo regionInfo) {<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>    final RegionStateNode regionNode = regionStates.getRegionStateNode(regionInfo);<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>    //if (regionNode.isStuck()) {<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>    LOG.warn("STUCK Region-In-Transition {}", regionNode);<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>  }<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span><a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>  // ============================================================================================<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>  //  TODO: Master load/bootstrap<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>  // ============================================================================================<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>  public void joinCluster() throws IOException {<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>    long startTime = System.nanoTime();<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>    LOG.debug("Joining cluster...");<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span><a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>    // Scan hbase:meta to build list of existing regions, servers, and assignment.<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>    // hbase:meta is online now or will be. Inside loadMeta, we keep trying. Can't make progress<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>    // w/o  meta.<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>    loadMeta();<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span><a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>    while (master.getServerManager().countOfRegionServers() &lt; 1) {<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>      LOG.info("Waiting for RegionServers to join; current count={}",<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>        master.getServerManager().countOfRegionServers());<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>      Threads.sleep(250);<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>    }<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>    LOG.info("Number of RegionServers={}", master.getServerManager().countOfRegionServers());<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span><a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>    // Start the RIT chore<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>    master.getMasterProcedureExecutor().addChore(this.ritChore);<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span><a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>    long costMs = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startTime);<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>    LOG.info("Joined the cluster in {}", StringUtils.humanTimeDiff(costMs));<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>   * Create assign procedure for offline regions.<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>   * Just follow the old processofflineServersWithOnlineRegions method. Since now we do not need to<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>   * deal with dead server any more, we only deal with the regions in OFFLINE state in this method.<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>   * And this is a bit strange, that for new regions, we will add it in CLOSED state instead of<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>   * OFFLINE state, and usually there will be a procedure to track them. The<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>   * processofflineServersWithOnlineRegions is a legacy from long ago, as things are going really<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>   * different now, maybe we do not need this method any more. Need to revisit later.<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>   */<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>  // Public so can be run by the Master as part of the startup. Needs hbase:meta to be online.<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>  // Needs to be done after the table state manager has been started.<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>  public void processOfflineRegions() {<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>    List&lt;RegionInfo&gt; offlineRegions = regionStates.getRegionStates().stream()<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>      .filter(RegionState::isOffline).filter(s -&gt; isTableEnabled(s.getRegion().getTable()))<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>      .map(RegionState::getRegion).collect(Collectors.toList());<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>    if (!offlineRegions.isEmpty()) {<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>      master.getMasterProcedureExecutor().submitProcedures(<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>        master.getAssignmentManager().createRoundRobinAssignProcedures(offlineRegions));<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    }<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>  }<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span><a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>  private void loadMeta() throws IOException {<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>    // TODO: use a thread pool<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    regionStateStore.visitMeta(new RegionStateStore.RegionStateVisitor() {<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      @Override<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>      public void visitRegionState(Result result, final RegionInfo regionInfo, final State state,<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>          final ServerName regionLocation, final ServerName lastHost, final long openSeqNum) {<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>        if (state == null &amp;&amp; regionLocation == null &amp;&amp; lastHost == null &amp;&amp;<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>            openSeqNum == SequenceId.NO_SEQUENCE_ID) {<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>          // This is a row with nothing in it.<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>          LOG.warn("Skipping empty row={}", result);<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>          return;<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>        }<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>        State localState = state;<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>        if (localState == null) {<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>          // No region state column data in hbase:meta table! Are I doing a rolling upgrade from<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>          // hbase1 to hbase2? Am I restoring a SNAPSHOT or otherwise adding a region to hbase:meta?<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>          // In any of these cases, state is empty. For now, presume OFFLINE but there are probably<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>          // cases where we need to probe more to be sure this correct; TODO informed by experience.<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>          LOG.info(regionInfo.getEncodedName() + " regionState=null; presuming " + State.OFFLINE);<a name="line.1310"></a>
 <span class="sourceLineNo">1311</span>          localState = State.OFFLINE;<a name="line.1311"></a>
 <span class="sourceLineNo">1312</span>        }<a name="line.1312"></a>
 <span class="sourceLineNo">1313</span>        RegionStateNode regionNode = regionStates.getOrCreateRegionStateNode(regionInfo);<a name="line.1313"></a>
@@ -1336,599 +1336,620 @@
 <span class="sourceLineNo">1328</span>        } else if (localState == State.OFFLINE || regionInfo.isOffline()) {<a name="line.1328"></a>
 <span class="sourceLineNo">1329</span>          regionStates.addToOfflineRegions(regionNode);<a name="line.1329"></a>
 <span class="sourceLineNo">1330</span>        }<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      }<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>    });<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span><a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>    // every assignment is blocked until meta is loaded.<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    wakeMetaLoadedEvent();<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>   * Used to check if the meta loading is done.<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>   * &lt;p/&gt;<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>   * if not we throw PleaseHoldException since we are rebuilding the RegionStates<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>   * @param hri region to check if it is already rebuild<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>   * @throws PleaseHoldException if meta has not been loaded yet<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>   */<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>  private void checkMetaLoaded(RegionInfo hri) throws PleaseHoldException {<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    if (!isRunning()) {<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      throw new PleaseHoldException("AssignmentManager not running");<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>    }<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>    boolean meta = isMetaRegion(hri);<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>    boolean metaLoaded = isMetaLoaded();<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>    if (!meta &amp;&amp; !metaLoaded) {<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>      throw new PleaseHoldException(<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>        "Master not fully online; hbase:meta=" + meta + ", metaLoaded=" + metaLoaded);<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>    }<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>  }<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span><a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>  // ============================================================================================<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>  //  TODO: Metrics<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>  // ============================================================================================<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>  public int getNumRegionsOpened() {<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>    // TODO: Used by TestRegionPlacement.java and assume monotonically increasing value<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>    return 0;<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>  }<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span><a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>  public long submitServerCrash(ServerName serverName, boolean shouldSplitWal) {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>    boolean carryingMeta;<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>    long pid;<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>    ServerStateNode serverNode = regionStates.getServerNode(serverName);<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>    if(serverNode == null){<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>      LOG.info("Skip to add SCP for {} since this server should be OFFLINE already", serverName);<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      return -1;<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>    }<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    // we hold the write lock here for fencing on reportRegionStateTransition. Once we set the<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>    // server state to CRASHED, we will no longer accept the reportRegionStateTransition call from<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    // this server. This is used to simplify the implementation for TRSP and SCP, where we can make<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>    // sure that, the region list fetched by SCP will not be changed any more.<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    serverNode.writeLock().lock();<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>    try {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>      ProcedureExecutor&lt;MasterProcedureEnv&gt; procExec = this.master.getMasterProcedureExecutor();<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      carryingMeta = isCarryingMeta(serverName);<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>      if (!serverNode.isInState(ServerState.ONLINE)) {<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>        LOG.info(<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>          "Skip to add SCP for {} with meta= {}, " +<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>              "since there should be a SCP is processing or already done for this server node",<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>          serverName, carryingMeta);<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>        return -1;<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>      } else {<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>        serverNode.setState(ServerState.CRASHED);<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>        pid = procExec.submitProcedure(new ServerCrashProcedure(procExec.getEnvironment(),<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>            serverName, shouldSplitWal, carryingMeta));<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>        LOG.info(<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>          "Added {} to dead servers which carryingMeta={}, submitted ServerCrashProcedure pid={}",<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>          serverName, carryingMeta, pid);<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>      }<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>    } finally {<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      serverNode.writeLock().unlock();<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>    }<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>    return pid;<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>  }<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span><a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>  public void offlineRegion(final RegionInfo regionInfo) {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>    // TODO used by MasterRpcServices<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>    RegionStateNode node = regionStates.getRegionStateNode(regionInfo);<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    if (node != null) {<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>      node.offline();<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    }<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>  public void onlineRegion(final RegionInfo regionInfo, final ServerName serverName) {<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>    // TODO used by TestSplitTransactionOnCluster.java<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>  }<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span><a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; getSnapShotOfAssignment(<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>      final Collection&lt;RegionInfo&gt; regions) {<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>    return regionStates.getSnapShotOfAssignment(regions);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>  }<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>  //  TODO: UTILS/HELPERS?<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>   * Used by the client (via master) to identify if all regions have the schema updates<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>   *<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>   * @param tableName<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>   * @return Pair indicating the status of the alter command (pending/total)<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>   * @throws IOException<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>   */<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>  public Pair&lt;Integer, Integer&gt; getReopenStatus(TableName tableName) {<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>    if (isTableDisabled(tableName)) return new Pair&lt;Integer, Integer&gt;(0, 0);<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span><a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>    final List&lt;RegionState&gt; states = regionStates.getTableRegionStates(tableName);<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>    int ritCount = 0;<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>    for (RegionState regionState: states) {<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>      if (!regionState.isOpened() &amp;&amp; !regionState.isSplit()) {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>        ritCount++;<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>      }<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>    }<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    return new Pair&lt;Integer, Integer&gt;(ritCount, states.size());<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>  }<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>  //  TODO: Region State In Transition<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>  // ============================================================================================<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>  public boolean hasRegionsInTransition() {<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>    return regionStates.hasRegionsInTransition();<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>  public List&lt;RegionStateNode&gt; getRegionsInTransition() {<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>    return regionStates.getRegionsInTransition();<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>  public List&lt;RegionInfo&gt; getAssignedRegions() {<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    return regionStates.getAssignedRegions();<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>  }<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span><a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>  public RegionInfo getRegionInfo(final byte[] regionName) {<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>    final RegionStateNode regionState = regionStates.getRegionStateNodeFromName(regionName);<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>    return regionState != null ? regionState.getRegionInfo() : null;<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>  }<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span><a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>  // ============================================================================================<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>  //  Expected states on region state transition.<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>  //  Notice that there is expected states for transiting to OPENING state, this is because SCP.<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>  //  See the comments in regionOpening method for more details.<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>  // ============================================================================================<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>  private static final State[] STATES_EXPECTED_ON_OPEN = {<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>    State.OPENING, // Normal case<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>    State.OPEN // Retrying<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>  };<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span><a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>  private static final State[] STATES_EXPECTED_ON_CLOSING = {<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>    State.OPEN, // Normal case<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>    State.CLOSING, // Retrying<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>    State.SPLITTING, // Offline the split parent<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>    State.MERGING // Offline the merge parents<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>  private static final State[] STATES_EXPECTED_ON_CLOSED = {<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>    State.CLOSING, // Normal case<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>    State.CLOSED // Retrying<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>  };<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span><a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>  // This is for manually scheduled region assign, can add other states later if we find out other<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>  // usages<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>  private static final State[] STATES_EXPECTED_ON_ASSIGN = { State.CLOSED, State.OFFLINE };<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span><a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>  // We only allow unassign or move a region which is in OPEN state.<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>  private static final State[] STATES_EXPECTED_ON_UNASSIGN_OR_MOVE = { State.OPEN };<a name="line.1488"></a>
+<span class="sourceLineNo">1331</span>        if (regionNode.getProcedure() != null) {<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>          regionNode.getProcedure().stateLoaded(AssignmentManager.this, regionNode);<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>        }<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>      }<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>    // every assignment is blocked until meta is loaded.<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>    wakeMetaLoadedEvent();<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>  }<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span><a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>  /**<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>   * Used to check if the meta loading is done.<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>   * &lt;p/&gt;<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>   * if not we throw PleaseHoldException since we are rebuilding the RegionStates<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>   * @param hri region to check if it is already rebuild<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>   * @throws PleaseHoldException if meta has not been loaded yet<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>   */<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>  private void checkMetaLoaded(RegionInfo hri) throws PleaseHoldException {<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>    if (!isRunning()) {<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>      throw new PleaseHoldException("AssignmentManager not running");<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>    }<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    boolean meta = isMetaRegion(hri);<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>    boolean metaLoaded = isMetaLoaded();<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>    if (!meta &amp;&amp; !metaLoaded) {<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>      throw new PleaseHoldException(<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>        "Master not fully online; hbase:meta=" + meta + ", metaLoaded=" + metaLoaded);<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>    }<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>  }<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span><a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>  // ============================================================================================<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>  //  TODO: Metrics<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>  // ============================================================================================<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>  public int getNumRegionsOpened() {<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>    // TODO: Used by TestRegionPlacement.java and assume monotonically increasing value<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    return 0;<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>  }<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span><a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>  public long submitServerCrash(ServerName serverName, boolean shouldSplitWal) {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>    boolean carryingMeta;<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    long pid;<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>    ServerStateNode serverNode = regionStates.getServerNode(serverName);<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>    if(serverNode == null){<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>      LOG.info("Skip to add SCP for {} since this server should be OFFLINE already", serverName);<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>      return -1;<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>    }<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    // we hold the write lock here for fencing on reportRegionStateTransition. Once we set the<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>    // server state to CRASHED, we will no longer accept the reportRegionStateTransition call from<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    // this server. This is used to simplify the implementation for TRSP and SCP, where we can make<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>    // sure that, the region list fetched by SCP will not be changed any more.<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>    serverNode.writeLock().lock();<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>    try {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      ProcedureExecutor&lt;MasterProcedureEnv&gt; procExec = this.master.getMasterProcedureExecutor();<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>      carryingMeta = isCarryingMeta(serverName);<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>      if (!serverNode.isInState(ServerState.ONLINE)) {<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>        LOG.info(<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>          "Skip to add SCP for {} with meta= {}, " +<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>              "since there should be a SCP is processing or already done for this server node",<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>          serverName, carryingMeta);<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>        return -1;<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>      } else {<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>        serverNode.setState(ServerState.CRASHED);<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>        pid = procExec.submitProcedure(new ServerCrashProcedure(procExec.getEnvironment(),<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>            serverName, shouldSplitWal, carryingMeta));<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>        LOG.info(<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>          "Added {} to dead servers which carryingMeta={}, submitted ServerCrashProcedure pid={}",<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>          serverName, carryingMeta, pid);<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>      }<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span>    } finally {<a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>      serverNode.writeLock().unlock();<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>    }<a name="line.1400"></a>
+<span class="sourceLineNo">1401</span>    return pid;<a name="line.1401"></a>
+<span class="sourceLineNo">1402</span>  }<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span><a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>  public void offlineRegion(final RegionInfo regionInfo) {<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>    // TODO used by MasterRpcServices<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>    RegionStateNode node = regionStates.getRegionStateNode(regionInfo);<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>    if (node != null) {<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>      node.offline();<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>    }<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>  }<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span><a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>  public void onlineRegion(final RegionInfo regionInfo, final ServerName serverName) {<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>    // TODO used by TestSplitTransactionOnCluster.java<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>  }<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span><a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; getSnapShotOfAssignment(<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span>      final Collection&lt;RegionInfo&gt; regions) {<a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>    return regionStates.getSnapShotOfAssignment(regions);<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>  }<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>  //  TODO: UTILS/HELPERS?<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>   * Used by the client (via master) to identify if all regions have the schema updates<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>   *<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>   * @param tableName<a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>   * @return Pair indicating the status of the alter command (pending/total)<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>   * @throws IOException<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span>   */<a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>  public Pair&lt;Integer, Integer&gt; getReopenStatus(TableName tableName) {<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>    if (isTableDisabled(tableName)) return new Pair&lt;Integer, Integer&gt;(0, 0);<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span><a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>    final List&lt;RegionState&gt; states = regionStates.getTableRegionStates(tableName);<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>    int ritCount = 0;<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span>    for (RegionState regionState: states) {<a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>      if (!regionState.isOpened() &amp;&amp; !regionState.isSplit()) {<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>        ritCount++;<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>      }<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>    }<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>    return new Pair&lt;Integer, Integer&gt;(ritCount, states.size());<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>  }<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span><a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>  // ============================================================================================<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>  //  TODO: Region State In Transition<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span>  // ============================================================================================<a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>  public boolean hasRegionsInTransition() {<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>    return regionStates.hasRegionsInTransition();<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>  }<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span><a name="line.1450"></a>
+<span class="sourceLineNo">1451</span>  public List&lt;RegionStateNode&gt; getRegionsInTransition() {<a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>    return regionStates.getRegionsInTransition();<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>  }<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span><a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>  public List&lt;RegionInfo&gt; getAssignedRegions() {<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>    return regionStates.getAssignedRegions();<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>  public RegionInfo getRegionInfo(final byte[] regionName) {<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>    final RegionStateNode regionState = regionStates.getRegionStateNodeFromName(regionName);<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>    return regionState != null ? regionState.getRegionInfo() : null;<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>  // ============================================================================================<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span>  //  Expected states on region state transition.<a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>  //  Notice that there is expected states for transiting to OPENING state, this is because SCP.<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>  //  See the comments in regionOpening method for more details.<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>  // ============================================================================================<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>  private static final State[] STATES_EXPECTED_ON_OPEN = {<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>    State.OPENING, // Normal case<a name="line.1470"></a>
+<span class="sourceLineNo">1471</span>    State.OPEN // Retrying<a name="line.1471"></a>
+<span class="sourceLineNo">1472</span>  };<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span><a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>  private static final State[] STATES_EXPECTED_ON_CLOSING = {<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span>    State.OPEN, // Normal case<a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>    State.CLOSING, // Retrying<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>    State.SPLITTING, // Offline the split parent<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>    State.MERGING // Offline the merge parents<a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>  };<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span><a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>  private static final State[] STATES_EXPECTED_ON_CLOSED = {<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>    State.CLOSING, // Normal case<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>    State.CLOSED // Retrying<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>  };<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span><a name="line.1485"></a>
+<span class="sourceLineNo">1486</span>  // This is for manually scheduled region assign, can add other states later if we find out other<a name="line.1486"></a>
+<span class="sourceLineNo">1487</span>  // usages<a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>  private static final State[] STATES_EXPECTED_ON_ASSIGN = { State.CLOSED, State.OFFLINE };<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>  //  Region Status update<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>  //  Should only be called in TransitRegionStateProcedure<a name="line.1492"></a>
+<span class="sourceLineNo">1490</span>  // We only allow unassign or move a region which is in OPEN state.<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>  private static final State[] STATES_EXPECTED_ON_UNASSIGN_OR_MOVE = { State.OPEN };<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span><a name="line.1492"></a>
 <span class="sourceLineNo">1493</span>  // ============================================================================================<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>  private void transitStateAndUpdate(RegionStateNode regionNode, RegionState.State newState,<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>      RegionState.State... expectedStates) throws IOException {<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>    RegionState.State state = regionNode.getState();<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>    regionNode.transitionState(newState, expectedStates);<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>    boolean succ = false;<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>    try {<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>      regionStateStore.updateRegionLocation(regionNode);<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>      succ = true;<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>    } finally {<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>      if (!succ) {<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span>        // revert<a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>        regionNode.setState(state);<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>  }<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span><a name="line.1509"></a>
-<span class="sourceLineNo">1510</span>  // should be called within the synchronized block of RegionStateNode<a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>  void regionOpening(RegionStateNode regionNode) throws IOException {<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>    // As in SCP, for performance reason, there is no TRSP attached with this region, we will not<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>    // update the region state, which means that the region could be in any state when we want to<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>    // assign it after a RS crash. So here we do not pass the expectedStates parameter.<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>    transitStateAndUpdate(regionNode, State.OPENING);<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>    regionStates.addRegionToServer(regionNode);<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>    // update the operation count metrics<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>    metrics.incrementOperationCounter();<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>  }<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span><a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>  // should be called within the synchronized block of RegionStateNode.<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span>  // The parameter 'giveUp' means whether we will try to open the region again, if it is true, then<a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>  // we will persist the FAILED_OPEN state into hbase:meta.<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>  void regionFailedOpen(RegionStateNode regionNode, boolean giveUp) throws IOException {<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>    RegionState.State state = regionNode.getState();<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>    ServerName regionLocation = regionNode.getRegionLocation();<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>    if (giveUp) {<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>      regionNode.setState(State.FAILED_OPEN);<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>      regionNode.setRegionLocation(null);<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>      boolean succ = false;<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span>      try {<a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>        regionStateStore.updateRegionLocation(regionNode);<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>        succ = true;<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>      } finally {<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span>        if (!succ) {<a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>          // revert<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>          regionNode.setState(state);<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>          regionNode.setRegionLocation(regionLocation);<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>        }<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>      }<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>    }<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>    if (regionLocation != null) {<a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>      regionStates.removeRegionFromServer(regionLocation, regionNode);<a name="line.1543"></a>
-<span class="sourceLineNo">1544</span>    }<a name="line.1544"></a>
-<span class="sourceLineNo">1545</span>  }<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span><a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>  // should be called within the synchronized block of RegionStateNode<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span>  void regionOpened(RegionStateNode regionNode) throws IOException {<a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>    // TODO: OPENING Updates hbase:meta too... we need to do both here and there?<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>    // That is a lot of hbase:meta writing.<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>    transitStateAndUpdate(regionNode, State.OPEN, STATES_EXPECTED_ON_OPEN);<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>    RegionInfo hri = regionNode.getRegionInfo();<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>    if (isMetaRegion(hri)) {<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>      // Usually we'd set a table ENABLED at this stage but hbase:meta is ALWAYs enabled, it<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>      // can't be disabled -- so skip the RPC (besides... enabled is managed by TableStateManager<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>      // which is backed by hbase:meta... Avoid setting ENABLED to avoid having to update state<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>      // on table that contains state.<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span>      setMetaAssigned(hri, true);<a name="line.1558"></a>
+<span class="sourceLineNo">1494</span>  // Region Status update<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>  // Should only be called in TransitRegionStateProcedure(and related procedures), as the locking<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span>  // and pre-assumptions are very tricky.<a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>  // ============================================================================================<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>  private void transitStateAndUpdate(RegionStateNode regionNode, RegionState.State newState,<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>      RegionState.State... expectedStates) throws IOException {<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>    RegionState.State state = regionNode.getState();<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span>    regionNode.transitionState(newState, expectedStates);<a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>    boolean succ = false;<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span>    try {<a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>      regionStateStore.updateRegionLocation(regionNode);<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>      succ = true;<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span>    } finally {<a name="line.1506"></a>
+<span class="sourceLineNo">1507</span>      if (!succ) {<a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>        // revert<a name="line.1508"></a>
... 9970 lines suppressed ...