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/04 17:42:21 UTC

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

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 2916bf4  Published site at e884a25f8dd19f542ab5ea1ca9809095bd15dd0d.
2916bf4 is described below

commit 2916bf4463e98c10ef3b43db1ea123c3df4abd93
Author: jenkins <bu...@apache.org>
AuthorDate: Sat May 4 17:42:07 2019 +0000

    Published site at e884a25f8dd19f542ab5ea1ca9809095bd15dd0d.
---
 acid-semantics.html                                |    2 +-
 apache_hbase_reference_guide.pdf                   |    4 +-
 book.html                                          |    2 +-
 bulk-loads.html                                    |    2 +-
 checkstyle-aggregate.html                          |   10 +-
 coc.html                                           |    2 +-
 dependencies.html                                  |    2 +-
 dependency-convergence.html                        |    2 +-
 dependency-info.html                               |    2 +-
 dependency-management.html                         |  174 +--
 devapidocs/constant-values.html                    |   37 +-
 devapidocs/index-all.html                          |   50 +-
 .../apache/hadoop/hbase/backup/package-tree.html   |    4 +-
 .../apache/hadoop/hbase/class-use/ServerName.html  |    2 +-
 .../apache/hadoop/hbase/client/package-tree.html   |   22 +-
 .../apache/hadoop/hbase/filter/package-tree.html   |    8 +-
 .../org/apache/hadoop/hbase/http/package-tree.html |    2 +-
 .../apache/hadoop/hbase/io/hfile/package-tree.html |    6 +-
 .../org/apache/hadoop/hbase/ipc/package-tree.html  |    2 +-
 .../hadoop/hbase/mapreduce/package-tree.html       |    2 +-
 .../assignment/RegionRemoteProcedureBase.html      |   74 +-
 ...TransitRegionStateProcedure.TransitionType.html |   10 +-
 .../assignment/TransitRegionStateProcedure.html    |  104 +-
 .../hbase/master/assignment/package-tree.html      |    2 +-
 .../hadoop/hbase/master/balancer/package-tree.html |    2 +-
 .../apache/hadoop/hbase/master/package-tree.html   |    4 +-
 .../hbase/master/procedure/InitMetaProcedure.html  |   52 +-
 .../procedure/ReopenTableRegionsProcedure.html     |   50 +-
 .../hbase/master/procedure/SplitWALProcedure.html  |   78 +-
 .../procedure/SwitchRpcThrottleProcedure.html      |   64 +-
 .../procedure/class-use/ProcedurePrepareLatch.html |    2 +-
 .../hbase/master/procedure/package-tree.html       |    2 +-
 .../replication/AbstractPeerNoLockProcedure.html   |   67 +-
 .../master/replication/AbstractPeerProcedure.html  |    4 +-
 .../hbase/master/replication/AddPeerProcedure.html |    4 +-
 .../master/replication/DisablePeerProcedure.html   |    4 +-
 .../master/replication/EnablePeerProcedure.html    |    4 +-
 .../master/replication/ModifyPeerProcedure.html    |   42 +-
 .../replication/RecoverStandbyProcedure.html       |    4 +-
 .../master/replication/RemovePeerProcedure.html    |    4 +-
 .../SyncReplicationReplayWALProcedure.html         |   34 +-
 .../TransitPeerSyncReplicationStateProcedure.html  |   54 +-
 .../replication/UpdatePeerConfigProcedure.html     |    4 +-
 .../org/apache/hadoop/hbase/package-tree.html      |   14 +-
 .../ProcedureUtil.CompatStateSerializer.html       |   10 +-
 .../procedure2/ProcedureUtil.StateSerializer.html  |   12 +-
 .../hadoop/hbase/procedure2/ProcedureUtil.html     |  135 ++-
 .../class-use/ProcedureSuspendedException.html     |   23 +-
 .../hadoop/hbase/procedure2/package-tree.html      |    2 +-
 .../hbase/quotas/class-use/RpcThrottleStorage.html |    2 +-
 .../apache/hadoop/hbase/quotas/package-tree.html   |    8 +-
 .../hadoop/hbase/regionserver/package-tree.html    |   18 +-
 .../regionserver/querymatcher/package-tree.html    |    4 +-
 .../hbase/regionserver/wal/package-tree.html       |    4 +-
 .../hadoop/hbase/replication/package-tree.html     |    2 +-
 .../replication/regionserver/package-tree.html     |    2 +-
 .../hadoop/hbase/rest/model/package-tree.html      |    2 +-
 .../hadoop/hbase/security/access/package-tree.html |    4 +-
 .../apache/hadoop/hbase/security/package-tree.html |    2 +-
 .../apache/hadoop/hbase/thrift/package-tree.html   |    2 +-
 .../hadoop/hbase/util/class-use/RetryCounter.html  |  106 ++
 .../org/apache/hadoop/hbase/util/package-tree.html |   10 +-
 .../org/apache/hadoop/hbase/util/package-use.html  |   86 +-
 .../org/apache/hadoop/hbase/wal/package-tree.html  |    2 +-
 .../src-html/org/apache/hadoop/hbase/Version.html  |    4 +-
 .../assignment/RegionRemoteProcedureBase.html      |  564 ++++-----
 ...TransitRegionStateProcedure.TransitionType.html | 1026 ++++++++--------
 .../assignment/TransitRegionStateProcedure.html    | 1026 ++++++++--------
 .../hbase/master/procedure/InitMetaProcedure.html  |  260 ++--
 .../procedure/ReopenTableRegionsProcedure.html     |  334 +++---
 .../hbase/master/procedure/SplitWALProcedure.html  |  335 +++---
 .../procedure/SwitchRpcThrottleProcedure.html      |  278 ++---
 .../replication/AbstractPeerNoLockProcedure.html   |  162 +--
 .../master/replication/ModifyPeerProcedure.html    |  480 ++++----
 .../SyncReplicationReplayWALProcedure.html         |  262 ++---
 .../TransitPeerSyncReplicationStateProcedure.html  |  712 ++++++-----
 .../ProcedureUtil.CompatStateSerializer.html       |  619 +++++-----
 .../procedure2/ProcedureUtil.StateSerializer.html  |  619 +++++-----
 .../hadoop/hbase/procedure2/ProcedureUtil.html     |  619 +++++-----
 downloads.html                                     |    2 +-
 export_control.html                                |    2 +-
 index.html                                         |    2 +-
 issue-management.html                              |    2 +-
 licenses.html                                      |    2 +-
 mailing-lists.html                                 |    2 +-
 metrics.html                                       |    2 +-
 old_news.html                                      |    2 +-
 plugin-management.html                             |    2 +-
 plugins.html                                       |    2 +-
 poweredbyhbase.html                                |    2 +-
 project-info.html                                  |    2 +-
 project-reports.html                               |    2 +-
 pseudo-distributed.html                            |    2 +-
 replication.html                                   |    2 +-
 resources.html                                     |    2 +-
 scm.html                                           |    2 +-
 sponsors.html                                      |    2 +-
 summary.html                                       |    2 +-
 supportingprojects.html                            |    2 +-
 team.html                                          |    2 +-
 testdevapidocs/index-all.html                      |    2 -
 .../apache/hadoop/hbase/io/hfile/package-tree.html |    2 +-
 ...tManagerBase.CallQueueTooBigOnceRsExecutor.html |   10 +-
 ...TestAssignmentManagerBase.FaultyRsExecutor.html |    8 +-
 .../TestAssignmentManagerBase.GoodRsExecutor.html  |    8 +-
 ...ManagerBase.HangOnCloseThenRSCrashExecutor.html |   10 +-
 ...ignmentManagerBase.HangThenRSCrashExecutor.html |    8 +-
 ...nmentManagerBase.HangThenRSRestartExecutor.html |    8 +-
 .../TestAssignmentManagerBase.MockRSExecutor.html  |    4 +-
 ...e.MockRSProcedureDispatcher.MockRemoteCall.html |    6 +-
 ...nmentManagerBase.MockRSProcedureDispatcher.html |   10 +-
 .../TestAssignmentManagerBase.NoopRsExecutor.html  |   10 +-
 .../TestAssignmentManagerBase.RandRsExecutor.html  |   12 +-
 ...tManagerBase.ServerNotYetRunningRsExecutor.html |    6 +-
 ...ignmentManagerBase.SocketTimeoutRsExecutor.html |   12 +-
 ...rBase.TimeoutThenCallQueueTooBigRsExecutor.html |   12 +-
 .../assignment/TestAssignmentManagerBase.html      |   98 +-
 ...cedureRetryBackoff.TestModifyPeerProcedure.html |    4 +-
 ...stTransitPeerSyncReplicationStateProcedure.html |    4 +-
 .../org/apache/hadoop/hbase/package-tree.html      |   10 +-
 ...dureUtil.TestProcedureNoDefaultConstructor.html |    4 +-
 .../hadoop/hbase/procedure2/TestProcedureUtil.html |   31 +-
 .../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 +-
 ...tManagerBase.CallQueueTooBigOnceRsExecutor.html | 1244 ++++++++++----------
 ...TestAssignmentManagerBase.FaultyRsExecutor.html | 1244 ++++++++++----------
 .../TestAssignmentManagerBase.GoodRsExecutor.html  | 1244 ++++++++++----------
 ...ManagerBase.HangOnCloseThenRSCrashExecutor.html | 1244 ++++++++++----------
 ...ignmentManagerBase.HangThenRSCrashExecutor.html | 1244 ++++++++++----------
 ...nmentManagerBase.HangThenRSRestartExecutor.html | 1244 ++++++++++----------
 .../TestAssignmentManagerBase.MockRSExecutor.html  | 1244 ++++++++++----------
 ...e.MockRSProcedureDispatcher.MockRemoteCall.html | 1244 ++++++++++----------
 ...nmentManagerBase.MockRSProcedureDispatcher.html | 1244 ++++++++++----------
 .../TestAssignmentManagerBase.NoopRsExecutor.html  | 1244 ++++++++++----------
 .../TestAssignmentManagerBase.RandRsExecutor.html  | 1244 ++++++++++----------
 ...tManagerBase.ServerNotYetRunningRsExecutor.html | 1244 ++++++++++----------
 ...ignmentManagerBase.SocketTimeoutRsExecutor.html | 1244 ++++++++++----------
 ...rBase.TimeoutThenCallQueueTooBigRsExecutor.html | 1244 ++++++++++----------
 .../assignment/TestAssignmentManagerBase.html      | 1244 ++++++++++----------
 ...dureUtil.TestProcedureNoDefaultConstructor.html |  104 +-
 .../hadoop/hbase/procedure2/TestProcedureUtil.html |  104 +-
 143 files changed, 14152 insertions(+), 13809 deletions(-)

diff --git a/acid-semantics.html b/acid-semantics.html
index 8747216..f1d937a 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-03</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-04</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 79d67ce..a03ce4b 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:20190503144601+00'00')
-/CreationDate (D:20190503144601+00'00')
+/ModDate (D:20190504173836+00'00')
+/CreationDate (D:20190504173836+00'00')
 >>
 endobj
 2 0 obj
diff --git a/book.html b/book.html
index b1d9276..26a3a59 100644
--- a/book.html
+++ b/book.html
@@ -41693,7 +41693,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-03 14:29:33 UTC
+Last updated 2019-05-04 17:22:21 UTC
 </div>
 </div>
 </body>
diff --git a/bulk-loads.html b/bulk-loads.html
index 48ea9c3..197baf8 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-03</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-04</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 92033cb..e59acef 100644
--- a/checkstyle-aggregate.html
+++ b/checkstyle-aggregate.html
@@ -8896,12 +8896,12 @@
 <td><a class="externalLink" href="http://checkstyle.sourceforge.net/config_javadoc.html#JavadocTagContinuationIndentation">JavadocTagContinuationIndentation</a>
 <ul>
 <li>offset: <tt>&quot;2&quot;</tt></li></ul></td>
-<td>680</td>
+<td>681</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="b">
 <td></td>
 <td><a class="externalLink" href="http://checkstyle.sourceforge.net/config_javadoc.html#NonEmptyAtclauseDescription">NonEmptyAtclauseDescription</a></td>
-<td>3273</td>
+<td>3272</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="a">
 <td>misc</td>
@@ -17706,7 +17706,7 @@
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
+<td>JavadocTagContinuationIndentation</td>
 <td>Javadoc comment at column 0 has parse error. Details: no viable alternative at input '   *' while parsing JAVADOC_TAG</td>
 <td>117</td></tr>
 <tr class="a">
@@ -60494,7 +60494,7 @@
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 112).</td>
-<td>280</td></tr></table></div>
+<td>278</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.snapshot.EnabledTableSnapshotHandler.java">org/apache/hadoop/hbase/master/snapshot/EnabledTableSnapshotHandler.java</h3>
 <table border="0" class="table table-striped">
@@ -103355,7 +103355,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-03</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-04</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/coc.html b/coc.html
index 823517b..6659169 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-03</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-04</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 984d437..73e6bc4 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-03</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-04</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 7fd1bd8..292b179d 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-03</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-04</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 c3c15b1..71201a9 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-03</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-04</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 446f983..578d384 100644
--- a/dependency-management.html
+++ b/dependency-management.html
@@ -241,504 +241,510 @@
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.html">Apache License 2.0</a></td></tr>
 <tr class="b">
+<td>javax.annotation</td>
+<td><a class="externalLink" href="http://jcp.org/en/jsr/detail?id=250">javax.annotation-api</a></td>
+<td>1.2</td>
+<td>jar</td>
+<td><a class="externalLink" href="https://glassfish.dev.java.net/nonav/public/CDDL+GPL.html">CDDL + GPLv2 with classpath exception</a></td></tr>
+<tr class="a">
 <td>javax.servlet</td>
 <td><a class="externalLink" href="http://servlet-spec.java.net">javax.servlet-api</a></td>
 <td>3.1.0</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://glassfish.dev.java.net/nonav/public/CDDL+GPL.html">CDDL + GPLv2 with classpath exception</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>javax.servlet.jsp</td>
 <td><a class="externalLink" href="http://jsp.java.net">javax.servlet.jsp-api</a></td>
 <td>2.3.1</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://glassfish.dev.java.net/nonav/public/CDDL+GPL.html">CDDL + GPLv2 with classpath exception</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>javax.ws.rs</td>
 <td><a class="externalLink" href="http://jax-rs-spec.java.net">javax.ws.rs-api</a></td>
 <td>2.0.1</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://glassfish.java.net/public/CDDL+GPL_1_1.html">CDDL 1.1</a>, <a class="externalLink" href="http://glassfish.java.net/public/CDDL+GPL_1_1.html">GPL2 w/ CPE</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>javax.xml.bind</td>
 <td><a class="externalLink" href="http://jaxb.java.net/">jaxb-api</a></td>
 <td>2.2.12</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://glassfish.java.net/public/CDDL+GPL_1_1.html">CDDL 1.1</a>, <a class="externalLink" href="https://glassfish.java.net/public/CDDL+GPL_1_1.html">GPL2 w/ CPE</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>jline</td>
 <td><a class="externalLink" href="http://jline.sourceforge.net">jline</a></td>
 <td>0.9.94</td>
 <td>jar</td>
 <td><a href="LICENSE.txt">BSD</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>junit</td>
 <td><a class="externalLink" href="http://junit.org">junit</a></td>
 <td>4.12</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.eclipse.org/legal/epl-v10.html">Eclipse Public License 1.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>log4j</td>
 <td><a class="externalLink" href="http://logging.apache.org/log4j/1.2/">log4j</a></td>
 <td>1.2.17</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">The Apache Software License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>net.spy</td>
 <td><a class="externalLink" href="http://www.couchbase.org/code/couchbase/java">spymemcached</a></td>
 <td>2.12.2</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">The Apache Software License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.avro</td>
 <td><a class="externalLink" href="http://avro.apache.org">avro</a></td>
 <td>1.7.7</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">The Apache Software License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.commons</td>
 <td><a class="externalLink" href="http://commons.apache.org/proper/commons-crypto/">commons-crypto</a></td>
 <td>1.0.0</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.commons</td>
 <td><a class="externalLink" href="http://commons.apache.org/proper/commons-lang/">commons-lang3</a></td>
 <td>3.6</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.commons</td>
 <td><a class="externalLink" href="http://commons.apache.org/proper/commons-math/">commons-math3</a></td>
 <td>3.6.1</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.curator</td>
 <td><a class="externalLink" href="http://curator.apache.org/curator-client">curator-client</a></td>
 <td>4.0.0</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">The Apache Software License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.curator</td>
 <td><a class="externalLink" href="http://curator.apache.org/curator-framework">curator-framework</a></td>
 <td>4.0.0</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">The Apache Software License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.curator</td>
 <td><a class="externalLink" href="http://curator.apache.org/curator-recipes">curator-recipes</a></td>
 <td>4.0.0</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">The Apache Software License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.hadoop</td>
 <td>hadoop-annotations</td>
 <td>2.7.7</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.hadoop</td>
 <td>hadoop-auth</td>
 <td>2.7.7</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.hadoop</td>
 <td>hadoop-client</td>
 <td>2.7.7</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.hadoop</td>
 <td>hadoop-common</td>
 <td>2.7.7</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.hadoop</td>
 <td>hadoop-hdfs</td>
 <td>2.7.7</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.hadoop</td>
 <td>hadoop-mapreduce-client-core</td>
 <td>2.7.7</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.hadoop</td>
 <td>hadoop-mapreduce-client-jobclient</td>
 <td>2.7.7</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.hadoop</td>
 <td>hadoop-minicluster</td>
 <td>2.7.7</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-annotations">hbase-annotations</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>test-jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-configuration/hbase-backup">hbase-backup</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-configuration/hbase-client">hbase-client</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-configuration/hbase-common">hbase-common</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-configuration/hbase-endpoint">hbase-endpoint</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-configuration/hbase-examples">hbase-examples</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-configuration/hbase-external-blockcache">hbase-external-blockcache</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-configuration/hbase-hadoop-compat">hbase-hadoop-compat</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-configuration/hbase-hadoop2-compat">hbase-hadoop2-compat</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-configuration/hbase-http">hbase-http</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-configuration/hbase-mapreduce">hbase-mapreduce</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-configuration/hbase-metrics">hbase-metrics</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-configuration/hbase-metrics-api">hbase-metrics-api</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-configuration/hbase-procedure">hbase-procedure</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-configuration/hbase-procedure">hbase-procedure</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>test-jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-configuration/hbase-protocol">hbase-protocol</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-configuration/hbase-protocol-shaded">hbase-protocol-shaded</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-configuration/hbase-replication">hbase-replication</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-configuration/hbase-resource-bundle">hbase-resource-bundle</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-configuration/hbase-rest">hbase-rest</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-configuration/hbase-rsgroup">hbase-rsgroup</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-configuration/hbase-server">hbase-server</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-configuration/hbase-shaded/hbase-shaded-client">hbase-shaded-client</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-configuration/hbase-shaded/hbase-shaded-client-byo-hadoop">hbase-shaded-client-byo-hadoop</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-configuration/hbase-shaded/hbase-shaded-mapreduce">hbase-shaded-mapreduce</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-configuration/hbase-shell">hbase-shell</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-configuration/hbase-thrift">hbase-thrift</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.hbase</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-build-configuration/hbase-zookeeper">hbase-zookeeper</a></td>
 <td>3.0.0-SNAPSHOT</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.hbase.thirdparty</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-shaded-miscellaneous">hbase-shaded-miscellaneous</a></td>
 <td>2.2.1</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.hbase.thirdparty</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-shaded-netty">hbase-shaded-netty</a></td>
 <td>2.2.1</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.hbase.thirdparty</td>
 <td><a class="externalLink" href="http://hbase.apache.org/hbase-shaded-protobuf">hbase-shaded-protobuf</a></td>
 <td>2.2.1</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.htrace</td>
 <td><a class="externalLink" href="http://incubator.apache.org/projects/htrace.html">htrace-core4</a></td>
 <td>4.2.0-incubating</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.httpcomponents</td>
 <td><a class="externalLink" href="http://hc.apache.org/httpcomponents-client">httpclient</a></td>
 <td>4.5.3</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.httpcomponents</td>
 <td><a class="externalLink" href="http://hc.apache.org/httpcomponents-core-ga">httpcore</a></td>
 <td>4.4.6</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.kerby</td>
 <td><a class="externalLink" href="http://directory.apache.org/kerby/kerby-kerb/kerb-client">kerb-client</a></td>
 <td>1.0.1</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.kerby</td>
 <td><a class="externalLink" href="http://directory.apache.org/kerby/kerby-kerb/kerb-core">kerb-core</a></td>
 <td>1.0.1</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.kerby</td>
 <td><a class="externalLink" href="http://directory.apache.org/kerby/kerby-kerb/kerb-simplekdc">kerb-simplekdc</a></td>
 <td>1.0.1</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.thrift</td>
 <td><a class="externalLink" href="http://thrift.apache.org">libthrift</a></td>
 <td>0.12.0</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">The Apache Software License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.apache.yetus</td>
 <td><a class="externalLink" href="https://yetus.apache.org/audience-annotations">audience-annotations</a></td>
 <td>0.5.0</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.apache.zookeeper</td>
 <td>zookeeper</td>
 <td>3.4.10</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">The Apache Software License, Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.codehaus.jettison</td>
 <td><a class="externalLink" href="https://github.com/jettison-json/jettison">jettison</a></td>
 <td>1.3.8</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.eclipse.jetty</td>
 <td><a class="externalLink" href="http://www.eclipse.org/jetty">jetty-http</a></td>
 <td>9.3.25.v20180904</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0">Apache Software License - Version 2.0</a>, <a class="externalLink" href="http://www.eclipse.org/org/documents/epl-v10.php">Eclipse Public License - Version 1.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.eclipse.jetty</td>
 <td><a class="externalLink" href="http://www.eclipse.org/jetty">jetty-io</a></td>
 <td>9.3.25.v20180904</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0">Apache Software License - Version 2.0</a>, <a class="externalLink" href="http://www.eclipse.org/org/documents/epl-v10.php">Eclipse Public License - Version 1.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.eclipse.jetty</td>
 <td><a class="externalLink" href="http://www.eclipse.org/jetty">jetty-jmx</a></td>
 <td>9.3.25.v20180904</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0">Apache Software License - Version 2.0</a>, <a class="externalLink" href="http://www.eclipse.org/org/documents/epl-v10.php">Eclipse Public License - Version 1.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.eclipse.jetty</td>
 <td><a class="externalLink" href="http://www.eclipse.org/jetty">jetty-security</a></td>
 <td>9.3.25.v20180904</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0">Apache Software License - Version 2.0</a>, <a class="externalLink" href="http://www.eclipse.org/org/documents/epl-v10.php">Eclipse Public License - Version 1.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.eclipse.jetty</td>
 <td><a class="externalLink" href="http://www.eclipse.org/jetty">jetty-server</a></td>
 <td>9.3.25.v20180904</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0">Apache Software License - Version 2.0</a>, <a class="externalLink" href="http://www.eclipse.org/org/documents/epl-v10.php">Eclipse Public License - Version 1.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.eclipse.jetty</td>
 <td><a class="externalLink" href="http://www.eclipse.org/jetty">jetty-servlet</a></td>
 <td>9.3.25.v20180904</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0">Apache Software License - Version 2.0</a>, <a class="externalLink" href="http://www.eclipse.org/org/documents/epl-v10.php">Eclipse Public License - Version 1.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.eclipse.jetty</td>
 <td><a class="externalLink" href="http://www.eclipse.org/jetty">jetty-util</a></td>
 <td>9.3.25.v20180904</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0">Apache Software License - Version 2.0</a>, <a class="externalLink" href="http://www.eclipse.org/org/documents/epl-v10.php">Eclipse Public License - Version 1.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.eclipse.jetty</td>
 <td><a class="externalLink" href="http://www.eclipse.org/jetty">jetty-util-ajax</a></td>
 <td>9.3.25.v20180904</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0">Apache Software License - Version 2.0</a>, <a class="externalLink" href="http://www.eclipse.org/org/documents/epl-v10.php">Eclipse Public License - Version 1.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.eclipse.jetty</td>
 <td><a class="externalLink" href="http://www.eclipse.org/jetty">jetty-webapp</a></td>
 <td>9.3.25.v20180904</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0">Apache Software License - Version 2.0</a>, <a class="externalLink" href="http://www.eclipse.org/org/documents/epl-v10.php">Eclipse Public License - Version 1.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.glassfish</td>
 <td><a class="externalLink" href="http://uel.java.net">javax.el</a></td>
 <td>3.0.1-b08</td>
 <td>jar</td>
 <td><a class="externalLink" href="https://glassfish.dev.java.net/nonav/public/CDDL+GPL.html">CDDL + GPLv2 with classpath exception</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.glassfish.jersey.containers</td>
 <td><a class="externalLink" href="https://jersey.java.net/project/jersey-container-servlet-core/">jersey-container-servlet-core</a></td>
 <td>2.25.1</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://glassfish.java.net/public/CDDL+GPL_1_1.html">CDDL+GPL License</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.glassfish.jersey.core</td>
 <td><a class="externalLink" href="https://jersey.java.net/jersey-client/">jersey-client</a></td>
 <td>2.25.1</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://glassfish.java.net/public/CDDL+GPL_1_1.html">CDDL+GPL License</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.glassfish.jersey.core</td>
 <td><a class="externalLink" href="https://jersey.java.net/jersey-server/">jersey-server</a></td>
 <td>2.25.1</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://glassfish.java.net/public/CDDL+GPL_1_1.html">CDDL+GPL License</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.glassfish.web</td>
 <td><a class="externalLink" href="http://jsp.java.net">javax.servlet.jsp</a></td>
 <td>2.3.2</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://glassfish.dev.java.net/nonav/public/CDDL+GPL.html">CDDL + GPLv2 with classpath exception</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.jamon</td>
 <td><a class="externalLink" href="http://www.jamon.org/jamon-java-parent/jamon-runtime/">jamon-runtime</a></td>
 <td>2.4.1</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.mozilla.org/MPL/2.0">Mozilla Public License Version 2.0</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.jruby</td>
 <td><a class="externalLink" href="https://github.com/jruby/jruby/jruby-artifacts/jruby-complete">jruby-complete</a></td>
 <td>9.1.17.0</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.gnu.org/licenses/gpl-2.0-standalone.html">GPL-2.0</a>, <a class="externalLink" href="http://www.gnu.org/licenses/lgpl-2.1-standalone.html">LGPL-2.1</a>, <a class="externalLink" href="http://www.eclipse.org/legal/epl-v20.html">EPL-2.0</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.jruby.jcodings</td>
 <td><a class="externalLink" href="http://nexus.sonatype.org/oss-repository-hosting.html/jcodings">jcodings</a></td>
 <td>1.0.18</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.opensource.org/licenses/mit-license.php">MIT License</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.jruby.joni</td>
 <td><a class="externalLink" href="http://nexus.sonatype.org/oss-repository-hosting.html/joni">joni</a></td>
 <td>2.1.11</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.opensource.org/licenses/mit-license.php">MIT License</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td>org.slf4j</td>
 <td><a class="externalLink" href="http://www.slf4j.org">slf4j-api</a></td>
 <td>1.7.25</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.opensource.org/licenses/mit-license.php">MIT License</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td>org.slf4j</td>
 <td><a class="externalLink" href="http://www.slf4j.org">slf4j-log4j12</a></td>
 <td>1.7.25</td>
@@ -888,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-03</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-05-04</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 0d8d065..a244c2c 100644
--- a/devapidocs/constant-values.html
+++ b/devapidocs/constant-values.html
@@ -3927,7 +3927,7 @@
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/Version.html#date">date</a></code></td>
-<td class="colLast"><code>"Fri May  3 14:34:30 UTC 2019"</code></td>
+<td class="colLast"><code>"Sat May  4 17:27:11 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>"fe48d5c5d2de4fe6b4e89d6da1c8038f"</code></td>
+<td class="colLast"><code>"4b63fe9b04e1c2cf4788ef56a264dc16"</code></td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.url">
@@ -17216,6 +17216,39 @@
 </li>
 <li class="blockList">
 <table class="constantsSummary" border="0" cellpadding="3" cellspacing="0" summary="Constant Field Values table, listing constant fields, and values">
+<caption><span>org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/ProcedureUtil.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureUtil</a></span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th scope="col">Constant Field</th>
+<th class="colLast" scope="col">Value</th>
+</tr>
+<tbody>
+<tr class="altColor">
+<td class="colFirst"><a name="org.apache.hadoop.hbase.procedure2.ProcedureUtil.DEFAULT_PROCEDURE_RETRY_SLEEP_INTERVAL_MS">
+<!--   -->
+</a><code>public&nbsp;static&nbsp;final&nbsp;long</code></td>
+<td><code><a href="org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#DEFAULT_PROCEDURE_RETRY_SLEEP_INTERVAL_MS">DEFAULT_PROCEDURE_RETRY_SLEEP_INTERVAL_MS</a></code></td>
+<td class="colLast"><code>1000L</code></td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><a name="org.apache.hadoop.hbase.procedure2.ProcedureUtil.PROCEDURE_RETRY_MAX_SLEEP_TIME_MS">
+<!--   -->
+</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/procedure2/ProcedureUtil.html#PROCEDURE_RETRY_MAX_SLEEP_TIME_MS">PROCEDURE_RETRY_MAX_SLEEP_TIME_MS</a></code></td>
+<td class="colLast"><code>"hbase.procedure.retry.max.sleep.time.ms"</code></td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><a name="org.apache.hadoop.hbase.procedure2.ProcedureUtil.PROCEDURE_RETRY_SLEEP_INTERVAL_MS">
+<!--   -->
+</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/procedure2/ProcedureUtil.html#PROCEDURE_RETRY_SLEEP_INTERVAL_MS">PROCEDURE_RETRY_SLEEP_INTERVAL_MS</a></code></td>
+<td class="colLast"><code>"hbase.procedure.retry.sleep.interval.ms"</code></td>
+</tr>
+</tbody>
+</table>
+</li>
+<li class="blockList">
+<table class="constantsSummary" border="0" cellpadding="3" cellspacing="0" summary="Constant Field Values table, listing constant fields, and values">
 <caption><span>org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/RemoteProcedureDispatcher.html" title="class in org.apache.hadoop.hbase.procedure2">RemoteProcedureDispatcher</a>&lt;<a href="org/apache/hadoop/hbase/procedure2/RemoteProcedureDispatcher.html" title="type parameter in RemoteProcedureDispatcher">TEnv</a>,<a href="org/apache/hadoop/hbase/procedure2/RemoteProcedureDispatcher.html" title="type parameter in RemoteProcedureDispatcher">TRemote</a> exte [...]
 <tr>
 <th class="colFirst" scope="col">Modifier and Type</th>
diff --git a/devapidocs/index-all.html b/devapidocs/index-all.html
index c3a913a..fd2c9a6 100644
--- a/devapidocs/index-all.html
+++ b/devapidocs/index-all.html
@@ -4477,26 +4477,12 @@
 <dd>
 <div class="block">Check if we should attain safe point.</div>
 </dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#attempt">attempt</a></span> - Variable 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.master.assignment">RegionRemoteProcedureBase</a></dt>
-<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/RegionTransitionProcedure.html#attempt">attempt</a></span> - Variable in class org.apache.hadoop.hbase.master.assignment.<a href="org/apache/hadoop/hbase/master/assignment/RegionTransitionProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionTransitionProcedure</a></dt>
 <dd>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span></div>
 &nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#attempt">attempt</a></span> - Variable 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.master.assignment">TransitRegionStateProcedure</a></dt>
-<dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#attempt">attempt</a></span> - Variable in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">ReopenTableRegionsProcedure</a></dt>
-<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/security/HBaseSaslRpcServer.html#attemptingUser">attemptingUser</a></span> - Variable in class org.apache.hadoop.hbase.security.<a href="org/apache/hadoop/hbase/security/HBaseSaslRpcServer.html" title="class in org.apache.hadoop.hbase.security">HBaseSaslRpcServer</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/InitMetaProcedure.html#attempts">attempts</a></span> - Variable in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/InitMetaProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">InitMetaProcedure</a></dt>
-<dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html#attempts">attempts</a></span> - Variable in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">SplitWALProcedure</a></dt>
-<dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html#attempts">attempts</a></span> - Variable in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">SwitchRpcThrottleProcedure</a></dt>
-<dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#attempts">attempts</a></span> - Variable in class org.apache.hadoop.hbase.master.replication.<a href="org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html" title="class in org.apache.hadoop.hbase.master.replication">AbstractPeerNoLockProcedure</a></dt>
-<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/RetryCounter.html#attempts">attempts</a></span> - Variable in class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/RetryCounter.html" title="class in org.apache.hadoop.hbase.util">RetryCounter</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/coordination/ZkSplitLogWorkerCoordination.html#attemptToOwnTask-boolean-org.apache.hadoop.hbase.zookeeper.ZKWatcher-org.apache.hadoop.hbase.ServerName-java.lang.String-int-">attemptToOwnTask(boolean, ZKWatcher, ServerName, String, int)</a></span> - Static method in class org.apache.hadoop.hbase.coordination.<a href="org/apache/hadoop/hbase/coordination/ZkSplitLogWorkerCoordination.html" title="class in org.apache.hadoop.hb [...]
@@ -21228,6 +21214,10 @@
 <dd>
 <div class="block">Create restore request.</div>
 </dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#createRetryCounter-org.apache.hadoop.conf.Configuration-">createRetryCounter(Configuration)</a></span> - Static method in class org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/ProcedureUtil.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureUtil</a></dt>
+<dd>
+<div class="block">Get a retry counter for getting the backoff time.</div>
+</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#createRoundRobinAssignProcedures-java.util.List-java.util.List-">createRoundRobinAssignProcedures(List&lt;RegionInfo&gt;, List&lt;ServerName&gt;)</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>
 <div class="block">Create round-robin assigns.</div>
@@ -24164,6 +24154,10 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/HRegionServer.CompactionChecker.html#DEFAULT_PRIORITY">DEFAULT_PRIORITY</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/HRegionServer.CompactionChecker.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer.CompactionChecker</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#DEFAULT_PROCEDURE_RETRY_MAX_SLEEP_TIME_MS">DEFAULT_PROCEDURE_RETRY_MAX_SLEEP_TIME_MS</a></span> - Static variable in class org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/ProcedureUtil.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureUtil</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#DEFAULT_PROCEDURE_RETRY_SLEEP_INTERVAL_MS">DEFAULT_PROCEDURE_RETRY_SLEEP_INTERVAL_MS</a></span> - Static variable in class org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/ProcedureUtil.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureUtil</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/AbstractFSWALProvider.html#DEFAULT_PROVIDER_ID">DEFAULT_PROVIDER_ID</a></span> - Static variable in class org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/AbstractFSWALProvider.html" title="class in org.apache.hadoop.hbase.wal">AbstractFSWALProvider</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/metrics/impl/FastLongHistogram.html#DEFAULT_QUANTILES">DEFAULT_QUANTILES</a></span> - Static variable in class org.apache.hadoop.hbase.metrics.impl.<a href="org/apache/hadoop/hbase/metrics/impl/FastLongHistogram.html" title="class in org.apache.hadoop.hbase.metrics.impl">FastLongHistogram</a></dt>
@@ -35972,10 +35966,6 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/RetryCounter.html#getBackoffTimeAndIncrementAttempts--">getBackoffTimeAndIncrementAttempts()</a></span> - Method in class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/RetryCounter.html" title="class in org.apache.hadoop.hbase.util">RetryCounter</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#getBackoffTimeMs-int-">getBackoffTimeMs(int)</a></span> - Static method in class org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/ProcedureUtil.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureUtil</a></dt>
-<dd>
-<div class="block">Get an exponential backoff time, in milliseconds.</div>
-</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/FileLink.html#getBackReferenceFileName-org.apache.hadoop.fs.Path-">getBackReferenceFileName(Path)</a></span> - Static method in class org.apache.hadoop.hbase.io.<a href="org/apache/hadoop/hbase/io/FileLink.html" title="class in org.apache.hadoop.hbase.io">FileLink</a></dt>
 <dd>
 <div class="block">Get the referenced file name from the reference link directory path.</div>
@@ -88249,6 +88239,10 @@ service.</div>
 <dd>&nbsp;</dd>
 <dt><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> - Enum in <a href="org/apache/hadoop/hbase/procedure2/package-summary.html">org.apache.hadoop.hbase.procedure2</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#PROCEDURE_RETRY_MAX_SLEEP_TIME_MS">PROCEDURE_RETRY_MAX_SLEEP_TIME_MS</a></span> - Static variable in class org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/ProcedureUtil.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureUtil</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#PROCEDURE_RETRY_SLEEP_INTERVAL_MS">PROCEDURE_RETRY_SLEEP_INTERVAL_MS</a></span> - Static variable in class org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/ProcedureUtil.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureUtil</a></dt>
+<dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/procedure2/ProcedureAbortedException.html" title="class in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">ProcedureAbortedException</span></a> - Exception in <a href="org/apache/hadoop/hbase/procedure2/package-summary.html">org.apache.hadoop.hbase.procedure2</a></dt>
 <dd>
 <div class="block">Thrown when a procedure is aborted</div>
@@ -97273,6 +97267,8 @@ service.</div>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/regionserver/WALEntryStream.html#resetReader--">resetReader()</a></span> - Method in class org.apache.hadoop.hbase.replication.regionserver.<a href="org/apache/hadoop/hbase/replication/regionserver/WALEntryStream.html" title="class in org.apache.hadoop.hbase.replication.regionserver">WALEntryStream</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#resetRetry--">resetRetry()</a></span> - Method in class org.apache.hadoop.hbase.master.replication.<a href="org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html" title="class in org.apache.hadoop.hbase.master.replication">AbstractPeerNoLockProcedure</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/rsgroup/RSGroupInfoManagerImpl.html#resetRSGroupAndTableMaps-java.util.Map-java.util.Map-">resetRSGroupAndTableMaps(Map&lt;String, RSGroupInfo&gt;, Map&lt;TableName, String&gt;)</a></span> - Method in class org.apache.hadoop.hbase.rsgroup.<a href="org/apache/hadoop/hbase/rsgroup/RSGroupInfoManagerImpl.html" title="class in org.apache.hadoop.hbase.rsgroup">RSGroupInfoManagerImpl</a></dt>
 <dd>
 <div class="block">Make changes visible.</div>
@@ -98154,6 +98150,20 @@ service.</div>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/RetryCounterFactory.html#retryConfig">retryConfig</a></span> - Variable in class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/RetryCounterFactory.html" title="class in org.apache.hadoop.hbase.util">RetryCounterFactory</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#retryCounter">retryCounter</a></span> - Variable 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.master.assignment">RegionRemoteProcedureBase</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#retryCounter">retryCounter</a></span> - Variable 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.master.assignment">TransitRegionStateProcedure</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/InitMetaProcedure.html#retryCounter">retryCounter</a></span> - Variable in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/InitMetaProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">InitMetaProcedure</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#retryCounter">retryCounter</a></span> - Variable in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">ReopenTableRegionsProcedure</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html#retryCounter">retryCounter</a></span> - Variable in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">SplitWALProcedure</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html#retryCounter">retryCounter</a></span> - Variable in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">SwitchRpcThrottleProcedure</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#retryCounter">retryCounter</a></span> - Variable in class org.apache.hadoop.hbase.master.replication.<a href="org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html" title="class in org.apache.hadoop.hbase.master.replication">AbstractPeerNoLockProcedure</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/handler/AssignRegionHandler.html#retryCounter">retryCounter</a></span> - Variable in class org.apache.hadoop.hbase.regionserver.handler.<a href="org/apache/hadoop/hbase/regionserver/handler/AssignRegionHandler.html" title="class in org.apache.hadoop.hbase.regionserver.handler">AssignRegionHandler</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/handler/UnassignRegionHandler.html#retryCounter">retryCounter</a></span> - Variable in class org.apache.hadoop.hbase.regionserver.handler.<a href="org/apache/hadoop/hbase/regionserver/handler/UnassignRegionHandler.html" title="class in org.apache.hadoop.hbase.regionserver.handler">UnassignRegionHandler</a></dt>
@@ -114417,9 +114427,7 @@ service.</div>
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/AsyncScanSingleRegionRpcRetryingCaller.ScanControllerImpl.html#suspend--">suspend()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/AsyncScanSingleRegionRpcRetryingCaller.ScanControllerImpl.html" title="class in org.apache.hadoop.hbase.client">AsyncScanSingleRegionRpcRetryingCaller.ScanControllerImpl</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html#suspend-long-">suspend(long)</a></span> - Method in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">SplitWALProcedure</a></dt>
-<dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#suspend-long-">suspend(long)</a></span> - Method in class org.apache.hadoop.hbase.master.replication.<a href="org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html" title="class in org.apache.hadoop.hbase.master.replication">AbstractPeerNoLockProcedure</a></dt>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#suspend-org.apache.hadoop.conf.Configuration-java.util.function.LongConsumer-">suspend(Configuration, LongConsumer)</a></span> - Method in class org.apache.hadoop.hbase.master.replication.<a href="org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html" title="class in org.apache.hadoop.hbase.master.replication">AbstractPeerNoLockProcedure</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALManager.UsedReplayWorkersForPeer.html#suspend-org.apache.hadoop.hbase.procedure2.Procedure-">suspend(Procedure&lt;?&gt;)</a></span> - Method in class org.apache.hadoop.hbase.master.replication.<a href="org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALManager.UsedReplayWorkersForPeer.html" title="class in org.apache.hadoop.hbase.master.replication">SyncReplication [...]
 <dd>&nbsp;</dd>
diff --git a/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html b/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
index f629828..7c96111 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/BackupRestoreConstants.BackupCommand.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupRestoreConstants.BackupCommand</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupInfo.BackupState.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupInfo.BackupState</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupType.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupRestoreConstants.BackupCommand.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupRestoreConstants.BackupCommand</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupInfo.BackupPhase.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupInfo.BackupPhase</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/class-use/ServerName.html b/devapidocs/org/apache/hadoop/hbase/class-use/ServerName.html
index 9da7d9c..3e5035d 100644
--- a/devapidocs/org/apache/hadoop/hbase/class-use/ServerName.html
+++ b/devapidocs/org/apache/hadoop/hbase/class-use/ServerName.html
@@ -5329,7 +5329,7 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 </td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><code>(package private) <a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a></code></td>
+<td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a></code></td>
 <td class="colLast"><span class="typeNameLabel">SwitchRpcThrottleProcedure.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html#serverName">serverName</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
diff --git a/devapidocs/org/apache/hadoop/hbase/client/package-tree.html b/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
index 8ca4be1..ec4822e 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
@@ -549,23 +549,23 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/TableState.State.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">TableState.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcessTask.SubmittedRows.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncProcessTask.SubmittedRows</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/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/MobCompactPartitionPolicy.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">MobCompactPartitionPolicy</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/MasterSwitchType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">MasterSwitchType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/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/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/AbstractResponse.ResponseType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AbstractResponse.ResponseType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Consistency.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Consistency</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/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/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/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/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/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/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/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/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/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/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/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/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/Durability.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Durability</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/MobCompactPartitionPolicy.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">MobCompactPartitionPolicy</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/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/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/AbstractResponse.ResponseType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AbstractResponse.ResponseType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/SnapshotType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">SnapshotType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/RegionLocateType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">RegionLocateType</span></a></li>
 </ul>
 </li>
diff --git a/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html b/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
index 1ba06e3..3dfc629 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/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/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/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/FilterWrapper.FilterRowRetCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FilterWrapper.FilterRowRetCode</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FilterList.Operator.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FilterList.Operator</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.SatisfiesCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FuzzyRowFilter.SatisfiesCode</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.Order.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FuzzyRowFilter.Order</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/RegexStringComparator.EngineType.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">RegexStringComparator.EngineType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/Filter.ReturnCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">Filter.ReturnCode</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 611f4f2..26468e3 100644
--- a/devapidocs/org/apache/hadoop/hbase/http/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/http/package-tree.html
@@ -139,8 +139,8 @@
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
 <li type="circle">org.apache.hadoop.hbase.http.<a href="../../../../../org/apache/hadoop/hbase/http/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>
 <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/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 f8f04c9..c911280 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
@@ -284,11 +284,11 @@
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.BlockCategory.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockType.BlockCategory</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.MemoryType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">Cacheable.MemoryType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.Writer.State.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">HFileBlock.Writer.State</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/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/BlockCacheFactory.ExternalBlockCaches.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockCacheFactory.ExternalBlockCaches</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.MemoryType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">Cacheable.MemoryType</span></a></li>
+<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>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html b/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
index 148fecd..cb4ea86 100644
--- a/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
@@ -354,8 +354,8 @@
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
 <li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/BufferCallBeforeInitHandler.BufferCallAction.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">BufferCallBeforeInitHandler.BufferCallAction</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/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/MetricsHBaseServerSourceFactoryImpl.SourceStorage.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">MetricsHBaseServerSourceFactoryImpl.SourceStorage</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 54e2658..92596b5 100644
--- a/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
@@ -299,8 +299,8 @@
 <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/CellCounter.CellCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">CellCounter.CellCounterMapper.Counters</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/SyncTable.SyncMapper.Counter.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">SyncTable.SyncMapper.Counter</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableSplit.Version.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">TableSplit.Version</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/SyncTable.SyncMapper.Counter.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">SyncTable.SyncMapper.Counter</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html b/devapidocs/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html
index 3b32ee3..3d9e508 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html
@@ -123,7 +123,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.Private
-public abstract class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.55">RegionRemoteProcedureBase</a>
+public abstract class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.56">RegionRemoteProcedureBase</a>
 extends <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;
 implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.html" title="interface in org.apache.hadoop.hbase.master.procedure">TableProcedureInterface</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/RemoteProcedureDispatcher.RemoteProcedure.html" title="interface in org.apache.hadoop.hbase.procedure2">RemoteProcedureDispatcher.RemoteProcedure</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterPro [...]
 <div class="block">The base class for the remote procedures used to open/close a region.
@@ -172,17 +172,17 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/T
 <th class="colLast" scope="col">Field and Description</th>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><code>private int</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#attempt">attempt</a></span></code>&nbsp;</td>
-</tr>
-<tr class="rowColor">
 <td class="colFirst"><code>private static org.slf4j.Logger</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#LOG">LOG</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>protected <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#region">region</a></span></code>&nbsp;</td>
 </tr>
+<tr class="altColor">
+<td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/util/RetryCounter.html" title="class in org.apache.hadoop.hbase.util">RetryCounter</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#retryCounter">retryCounter</a></span></code>&nbsp;</td>
+</tr>
 <tr class="rowColor">
 <td class="colFirst"><code>private long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#seqId">seqId</a></span></code>&nbsp;</td>
@@ -429,7 +429,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/T
 <ul class="blockList">
 <li class="blockList">
 <h4>LOG</h4>
-<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.58">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.59">LOG</a></pre>
 </li>
 </ul>
 <a name="region">
@@ -438,7 +438,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/T
 <ul class="blockList">
 <li class="blockList">
 <h4>region</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.60">region</a></pre>
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.61">region</a></pre>
 </li>
 </ul>
 <a name="targetServer">
@@ -447,7 +447,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/T
 <ul class="blockList">
 <li class="blockList">
 <h4>targetServer</h4>
-<pre>protected&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/RegionRemoteProcedureBase.html#line.62">targetServer</a></pre>
+<pre>protected&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/RegionRemoteProcedureBase.html#line.63">targetServer</a></pre>
 </li>
 </ul>
 <a name="state">
@@ -456,7 +456,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/T
 <ul class="blockList">
 <li class="blockList">
 <h4>state</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionRemoteProcedureBaseState <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.64">state</a></pre>
+<pre>private&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionRemoteProcedureBaseState <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.65">state</a></pre>
 </li>
 </ul>
 <a name="transitionCode">
@@ -465,7 +465,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/T
 <ul class="blockList">
 <li class="blockList">
 <h4>transitionCode</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.67">transitionCode</a></pre>
+<pre>private&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.68">transitionCode</a></pre>
 </li>
 </ul>
 <a name="seqId">
@@ -474,16 +474,16 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/T
 <ul class="blockList">
 <li class="blockList">
 <h4>seqId</h4>
-<pre>private&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.69">seqId</a></pre>
+<pre>private&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.70">seqId</a></pre>
 </li>
 </ul>
-<a name="attempt">
+<a name="retryCounter">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
-<h4>attempt</h4>
-<pre>private&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.71">attempt</a></pre>
+<h4>retryCounter</h4>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/util/RetryCounter.html" title="class in org.apache.hadoop.hbase.util">RetryCounter</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.72">retryCounter</a></pre>
 </li>
 </ul>
 </li>
@@ -500,7 +500,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/T
 <ul class="blockList">
 <li class="blockList">
 <h4>RegionRemoteProcedureBase</h4>
-<pre>protected&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.73">RegionRemoteProcedureBase</a>()</pre>
+<pre>protected&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.74">RegionRemoteProcedureBase</a>()</pre>
 </li>
 </ul>
 <a name="RegionRemoteProcedureBase-org.apache.hadoop.hbase.master.assignment.TransitRegionStateProcedure-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.ServerName-">
@@ -509,7 +509,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/T
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RegionRemoteProcedureBase</h4>
-<pre>protected&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.76">RegionRemoteProcedureBase</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>protected&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.77">RegionRemoteProcedureBase</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>
@@ -528,7 +528,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/T
 <ul class="blockList">
 <li class="blockList">
 <h4>remoteOperationCompleted</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.84">remoteOperationCompleted</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>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.85">remoteOperationCompleted</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 interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/RemoteProcedureDispatcher.RemoteProcedure.html#remoteOperationCompleted-TEnv-">RemoteProcedureDispatcher.RemoteProcedure</a></code></span></div>
 <div class="block">Called when RS tells the remote procedure is succeeded through the
  <code>reportProcedureDone</code> method.</div>
@@ -544,7 +544,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/T
 <ul class="blockList">
 <li class="blockList">
 <h4>remoteOperationFailed</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.90">remoteOperationFailed</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>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.91">remoteOperationFailed</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/procedure2/RemoteProcedureException.html" title="class in org.apache.hadoop.hbase.procedure2">RemoteProcedureException</a>&nbsp;error)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/RemoteProcedureDispatcher.RemoteProcedure.html#remoteOperationFailed-TEnv-org.apache.hadoop.hbase.procedure2.RemoteProcedureException-">RemoteProcedureDispatcher.RemoteProcedure</a></code></span></div>
 <div class="block">Called when RS tells the remote procedure is failed through the <code>reportProcedureDone</code>
@@ -561,7 +561,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/T
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionNode</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.95">getRegionNode</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProced [...]
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.96">getRegionNode</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProced [...]
 </li>
 </ul>
 <a name="remoteCallFailed-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.ServerName-java.io.IOException-">
@@ -570,7 +570,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/T
 <ul class="blockList">
 <li class="blockList">
 <h4>remoteCallFailed</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.100">remoteCallFailed</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>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.101">remoteCallFailed</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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;remote,
                              <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>&nbsp;exception)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/RemoteProcedureDispatcher.RemoteProcedure.html#remoteCallFailed-TEnv-TRemote-java.io.IOException-">RemoteProcedureDispatcher.RemoteProcedure</a></code></span></div>
@@ -587,7 +587,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/T
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableName</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.130">getTableName</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.131">getTableName</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.html#getTableName--">getTableName</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.html" title="interface in org.apache.hadoop.hbase.master.procedure">TableProcedureInterface</a></code></dd>
@@ -602,7 +602,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/T
 <ul class="blockList">
 <li class="blockList">
 <h4>waitInitialized</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.135">waitInitialized</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;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.136">waitInitialized</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#waitInitialized-TEnvironment-">Procedure</a></code></span></div>
 <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
  call us to determine whether we need to wait for initialization, second, it will call
@@ -627,7 +627,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/T
 <ul class="blockList">
 <li class="blockList">
 <h4>rollback</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.146">rollback</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/RegionRemoteProcedureBase.html#line.147">rollback</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)
                  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>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#rollback-TEnvironment-">Procedure</a></code></span></div>
@@ -654,7 +654,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/T
 <ul class="blockList">
 <li class="blockList">
 <h4>abort</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.151">abort</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;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.152">abort</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#abort-TEnvironment-">Procedure</a></code></span></div>
 <div class="block">The abort() call is asynchronous and each procedure must decide how to deal
  with it, if they want to be abortable. The simplest implementation
@@ -677,7 +677,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/T
 <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.156">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>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>
@@ -693,7 +693,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.161">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.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,
                             <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 +703,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.167">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.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,
                       <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,7 +721,7 @@ 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.200">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.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,
                    <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>
@@ -732,7 +732,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/T
 <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.217">getParent</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.pr [...]
+<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 [...]
 </li>
 </ul>
 <a name="unattach-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">
@@ -741,7 +741,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/T
 <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.222">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>
+<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>
 </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-">
@@ -750,7 +750,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/T
 <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.227">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,
+<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)
@@ -767,7 +767,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.231">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.232">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 +798,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.283">storeInDispatchedQueue</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#line.287">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 +815,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.288">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.292">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 +837,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.300">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.304">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 +858,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.313">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.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>
 <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 6d7a978..5ef16cb 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.526">TransitRegionStateProcedure.TransitionType</a>
+<pre>public static enum <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.530">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.527">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.531">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.527">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.531">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.527">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.531">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.527">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.531">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 6c7e921..8feb5b3 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html
@@ -134,7 +134,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.Private
-public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.102">TransitRegionStateProcedure</a>
+public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.103">TransitRegionStateProcedure</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/AbstractStateMachineRegionProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">AbstractStateMachineRegionProcedure</a>&lt;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionState&gt;</pre>
 <div class="block">The procedure to deal with the state transition of a region. A region with a TRSP in place is
  called RIT, i.e, RegionInTransition.
@@ -246,29 +246,29 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#assignCandidate">assignCandidate</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><code>private int</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#attempt">attempt</a></span></code>&nbsp;</td>
-</tr>
-<tr 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/TransitRegionStateProcedure.html#forceNewPlan">forceNewPlan</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionState</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#initialState">initialState</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionState</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#lastState">lastState</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private static org.slf4j.Logger</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#LOG">LOG</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionRemoteProcedureBase</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#remoteProc">remoteProc</a></span></code>&nbsp;</td>
 </tr>
+<tr class="altColor">
+<td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/util/RetryCounter.html" title="class in org.apache.hadoop.hbase.util">RetryCounter</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#retryCounter">retryCounter</a></span></code>&nbsp;</td>
+</tr>
 <tr class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.TransitionType.html" title="enum in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure.TransitionType</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#type">type</a></span></code>&nbsp;</td>
@@ -569,7 +569,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>LOG</h4>
-<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.105">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.106">LOG</a></pre>
 </li>
 </ul>
 <a name="type">
@@ -578,7 +578,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>type</h4>
-<pre>private&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.html#line.107">type</a></pre>
+<pre>private&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.html#line.108">type</a></pre>
 </li>
 </ul>
 <a name="initialState">
@@ -587,7 +587,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>initialState</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionState <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.109">initialState</a></pre>
+<pre>private&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionState <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.110">initialState</a></pre>
 </li>
 </ul>
 <a name="lastState">
@@ -596,7 +596,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>lastState</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionState <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.111">lastState</a></pre>
+<pre>private&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionState <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.112">lastState</a></pre>
 </li>
 </ul>
 <a name="assignCandidate">
@@ -605,7 +605,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <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/TransitRegionStateProcedure.html#line.114">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/TransitRegionStateProcedure.html#line.115">assignCandidate</a></pre>
 </li>
 </ul>
 <a name="forceNewPlan">
@@ -614,16 +614,16 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>forceNewPlan</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.116">forceNewPlan</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.117">forceNewPlan</a></pre>
 </li>
 </ul>
-<a name="attempt">
+<a name="retryCounter">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>attempt</h4>
-<pre>private&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.118">attempt</a></pre>
+<h4>retryCounter</h4>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/util/RetryCounter.html" title="class in org.apache.hadoop.hbase.util">RetryCounter</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.119">retryCounter</a></pre>
 </li>
 </ul>
 <a name="remoteProc">
@@ -632,7 +632,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockListLast">
 <li class="blockList">
 <h4>remoteProc</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionRemoteProcedureBase</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.120">remoteProc</a></pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionRemoteProcedureBase</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.121">remoteProc</a></pre>
 </li>
 </ul>
 </li>
@@ -649,7 +649,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>TransitRegionStateProcedure</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.122">TransitRegionStateProcedure</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.123">TransitRegionStateProcedure</a>()</pre>
 </li>
 </ul>
 <a name="TransitRegionStateProcedure-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.ServerName-boolean-org.apache.hadoop.hbase.master.assignment.TransitRegionStateProcedure.TransitionType-">
@@ -658,7 +658,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TransitRegionStateProcedure</h4>
-<pre>protected&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.146">TransitRegionStateProcedure</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;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.147">TransitRegionStateProcedure</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/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;hri,
                                       <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;assignCandidate,
                                       boolean&nbsp;forceNewPlan,
@@ -679,7 +679,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>setInitalAndLastState</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.125">setInitalAndLastState</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.126">setInitalAndLastState</a>()</pre>
 </li>
 </ul>
 <a name="getTableOperationType--">
@@ -688,7 +688,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <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/TransitRegionStateProcedure.html#line.156">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/TransitRegionStateProcedure.html#line.157">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)
@@ -709,7 +709,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>waitInitialized</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.162">waitInitialized</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;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.163">waitInitialized</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#waitInitialized-TEnvironment-">Procedure</a></code></span></div>
 <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
  call us to determine whether we need to wait for initialization, second, it will call
@@ -734,7 +734,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>queueAssign</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.172">queueAssign</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/TransitRegionStateProcedure.html#line.173">queueAssign</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)
                   throws <a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureSuspendedException.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureSuspendedException</a></pre>
 <dl>
@@ -749,7 +749,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>openRegion</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.197">openRegion</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/TransitRegionStateProcedure.html#line.198">openRegion</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)
                  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>
@@ -764,7 +764,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>confirmOpened</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2">StateMachineProcedure.Flow</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.210">confirmOpened</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">Ma [...]
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2">StateMachineProcedure.Flow</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.211">confirmOpened</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">Ma [...]
                                                  <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>
@@ -779,7 +779,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>closeRegion</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.257">closeRegion</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/TransitRegionStateProcedure.html#line.258">closeRegion</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)
                   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>
@@ -794,7 +794,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>confirmClosed</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2">StateMachineProcedure.Flow</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.271">confirmClosed</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">Ma [...]
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2">StateMachineProcedure.Flow</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.272">confirmClosed</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">Ma [...]
                                                  <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>
@@ -809,7 +809,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <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>[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.311">execute</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;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.312">execute</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)
                        throws <a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureSuspendedException.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureSuspendedException</a>,
                               <a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureYieldException.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureYieldException</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>
@@ -840,7 +840,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionStateNode</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.323">getRegionStateNode</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">Mast [...]
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.324">getRegionStateNode</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">Mast [...]
 </li>
 </ul>
 <a name="executeFromState-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionState-">
@@ -849,7 +849,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>executeFromState</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2">StateMachineProcedure.Flow</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.328">executeFromState</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedur [...]
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2">StateMachineProcedure.Flow</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.329">executeFromState</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedur [...]
                                                       org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionState&nbsp;state)
                                                throws <a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureSuspendedException.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureSuspendedException</a>,
                                                       <a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureYieldException.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureYieldException</a>,
@@ -876,7 +876,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>setTimeoutFailure</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.366">setTimeoutFailure</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;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.370">setTimeoutFailure</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">At end of timeout, wake ourselves up so we run again.</div>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
@@ -893,7 +893,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>reportTransition</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.373">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>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.377">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;code,
@@ -912,7 +912,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>serverCrashed</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.395">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>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.399">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)
                    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>
@@ -928,7 +928,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>attachRemoteProc</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.406">attachRemoteProc</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>
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.410">attachRemoteProc</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="unattachRemoteProc-org.apache.hadoop.hbase.master.assignment.RegionRemoteProcedureBase-">
@@ -937,7 +937,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>unattachRemoteProc</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.410">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>
+<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="rollbackState-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionState-">
@@ -946,7 +946,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <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.416">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.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,
                              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 +968,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.423">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.427">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 +987,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.428">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.432">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 +1006,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.433">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.437">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 +1023,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.437">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.441">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 +1032,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.452">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.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>
 </li>
 </ul>
 <a name="serializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">
@@ -1041,7 +1041,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.468">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.472">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 +1063,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.479">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.483">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 +1084,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.492">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.496">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 +1104,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.509">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.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>
 <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 +1122,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.520">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.524">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 +1132,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.533">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.537">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 +1144,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.539">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.543">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 +1154,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.544">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.548">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 +1164,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.549">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.553">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/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 fc32bd3..2610df5 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/SplitLogManager.ResubmitDirective.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">SplitLogManager.ResubmitDirective</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.TerminationStatus.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">SplitLogManager.TerminationStatus</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/MetricsMasterSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">MetricsMasterSourceFactoryImpl.FactoryStorage</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.ResubmitDirective.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">SplitLogManager.ResubmitDirective</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">RegionState.State</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/MasterRpcServices.BalanceSwitchMode.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">MasterRpcServices.BalanceSwitchMode</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">RegionState.State</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/procedure/InitMetaProcedure.html b/devapidocs/org/apache/hadoop/hbase/master/procedure/InitMetaProcedure.html
index 3520c1d..a32a2a3 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/procedure/InitMetaProcedure.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/procedure/InitMetaProcedure.html
@@ -129,7 +129,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.Private
-public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/InitMetaProcedure.html#line.48">InitMetaProcedure</a>
+public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/InitMetaProcedure.html#line.49">InitMetaProcedure</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/AbstractStateMachineTableProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">AbstractStateMachineTableProcedure</a>&lt;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.InitMetaState&gt;</pre>
 <div class="block">This procedure is used to initialize meta table for a new hbase deploy. It will just schedule an
  <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment"><code>TransitRegionStateProcedure</code></a> to assign meta.</div>
@@ -181,17 +181,17 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <th class="colLast" scope="col">Field and Description</th>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><code>private int</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/InitMetaProcedure.html#attempts">attempts</a></span></code>&nbsp;</td>
-</tr>
-<tr class="rowColor">
 <td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CountDownLatch.html?is-external=true" title="class or interface in java.util.concurrent">CountDownLatch</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/InitMetaProcedure.html#latch">latch</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private static org.slf4j.Logger</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/InitMetaProcedure.html#LOG">LOG</a></span></code>&nbsp;</td>
 </tr>
+<tr class="altColor">
+<td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/util/RetryCounter.html" title="class in org.apache.hadoop.hbase.util">RetryCounter</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/InitMetaProcedure.html#retryCounter">retryCounter</a></span></code>&nbsp;</td>
+</tr>
 </table>
 <ul class="blockList">
 <li class="blockList"><a name="fields.inherited.from.class.org.apache.hadoop.hbase.procedure2.StateMachineProcedure">
@@ -380,7 +380,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>LOG</h4>
-<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/InitMetaProcedure.html#line.50">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/InitMetaProcedure.html#line.51">LOG</a></pre>
 </li>
 </ul>
 <a name="latch">
@@ -389,16 +389,16 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>latch</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CountDownLatch.html?is-external=true" title="class or interface in java.util.concurrent">CountDownLatch</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/InitMetaProcedure.html#line.52">latch</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CountDownLatch.html?is-external=true" title="class or interface in java.util.concurrent">CountDownLatch</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/InitMetaProcedure.html#line.53">latch</a></pre>
 </li>
 </ul>
-<a name="attempts">
+<a name="retryCounter">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
-<h4>attempts</h4>
-<pre>private&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/InitMetaProcedure.html#line.54">attempts</a></pre>
+<h4>retryCounter</h4>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/util/RetryCounter.html" title="class in org.apache.hadoop.hbase.util">RetryCounter</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/InitMetaProcedure.html#line.55">retryCounter</a></pre>
 </li>
 </ul>
 </li>
@@ -415,7 +415,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockListLast">
 <li class="blockList">
 <h4>InitMetaProcedure</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/InitMetaProcedure.html#line.48">InitMetaProcedure</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/InitMetaProcedure.html#line.49">InitMetaProcedure</a>()</pre>
 </li>
 </ul>
 </li>
@@ -432,7 +432,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableName</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/InitMetaProcedure.html#line.57">getTableName</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/InitMetaProcedure.html#line.58">getTableName</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.html#getTableName--">getTableName</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.html" title="interface in org.apache.hadoop.hbase.master.procedure">TableProcedureInterface</a></code></dd>
@@ -449,7 +449,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <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/procedure/InitMetaProcedure.html#line.62">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/procedure/InitMetaProcedure.html#line.63">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)
@@ -470,7 +470,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>executeFromState</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2">StateMachineProcedure.Flow</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/InitMetaProcedure.html#line.67">executeFromState</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/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2">StateMachineProcedure.Flow</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/InitMetaProcedure.html#line.68">executeFromState</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterPro [...]
                                                       org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.InitMetaState&nbsp;state)
                                                throws <a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureSuspendedException.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureSuspendedException</a>,
                                                       <a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureYieldException.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureYieldException</a>,
@@ -497,7 +497,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>waitInitialized</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/InitMetaProcedure.html#line.102">waitInitialized</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;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/InitMetaProcedure.html#line.106">waitInitialized</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#waitInitialized-TEnvironment-">Procedure</a></code></span></div>
 <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
  call us to determine whether we need to wait for initialization, second, it will call
@@ -522,7 +522,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>setTimeoutFailure</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/InitMetaProcedure.html#line.108">setTimeoutFailure</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;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/InitMetaProcedure.html#line.112">setTimeoutFailure</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#setTimeoutFailure-TEnvironment-">Procedure</a></code></span></div>
 <div class="block">Called by the ProcedureExecutor when the timeout set by setTimeout() is expired.
  <p/>
@@ -547,7 +547,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>acquireLock</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.LockState.html" title="enum in org.apache.hadoop.hbase.procedure2">Procedure.LockState</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/InitMetaProcedure.html#line.115">acquireLock</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp [...]
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.LockState.html" title="enum in org.apache.hadoop.hbase.procedure2">Procedure.LockState</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/InitMetaProcedure.html#line.119">acquireLock</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp [...]
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#acquireLock-TEnvironment-">Procedure</a></code></span></div>
 <div class="block">The user should override this method if they need a lock on an Entity. A lock can be anything,
  and it is up to the implementor. The Procedure Framework will call this method just before it
@@ -584,7 +584,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>rollbackState</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/InitMetaProcedure.html#line.123">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/procedure/InitMetaProcedure.html#line.127">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.InitMetaState&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>
@@ -606,7 +606,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.InitMetaState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/InitMetaProcedure.html#line.129">getState</a>(int&nbsp;stateId)</pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.InitMetaState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/InitMetaProcedure.html#line.133">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>
@@ -625,7 +625,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/procedure/InitMetaProcedure.html#line.134">getStateId</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.InitMetaState&nbsp;state)</pre>
+<pre>protected&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/InitMetaProcedure.html#line.138">getStateId</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.InitMetaState&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>
@@ -644,7 +644,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.InitMetaState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/InitMetaProcedure.html#line.139">getInitialState</a>()</pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.InitMetaState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/InitMetaProcedure.html#line.143">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>
@@ -661,7 +661,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/procedure/InitMetaProcedure.html#line.144">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/procedure/InitMetaProcedure.html#line.148">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
@@ -683,7 +683,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/procedure/InitMetaProcedure.html#line.150">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/procedure/InitMetaProcedure.html#line.154">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
@@ -704,7 +704,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>completionCleanup</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/InitMetaProcedure.html#line.156">completionCleanup</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/procedure/InitMetaProcedure.html#line.160">completionCleanup</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#completionCleanup-TEnvironment-">Procedure</a></code></span></div>
 <div class="block">Called when the procedure is marked as completed (success or rollback).
  The procedure implementor may use this method to cleanup in-memory states.
@@ -722,7 +722,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockListLast">
 <li class="blockList">
 <h4>await</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/InitMetaProcedure.html#line.160">await</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/InitMetaProcedure.html#line.164">await</a>()
            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html b/devapidocs/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html
index 7869d31..049df9e 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html
@@ -129,7 +129,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.Private
-public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.45">ReopenTableRegionsProcedure</a>
+public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.46">ReopenTableRegionsProcedure</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/AbstractStateMachineTableProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">AbstractStateMachineTableProcedure</a>&lt;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.ReopenTableRegionsState&gt;</pre>
 <div class="block">Used for reopening the regions for a table.</div>
 </li>
@@ -180,17 +180,17 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <th class="colLast" scope="col">Field and Description</th>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><code>private int</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#attempt">attempt</a></span></code>&nbsp;</td>
-</tr>
-<tr class="rowColor">
 <td class="colFirst"><code>private static org.slf4j.Logger</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#LOG">LOG</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <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/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#regions">regions</a></span></code>&nbsp;</td>
 </tr>
+<tr class="altColor">
+<td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/util/RetryCounter.html" title="class in org.apache.hadoop.hbase.util">RetryCounter</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#retryCounter">retryCounter</a></span></code>&nbsp;</td>
+</tr>
 <tr class="rowColor">
 <td class="colFirst"><code>private <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/procedure/ReopenTableRegionsProcedure.html#tableName">tableName</a></span></code>&nbsp;</td>
@@ -367,7 +367,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>LOG</h4>
-<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.48">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.49">LOG</a></pre>
 </li>
 </ul>
 <a name="tableName">
@@ -376,7 +376,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>tableName</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.50">tableName</a></pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.51">tableName</a></pre>
 </li>
 </ul>
 <a name="regions">
@@ -385,16 +385,16 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>regions</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/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.52">regions</a></pre>
+<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/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.53">regions</a></pre>
 </li>
 </ul>
-<a name="attempt">
+<a name="retryCounter">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
-<h4>attempt</h4>
-<pre>private&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.54">attempt</a></pre>
+<h4>retryCounter</h4>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/util/RetryCounter.html" title="class in org.apache.hadoop.hbase.util">RetryCounter</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.55">retryCounter</a></pre>
 </li>
 </ul>
 </li>
@@ -411,7 +411,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>ReopenTableRegionsProcedure</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.56">ReopenTableRegionsProcedure</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.57">ReopenTableRegionsProcedure</a>()</pre>
 </li>
 </ul>
 <a name="ReopenTableRegionsProcedure-org.apache.hadoop.hbase.TableName-">
@@ -420,7 +420,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockListLast">
 <li class="blockList">
 <h4>ReopenTableRegionsProcedure</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.59">ReopenTableRegionsProcedure</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.60">ReopenTableRegionsProcedure</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
 </li>
 </ul>
 </li>
@@ -437,7 +437,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableName</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.64">getTableName</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.65">getTableName</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.html#getTableName--">getTableName</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.html" title="interface in org.apache.hadoop.hbase.master.procedure">TableProcedureInterface</a></code></dd>
@@ -454,7 +454,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <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/procedure/ReopenTableRegionsProcedure.html#line.69">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/procedure/ReopenTableRegionsProcedure.html#line.70">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)
@@ -475,7 +475,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>canSchedule</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.73">canSchedule</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;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.74">canSchedule</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/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a>&nbsp;loc)</pre>
 </li>
 </ul>
@@ -485,7 +485,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>executeFromState</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2">StateMachineProcedure.Flow</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.86">executeFromState</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure" [...]
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2">StateMachineProcedure.Flow</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.87">executeFromState</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure" [...]
                                                       org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.ReopenTableRegionsState&nbsp;state)
                                                throws <a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureSuspendedException.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureSuspendedException</a>,
                                                       <a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureYieldException.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureYieldException</a>,
@@ -512,7 +512,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>setTimeoutFailure</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.152">setTimeoutFailure</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;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.156">setTimeoutFailure</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">At end of timeout, wake ourselves up so we run again.</div>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
@@ -529,7 +529,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>rollbackState</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.159">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/procedure/ReopenTableRegionsProcedure.html#line.163">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.ReopenTableRegionsState&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>
@@ -551,7 +551,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.ReopenTableRegionsState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.165">getState</a>(int&nbsp;stateId)</pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.ReopenTableRegionsState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.169">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>
@@ -570,7 +570,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/procedure/ReopenTableRegionsProcedure.html#line.170">getStateId</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.ReopenTableRegionsState&nbsp;state)</pre>
+<pre>protected&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.174">getStateId</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.ReopenTableRegionsState&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>
@@ -589,7 +589,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.ReopenTableRegionsState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.175">getInitialState</a>()</pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.ReopenTableRegionsState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.179">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>
@@ -606,7 +606,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/procedure/ReopenTableRegionsProcedure.html#line.180">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/procedure/ReopenTableRegionsProcedure.html#line.184">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
@@ -628,7 +628,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockListLast">
 <li class="blockList">
 <h4>deserializeStateData</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.189">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/procedure/ReopenTableRegionsProcedure.html#line.193">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
diff --git a/devapidocs/org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html b/devapidocs/org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html
index f211bd3..14cd4aa 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10};
 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/procedure/SplitWALProcedure.html#line.49">SplitWALProcedure</a>
+public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html#line.50">SplitWALProcedure</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">StateMachineProcedure</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>,org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.SplitWALState&gt;
 implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ServerProcedureInterface.html" title="interface in org.apache.hadoop.hbase.master.procedure">ServerProcedureInterface</a></pre>
 <div class="block">The procedure is to split a WAL. It will get an available region server and
@@ -180,17 +180,17 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/S
 <th class="colLast" scope="col">Field and Description</th>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><code>private int</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html#attempts">attempts</a></span></code>&nbsp;</td>
-</tr>
-<tr class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html#crashedServer">crashedServer</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private static org.slf4j.Logger</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html#LOG">LOG</a></span></code>&nbsp;</td>
 </tr>
+<tr class="altColor">
+<td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/util/RetryCounter.html" title="class in org.apache.hadoop.hbase.util">RetryCounter</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html#retryCounter">retryCounter</a></span></code>&nbsp;</td>
+</tr>
 <tr class="rowColor">
 <td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html#walPath">walPath</a></span></code>&nbsp;</td>
@@ -330,10 +330,6 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/S
 <div class="block">Called by the ProcedureExecutor when the timeout set by setTimeout() is expired.</div>
 </td>
 </tr>
-<tr id="i14" class="altColor">
-<td class="colFirst"><code>protected <a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureSuspendedException.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureSuspendedException</a></code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html#suspend-long-">suspend</a></span>(long&nbsp;backoff)</code>&nbsp;</td>
-</tr>
 </table>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.procedure2.StateMachineProcedure">
@@ -376,7 +372,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/S
 <ul class="blockList">
 <li class="blockList">
 <h4>LOG</h4>
-<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html#line.52">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html#line.53">LOG</a></pre>
 </li>
 </ul>
 <a name="walPath">
@@ -385,7 +381,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/S
 <ul class="blockList">
 <li class="blockList">
 <h4>walPath</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html#line.53">walPath</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html#line.54">walPath</a></pre>
 </li>
 </ul>
 <a name="worker">
@@ -394,7 +390,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/S
 <ul class="blockList">
 <li class="blockList">
 <h4>worker</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/procedure/SplitWALProcedure.html#line.54">worker</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/procedure/SplitWALProcedure.html#line.55">worker</a></pre>
 </li>
 </ul>
 <a name="crashedServer">
@@ -403,16 +399,16 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/S
 <ul class="blockList">
 <li class="blockList">
 <h4>crashedServer</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/procedure/SplitWALProcedure.html#line.55">crashedServer</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/procedure/SplitWALProcedure.html#line.56">crashedServer</a></pre>
 </li>
 </ul>
-<a name="attempts">
+<a name="retryCounter">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
-<h4>attempts</h4>
-<pre>private&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html#line.56">attempts</a></pre>
+<h4>retryCounter</h4>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/util/RetryCounter.html" title="class in org.apache.hadoop.hbase.util">RetryCounter</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html#line.57">retryCounter</a></pre>
 </li>
 </ul>
 </li>
@@ -429,7 +425,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/S
 <ul class="blockList">
 <li class="blockList">
 <h4>SplitWALProcedure</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html#line.58">SplitWALProcedure</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html#line.59">SplitWALProcedure</a>()</pre>
 </li>
 </ul>
 <a name="SplitWALProcedure-java.lang.String-org.apache.hadoop.hbase.ServerName-">
@@ -438,7 +434,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/S
 <ul class="blockListLast">
 <li class="blockList">
 <h4>SplitWALProcedure</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html#line.61">SplitWALProcedure</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;walPath,
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html#line.62">SplitWALProcedure</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;walPath,
                          <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;crashedServer)</pre>
 </li>
 </ul>
@@ -456,7 +452,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/S
 <ul class="blockList">
 <li class="blockList">
 <h4>executeFromState</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2">StateMachineProcedure.Flow</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html#line.67">executeFromState</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/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2">StateMachineProcedure.Flow</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html#line.68">executeFromState</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterPro [...]
                                                       org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.SplitWALState&nbsp;state)
                                                throws <a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureSuspendedException.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureSuspendedException</a>,
                                                       <a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureYieldException.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureYieldException</a>,
@@ -483,7 +479,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/S
 <ul class="blockList">
 <li class="blockList">
 <h4>rollbackState</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html#line.105">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/procedure/SplitWALProcedure.html#line.111">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.SplitWALState&nbsp;splitOneWalState)
                       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>
@@ -505,7 +501,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/S
 <ul class="blockList">
 <li class="blockList">
 <h4>getState</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.SplitWALState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html#line.115">getState</a>(int&nbsp;stateId)</pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.SplitWALState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html#line.121">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>
@@ -524,7 +520,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/S
 <ul class="blockList">
 <li class="blockList">
 <h4>getStateId</h4>
-<pre>protected&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html#line.120">getStateId</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.SplitWALState&nbsp;state)</pre>
+<pre>protected&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html#line.126">getStateId</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.SplitWALState&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>
@@ -543,7 +539,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/S
 <ul class="blockList">
 <li class="blockList">
 <h4>getInitialState</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.SplitWALState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html#line.125">getInitialState</a>()</pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.SplitWALState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html#line.131">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>
@@ -560,7 +556,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/S
 <ul class="blockList">
 <li class="blockList">
 <h4>serializeStateData</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html#line.130">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/procedure/SplitWALProcedure.html#line.136">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
@@ -582,7 +578,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/S
 <ul class="blockList">
 <li class="blockList">
 <h4>deserializeStateData</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html#line.142">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/procedure/SplitWALProcedure.html#line.148">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
@@ -603,7 +599,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/S
 <ul class="blockList">
 <li class="blockList">
 <h4>setTimeoutFailure</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html#line.154">setTimeoutFailure</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;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html#line.160">setTimeoutFailure</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#setTimeoutFailure-TEnvironment-">Procedure</a></code></span></div>
 <div class="block">Called by the ProcedureExecutor when the timeout set by setTimeout() is expired.
  <p/>
@@ -622,27 +618,13 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/S
 </dl>
 </li>
 </ul>
-<a name="suspend-long-">
-<!--   -->
-</a>
-<ul class="blockList">
-<li class="blockList">
-<h4>suspend</h4>
-<pre>protected final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureSuspendedException.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureSuspendedException</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html#line.160">suspend</a>(long&nbsp;backoff)
-                                             throws <a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureSuspendedException.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureSuspendedException</a></pre>
-<dl>
-<dt><span class="throwsLabel">Throws:</span></dt>
-<dd><code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureSuspendedException.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureSuspendedException</a></code></dd>
-</dl>
-</li>
-</ul>
 <a name="getWAL--">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>getWAL</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html#line.169">getWAL</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html#line.166">getWAL</a>()</pre>
 </li>
 </ul>
 <a name="getWorker--">
@@ -651,7 +633,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/S
 <ul class="blockList">
 <li class="blockList">
 <h4>getWorker</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html#line.174">getWorker</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html#line.171">getWorker</a>()</pre>
 </li>
 </ul>
 <a name="getServerName--">
@@ -660,7 +642,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/S
 <ul class="blockList">
 <li class="blockList">
 <h4>getServerName</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html#line.179">getServerName</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html#line.176">getServerName</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ServerProcedureInterface.html#getServerName--">getServerName</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ServerProcedureInterface.html" title="interface in org.apache.hadoop.hbase.master.procedure">ServerProcedureInterface</a></code></dd>
@@ -675,7 +657,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/S
 <ul class="blockList">
 <li class="blockList">
 <h4>hasMetaTableRegion</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html#line.184">hasMetaTableRegion</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html#line.181">hasMetaTableRegion</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ServerProcedureInterface.html#hasMetaTableRegion--">hasMetaTableRegion</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ServerProcedureInterface.html" title="interface in org.apache.hadoop.hbase.master.procedure">ServerProcedureInterface</a></code></dd>
@@ -690,7 +672,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/S
 <ul class="blockList">
 <li class="blockList">
 <h4>getServerOperationType</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ServerProcedureInterface.ServerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure">ServerProcedureInterface.ServerOperationType</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html#line.189">getServerOperationType</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ServerProcedureInterface.ServerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure">ServerProcedureInterface.ServerOperationType</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html#line.186">getServerOperationType</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ServerProcedureInterface.html#getServerOperationType--">ServerProcedureInterface</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 crash handler and we have some assignment operation pending
@@ -709,7 +691,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/S
 <ul class="blockListLast">
 <li class="blockList">
 <h4>afterReplay</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html#line.194">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/procedure/SplitWALProcedure.html#line.191">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/procedure/SwitchRpcThrottleProcedure.html b/devapidocs/org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html
index 09dd917..657a478 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html
@@ -124,7 +124,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.Private
-public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html#line.40">SwitchRpcThrottleProcedure</a>
+public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html#line.41">SwitchRpcThrottleProcedure</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">StateMachineProcedure</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>,org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.SwitchRpcThrottleState&gt;
 implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ServerProcedureInterface.html" title="interface in org.apache.hadoop.hbase.master.procedure">ServerProcedureInterface</a></pre>
 <div class="block">The procedure to switch rpc throttle</div>
@@ -176,27 +176,27 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/S
 <th class="colLast" scope="col">Field and Description</th>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><code>(package private) int</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html#attempts">attempts</a></span></code>&nbsp;</td>
-</tr>
-<tr class="rowColor">
 <td class="colFirst"><code>private static org.slf4j.Logger</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html#LOG">LOG</a></span></code>&nbsp;</td>
 </tr>
+<tr class="rowColor">
+<td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/util/RetryCounter.html" title="class in org.apache.hadoop.hbase.util">RetryCounter</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html#retryCounter">retryCounter</a></span></code>&nbsp;</td>
+</tr>
 <tr class="altColor">
-<td class="colFirst"><code>(package private) boolean</code></td>
+<td class="colFirst"><code>private boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html#rpcThrottleEnabled">rpcThrottleEnabled</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><code>(package private) <a href="../../../../../../org/apache/hadoop/hbase/quotas/RpcThrottleStorage.html" title="class in org.apache.hadoop.hbase.quotas">RpcThrottleStorage</a></code></td>
+<td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/quotas/RpcThrottleStorage.html" title="class in org.apache.hadoop.hbase.quotas">RpcThrottleStorage</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html#rpcThrottleStorage">rpcThrottleStorage</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><code>(package private) <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a></code></td>
+<td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html#serverName">serverName</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><code>(package private) <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ProcedurePrepareLatch.html" title="class in org.apache.hadoop.hbase.master.procedure">ProcedurePrepareLatch</a></code></td>
+<td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ProcedurePrepareLatch.html" title="class in org.apache.hadoop.hbase.master.procedure">ProcedurePrepareLatch</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html#syncLatch">syncLatch</a></span></code>&nbsp;</td>
 </tr>
 </table>
@@ -369,7 +369,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/S
 <ul class="blockList">
 <li class="blockList">
 <h4>LOG</h4>
-<pre>private static&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html#line.44">LOG</a></pre>
+<pre>private static&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html#line.45">LOG</a></pre>
 </li>
 </ul>
 <a name="rpcThrottleStorage">
@@ -378,7 +378,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/S
 <ul class="blockList">
 <li class="blockList">
 <h4>rpcThrottleStorage</h4>
-<pre><a href="../../../../../../org/apache/hadoop/hbase/quotas/RpcThrottleStorage.html" title="class in org.apache.hadoop.hbase.quotas">RpcThrottleStorage</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html#line.46">rpcThrottleStorage</a></pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/quotas/RpcThrottleStorage.html" title="class in org.apache.hadoop.hbase.quotas">RpcThrottleStorage</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html#line.47">rpcThrottleStorage</a></pre>
 </li>
 </ul>
 <a name="rpcThrottleEnabled">
@@ -387,7 +387,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/S
 <ul class="blockList">
 <li class="blockList">
 <h4>rpcThrottleEnabled</h4>
-<pre>boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html#line.47">rpcThrottleEnabled</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html#line.48">rpcThrottleEnabled</a></pre>
 </li>
 </ul>
 <a name="syncLatch">
@@ -396,7 +396,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/S
 <ul class="blockList">
 <li class="blockList">
 <h4>syncLatch</h4>
-<pre><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ProcedurePrepareLatch.html" title="class in org.apache.hadoop.hbase.master.procedure">ProcedurePrepareLatch</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html#line.48">syncLatch</a></pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ProcedurePrepareLatch.html" title="class in org.apache.hadoop.hbase.master.procedure">ProcedurePrepareLatch</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html#line.49">syncLatch</a></pre>
 </li>
 </ul>
 <a name="serverName">
@@ -405,16 +405,16 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/S
 <ul class="blockList">
 <li class="blockList">
 <h4>serverName</h4>
-<pre><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/procedure/SwitchRpcThrottleProcedure.html#line.49">serverName</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/procedure/SwitchRpcThrottleProcedure.html#line.50">serverName</a></pre>
 </li>
 </ul>
-<a name="attempts">
+<a name="retryCounter">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
-<h4>attempts</h4>
-<pre>int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html#line.50">attempts</a></pre>
+<h4>retryCounter</h4>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/util/RetryCounter.html" title="class in org.apache.hadoop.hbase.util">RetryCounter</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html#line.51">retryCounter</a></pre>
 </li>
 </ul>
 </li>
@@ -431,7 +431,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/S
 <ul class="blockList">
 <li class="blockList">
 <h4>SwitchRpcThrottleProcedure</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html#line.52">SwitchRpcThrottleProcedure</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html#line.53">SwitchRpcThrottleProcedure</a>()</pre>
 </li>
 </ul>
 <a name="SwitchRpcThrottleProcedure-org.apache.hadoop.hbase.quotas.RpcThrottleStorage-boolean-org.apache.hadoop.hbase.ServerName-org.apache.hadoop.hbase.master.procedure.ProcedurePrepareLatch-">
@@ -440,7 +440,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/S
 <ul class="blockListLast">
 <li class="blockList">
 <h4>SwitchRpcThrottleProcedure</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html#line.55">SwitchRpcThrottleProcedure</a>(<a href="../../../../../../org/apache/hadoop/hbase/quotas/RpcThrottleStorage.html" title="class in org.apache.hadoop.hbase.quotas">RpcThrottleStorage</a>&nbsp;rpcThrottleStorage,
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html#line.56">SwitchRpcThrottleProcedure</a>(<a href="../../../../../../org/apache/hadoop/hbase/quotas/RpcThrottleStorage.html" title="class in org.apache.hadoop.hbase.quotas">RpcThrottleStorage</a>&nbsp;rpcThrottleStorage,
                                   boolean&nbsp;rpcThrottleEnabled,
                                   <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/master/procedure/ProcedurePrepareLatch.html" title="class in org.apache.hadoop.hbase.master.procedure">ProcedurePrepareLatch</a>&nbsp;syncLatch)</pre>
@@ -460,7 +460,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/S
 <ul class="blockList">
 <li class="blockList">
 <h4>executeFromState</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2">StateMachineProcedure.Flow</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html#line.64">executeFromState</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure"> [...]
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2">StateMachineProcedure.Flow</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html#line.65">executeFromState</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure"> [...]
                                                       org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.SwitchRpcThrottleState&nbsp;state)
                                                throws <a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureSuspendedException.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureSuspendedException</a>,
                                                       <a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureYieldException.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureYieldException</a>,
@@ -487,7 +487,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/S
 <ul class="blockList">
 <li class="blockList">
 <h4>rollbackState</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html#line.98">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/procedure/SwitchRpcThrottleProcedure.html#line.102">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.SwitchRpcThrottleState&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>
@@ -509,7 +509,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/S
 <ul class="blockList">
 <li class="blockList">
 <h4>getState</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.SwitchRpcThrottleState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html#line.103">getState</a>(int&nbsp;stateId)</pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.SwitchRpcThrottleState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html#line.107">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>
@@ -528,7 +528,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/S
 <ul class="blockList">
 <li class="blockList">
 <h4>getStateId</h4>
-<pre>protected&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html#line.108">getStateId</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.SwitchRpcThrottleState&nbsp;throttleState)</pre>
+<pre>protected&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html#line.112">getStateId</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.SwitchRpcThrottleState&nbsp;throttleState)</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>
@@ -547,7 +547,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/S
 <ul class="blockList">
 <li class="blockList">
 <h4>getInitialState</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.SwitchRpcThrottleState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html#line.113">getInitialState</a>()</pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.SwitchRpcThrottleState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html#line.117">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>
@@ -564,7 +564,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/S
 <ul class="blockList">
 <li class="blockList">
 <h4>getCurrentState</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.SwitchRpcThrottleState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html#line.118">getCurrentState</a>()</pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.SwitchRpcThrottleState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html#line.122">getCurrentState</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#getCurrentState--">getCurrentState</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">StateMachineProcedure</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure"> [...]
@@ -577,7 +577,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/S
 <ul class="blockList">
 <li class="blockList">
 <h4>serializeStateData</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html#line.123">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/procedure/SwitchRpcThrottleProcedure.html#line.127">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
@@ -599,7 +599,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/S
 <ul class="blockList">
 <li class="blockList">
 <h4>deserializeStateData</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html#line.130">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/procedure/SwitchRpcThrottleProcedure.html#line.134">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
@@ -620,7 +620,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/S
 <ul class="blockList">
 <li class="blockList">
 <h4>getServerName</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html#line.137">getServerName</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html#line.141">getServerName</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ServerProcedureInterface.html#getServerName--">getServerName</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ServerProcedureInterface.html" title="interface in org.apache.hadoop.hbase.master.procedure">ServerProcedureInterface</a></code></dd>
@@ -635,7 +635,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/S
 <ul class="blockList">
 <li class="blockList">
 <h4>hasMetaTableRegion</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html#line.142">hasMetaTableRegion</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html#line.146">hasMetaTableRegion</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ServerProcedureInterface.html#hasMetaTableRegion--">hasMetaTableRegion</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ServerProcedureInterface.html" title="interface in org.apache.hadoop.hbase.master.procedure">ServerProcedureInterface</a></code></dd>
@@ -650,7 +650,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/S
 <ul class="blockList">
 <li class="blockList">
 <h4>getServerOperationType</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ServerProcedureInterface.ServerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure">ServerProcedureInterface.ServerOperationType</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html#line.147">getServerOperationType</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ServerProcedureInterface.ServerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure">ServerProcedureInterface.ServerOperationType</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html#line.151">getServerOperationType</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ServerProcedureInterface.html#getServerOperationType--">ServerProcedureInterface</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 crash handler and we have some assignment operation pending
@@ -669,7 +669,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/S
 <ul class="blockList">
 <li class="blockList">
 <h4>switchThrottleState</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html#line.151">switchThrottleState</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>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html#line.155">switchThrottleState</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                                 boolean&nbsp;rpcThrottleEnabled)
                          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>
@@ -684,7 +684,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/S
 <ul class="blockListLast">
 <li class="blockList">
 <h4>toStringClassDetails</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html#line.157">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/procedure/SwitchRpcThrottleProcedure.html#line.161">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>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/procedure/class-use/ProcedurePrepareLatch.html b/devapidocs/org/apache/hadoop/hbase/master/procedure/class-use/ProcedurePrepareLatch.html
index f8424ef..75dae2f 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/procedure/class-use/ProcedurePrepareLatch.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/procedure/class-use/ProcedurePrepareLatch.html
@@ -192,7 +192,7 @@
 <td class="colLast"><span class="typeNameLabel">AbstractStateMachineNamespaceProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/AbstractStateMachineNamespaceProcedure.html#syncLatch">syncLatch</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><code>(package private) <a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/ProcedurePrepareLatch.html" title="class in org.apache.hadoop.hbase.master.procedure">ProcedurePrepareLatch</a></code></td>
+<td class="colFirst"><code>private <a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/ProcedurePrepareLatch.html" title="class in org.apache.hadoop.hbase.master.procedure">ProcedurePrepareLatch</a></code></td>
 <td class="colLast"><span class="typeNameLabel">SwitchRpcThrottleProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html#syncLatch">syncLatch</a></span></code>&nbsp;</td>
 </tr>
 </tbody>
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 5c4442f..11171cd 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
@@ -216,8 +216,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.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/MetaProcedureInterface.MetaOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">MetaProcedureInterface.MetaOperationType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ServerProcedureInterface.ServerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">ServerProcedureInterface.ServerOperationType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/PeerProcedureInterface.PeerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">PeerProcedureInterface.PeerOperationType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.TableOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">TableProcedureInterface.TableOperationType</span></a></li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html b/devapidocs/org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html
index 8e5f45e..461656b 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.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";
@@ -128,7 +128,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.Private
-public abstract class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#line.36">AbstractPeerNoLockProcedure</a>&lt;TState&gt;
+public abstract class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#line.40">AbstractPeerNoLockProcedure</a>&lt;TState&gt;
 extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">StateMachineProcedure</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>,TState&gt;
 implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/PeerProcedureInterface.html" title="interface in org.apache.hadoop.hbase.master.procedure">PeerProcedureInterface</a></pre>
 <div class="block">Base class for replication peer related procedures which do not need to hold locks(for most of
@@ -181,13 +181,13 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/P
 <th class="colLast" scope="col">Field and Description</th>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><code>protected int</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#attempts">attempts</a></span></code>&nbsp;</td>
-</tr>
-<tr class="rowColor">
 <td class="colFirst"><code>protected <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#peerId">peerId</a></span></code>&nbsp;</td>
 </tr>
+<tr class="rowColor">
+<td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/util/RetryCounter.html" title="class in org.apache.hadoop.hbase.util">RetryCounter</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#retryCounter">retryCounter</a></span></code>&nbsp;</td>
+</tr>
 </table>
 <ul class="blockList">
 <li class="blockList"><a name="fields.inherited.from.class.org.apache.hadoop.hbase.procedure2.StateMachineProcedure">
@@ -253,29 +253,34 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/P
 </tr>
 <tr id="i2" class="altColor">
 <td class="colFirst"><code>protected void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#resetRetry--">resetRetry</a></span>()</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/replication/AbstractPeerNoLockProcedure.html#rollbackState-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-TState-">rollbackState</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/replication/AbstractPeerNoLockProcedure.html" title="type parameter in AbstractPeerNoLockProcedure">TState</a>&nbsp;state)</code>
 <div class="block">called to perform the rollback of the specified state</div>
 </td>
 </tr>
-<tr id="i3" class="rowColor">
+<tr id="i4" class="altColor">
 <td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.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="i4" class="altColor">
+<tr id="i5" class="rowColor">
 <td class="colFirst"><code>protected boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#setTimeoutFailure-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">setTimeoutFailure</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 by the ProcedureExecutor when the timeout set by setTimeout() is expired.</div>
 </td>
 </tr>
-<tr id="i5" class="rowColor">
+<tr id="i6" class="altColor">
 <td class="colFirst"><code>protected <a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureSuspendedException.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureSuspendedException</a></code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#suspend-long-">suspend</a></span>(long&nbsp;backoff)</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#suspend-org.apache.hadoop.conf.Configuration-java.util.function.LongConsumer-">suspend</a></span>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+       <a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/LongConsumer.html?is-external=true" title="class or interface in java.util.function">LongConsumer</a>&nbsp;backoffConsumer)</code>&nbsp;</td>
 </tr>
-<tr id="i6" class="altColor">
+<tr id="i7" class="rowColor">
 <td class="colFirst"><code>protected boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.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
@@ -332,16 +337,16 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/P
 <ul class="blockList">
 <li class="blockList">
 <h4>peerId</h4>
-<pre>protected&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#line.39">peerId</a></pre>
+<pre>protected&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#line.43">peerId</a></pre>
 </li>
 </ul>
-<a name="attempts">
+<a name="retryCounter">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
-<h4>attempts</h4>
-<pre>protected&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#line.41">attempts</a></pre>
+<h4>retryCounter</h4>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/util/RetryCounter.html" title="class in org.apache.hadoop.hbase.util">RetryCounter</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#line.45">retryCounter</a></pre>
 </li>
 </ul>
 </li>
@@ -358,7 +363,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/P
 <ul class="blockList">
 <li class="blockList">
 <h4>AbstractPeerNoLockProcedure</h4>
-<pre>protected&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#line.43">AbstractPeerNoLockProcedure</a>()</pre>
+<pre>protected&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#line.47">AbstractPeerNoLockProcedure</a>()</pre>
 </li>
 </ul>
 <a name="AbstractPeerNoLockProcedure-java.lang.String-">
@@ -367,7 +372,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/P
 <ul class="blockListLast">
 <li class="blockList">
 <h4>AbstractPeerNoLockProcedure</h4>
-<pre>protected&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#line.46">AbstractPeerNoLockProcedure</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;peerId)</pre>
+<pre>protected&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#line.50">AbstractPeerNoLockProcedure</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;peerId)</pre>
 </li>
 </ul>
 </li>
@@ -384,7 +389,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/P
 <ul class="blockList">
 <li class="blockList">
 <h4>getPeerId</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#line.51">getPeerId</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#line.55">getPeerId</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/PeerProcedureInterface.html#getPeerId--">getPeerId</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/PeerProcedureInterface.html" title="interface in org.apache.hadoop.hbase.master.procedure">PeerProcedureInterface</a></code></dd>
@@ -397,7 +402,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/P
 <ul class="blockList">
 <li class="blockList">
 <h4>waitInitialized</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#line.56">waitInitialized</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;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#line.60">waitInitialized</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#waitInitialized-TEnvironment-">Procedure</a></code></span></div>
 <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
  call us to determine whether we need to wait for initialization, second, it will call
@@ -424,7 +429,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/P
 <ul class="blockList">
 <li class="blockList">
 <h4>rollbackState</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#line.61">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/replication/AbstractPeerNoLockProcedure.html#line.65">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,
                              <a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html" title="type parameter in AbstractPeerNoLockProcedure">TState</a>&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>
@@ -446,7 +451,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/P
 <ul class="blockList">
 <li class="blockList">
 <h4>serializeStateData</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#line.72">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/replication/AbstractPeerNoLockProcedure.html#line.76">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
@@ -468,7 +473,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/P
 <ul class="blockList">
 <li class="blockList">
 <h4>deserializeStateData</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.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/replication/AbstractPeerNoLockProcedure.html#line.82">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
@@ -489,7 +494,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/P
 <ul class="blockList">
 <li class="blockList">
 <h4>setTimeoutFailure</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#line.84">setTimeoutFailure</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;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#line.88">setTimeoutFailure</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#setTimeoutFailure-TEnvironment-">Procedure</a></code></span></div>
 <div class="block">Called by the ProcedureExecutor when the timeout set by setTimeout() is expired.
  <p/>
@@ -508,13 +513,14 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/P
 </dl>
 </li>
 </ul>
-<a name="suspend-long-">
+<a name="suspend-org.apache.hadoop.conf.Configuration-java.util.function.LongConsumer-">
 <!--   -->
 </a>
-<ul class="blockListLast">
+<ul class="blockList">
 <li class="blockList">
 <h4>suspend</h4>
-<pre>protected final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureSuspendedException.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureSuspendedException</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#line.90">suspend</a>(long&nbsp;backoff)
+<pre>protected final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureSuspendedException.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureSuspendedException</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#line.94">suspend</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+                                                    <a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/LongConsumer.html?is-external=true" title="class or interface in java.util.function">LongConsumer</a>&nbsp;backoffConsumer)
                                              throws <a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureSuspendedException.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureSuspendedException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -522,6 +528,15 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/P
 </dl>
 </li>
 </ul>
+<a name="resetRetry--">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>resetRetry</h4>
+<pre>protected final&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#line.107">resetRetry</a>()</pre>
+</li>
+</ul>
 </li>
 </ul>
 </li>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/replication/AbstractPeerProcedure.html b/devapidocs/org/apache/hadoop/hbase/master/replication/AbstractPeerProcedure.html
index 6907799..6ec4a1d 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/replication/AbstractPeerProcedure.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/replication/AbstractPeerProcedure.html
@@ -206,7 +206,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/P
 <!--   -->
 </a>
 <h3>Fields inherited from class&nbsp;org.apache.hadoop.hbase.master.replication.<a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html" title="class in org.apache.hadoop.hbase.master.replication">AbstractPeerNoLockProcedure</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#attempts">attempts</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#peerId">peerId</a></code></li>
+<code><a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#peerId">peerId</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="fields.inherited.from.class.org.apache.hadoop.hbase.procedure2.StateMachineProcedure">
@@ -319,7 +319,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/P
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.master.replication.<a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html" title="class in org.apache.hadoop.hbase.master.replication">AbstractPeerNoLockProcedure</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#deserializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">deserializeStateData</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#getPeerId--">getPeerId</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#rollbackState-org.apache.hadoop.hbase.ma [...]
+<code><a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#deserializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">deserializeStateData</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#getPeerId--">getPeerId</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#resetRetry--">resetRetry</a>, <a href=". [...]
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.procedure2.StateMachineProcedure">
diff --git a/devapidocs/org/apache/hadoop/hbase/master/replication/AddPeerProcedure.html b/devapidocs/org/apache/hadoop/hbase/master/replication/AddPeerProcedure.html
index c60ab40..7cac989 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/replication/AddPeerProcedure.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/replication/AddPeerProcedure.html
@@ -214,7 +214,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Mo
 <!--   -->
 </a>
 <h3>Fields inherited from class&nbsp;org.apache.hadoop.hbase.master.replication.<a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html" title="class in org.apache.hadoop.hbase.master.replication">AbstractPeerNoLockProcedure</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#attempts">attempts</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#peerId">peerId</a></code></li>
+<code><a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#peerId">peerId</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="fields.inherited.from.class.org.apache.hadoop.hbase.procedure2.StateMachineProcedure">
@@ -345,7 +345,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Mo
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.master.replication.<a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html" title="class in org.apache.hadoop.hbase.master.replication">AbstractPeerNoLockProcedure</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#getPeerId--">getPeerId</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#rollbackState-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-TState-">rollbackState</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#setTimeoutFailure-org.apache.hadoop.hbase.maste [...]
+<code><a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#getPeerId--">getPeerId</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#resetRetry--">resetRetry</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#rollbackState-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-TState-">rollbackState</a>, <a href="../../.. [...]
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.procedure2.StateMachineProcedure">
diff --git a/devapidocs/org/apache/hadoop/hbase/master/replication/DisablePeerProcedure.html b/devapidocs/org/apache/hadoop/hbase/master/replication/DisablePeerProcedure.html
index a5b6945..4b53373 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/replication/DisablePeerProcedure.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/replication/DisablePeerProcedure.html
@@ -206,7 +206,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Mo
 <!--   -->
 </a>
 <h3>Fields inherited from class&nbsp;org.apache.hadoop.hbase.master.replication.<a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html" title="class in org.apache.hadoop.hbase.master.replication">AbstractPeerNoLockProcedure</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#attempts">attempts</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#peerId">peerId</a></code></li>
+<code><a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#peerId">peerId</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="fields.inherited.from.class.org.apache.hadoop.hbase.procedure2.StateMachineProcedure">
@@ -310,7 +310,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Mo
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.master.replication.<a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html" title="class in org.apache.hadoop.hbase.master.replication">AbstractPeerNoLockProcedure</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#getPeerId--">getPeerId</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#rollbackState-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-TState-">rollbackState</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#setTimeoutFailure-org.apache.hadoop.hbase.maste [...]
+<code><a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#getPeerId--">getPeerId</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#resetRetry--">resetRetry</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#rollbackState-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-TState-">rollbackState</a>, <a href="../../.. [...]
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.procedure2.StateMachineProcedure">
diff --git a/devapidocs/org/apache/hadoop/hbase/master/replication/EnablePeerProcedure.html b/devapidocs/org/apache/hadoop/hbase/master/replication/EnablePeerProcedure.html
index 017bff4..61f27d0 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/replication/EnablePeerProcedure.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/replication/EnablePeerProcedure.html
@@ -206,7 +206,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Mo
 <!--   -->
 </a>
 <h3>Fields inherited from class&nbsp;org.apache.hadoop.hbase.master.replication.<a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html" title="class in org.apache.hadoop.hbase.master.replication">AbstractPeerNoLockProcedure</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#attempts">attempts</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#peerId">peerId</a></code></li>
+<code><a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#peerId">peerId</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="fields.inherited.from.class.org.apache.hadoop.hbase.procedure2.StateMachineProcedure">
@@ -310,7 +310,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Mo
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.master.replication.<a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html" title="class in org.apache.hadoop.hbase.master.replication">AbstractPeerNoLockProcedure</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#getPeerId--">getPeerId</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#rollbackState-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-TState-">rollbackState</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#setTimeoutFailure-org.apache.hadoop.hbase.maste [...]
+<code><a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#getPeerId--">getPeerId</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#resetRetry--">resetRetry</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#rollbackState-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-TState-">rollbackState</a>, <a href="../../.. [...]
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.procedure2.StateMachineProcedure">
diff --git a/devapidocs/org/apache/hadoop/hbase/master/replication/ModifyPeerProcedure.html b/devapidocs/org/apache/hadoop/hbase/master/replication/ModifyPeerProcedure.html
index 0137bf5..5561b40 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/replication/ModifyPeerProcedure.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/replication/ModifyPeerProcedure.html
@@ -138,7 +138,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.Private
-public abstract class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/ModifyPeerProcedure.html#line.48">ModifyPeerProcedure</a>
+public abstract class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/ModifyPeerProcedure.html#line.47">ModifyPeerProcedure</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerProcedure.html" title="class in org.apache.hadoop.hbase.master.replication">AbstractPeerProcedure</a>&lt;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.PeerModificationState&gt;</pre>
 <div class="block">The base class for all replication peer related procedure except sync replication state
  transition.</div>
@@ -206,7 +206,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <!--   -->
 </a>
 <h3>Fields inherited from class&nbsp;org.apache.hadoop.hbase.master.replication.<a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html" title="class in org.apache.hadoop.hbase.master.replication">AbstractPeerNoLockProcedure</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#attempts">attempts</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#peerId">peerId</a></code></li>
+<code><a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#peerId">peerId</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="fields.inherited.from.class.org.apache.hadoop.hbase.procedure2.StateMachineProcedure">
@@ -351,7 +351,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.master.replication.<a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html" title="class in org.apache.hadoop.hbase.master.replication">AbstractPeerNoLockProcedure</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#deserializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">deserializeStateData</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#getPeerId--">getPeerId</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#rollbackState-org.apache.hadoop.hbase.ma [...]
+<code><a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#deserializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">deserializeStateData</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#getPeerId--">getPeerId</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#resetRetry--">resetRetry</a>, <a href=". [...]
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.procedure2.StateMachineProcedure">
@@ -401,7 +401,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <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/replication/ModifyPeerProcedure.html#line.50">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/ModifyPeerProcedure.html#line.49">LOG</a></pre>
 </li>
 </ul>
 </li>
@@ -418,7 +418,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockList">
 <li class="blockList">
 <h4>ModifyPeerProcedure</h4>
-<pre>protected&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/ModifyPeerProcedure.html#line.52">ModifyPeerProcedure</a>()</pre>
+<pre>protected&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/ModifyPeerProcedure.html#line.51">ModifyPeerProcedure</a>()</pre>
 </li>
 </ul>
 <a name="ModifyPeerProcedure-java.lang.String-">
@@ -427,7 +427,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockListLast">
 <li class="blockList">
 <h4>ModifyPeerProcedure</h4>
-<pre>protected&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/ModifyPeerProcedure.html#line.55">ModifyPeerProcedure</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;peerId)</pre>
+<pre>protected&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/ModifyPeerProcedure.html#line.54">ModifyPeerProcedure</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;peerId)</pre>
 </li>
 </ul>
 </li>
@@ -444,7 +444,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockList">
 <li class="blockList">
 <h4>prePeerModification</h4>
-<pre>protected abstract&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/ModifyPeerProcedure.html#line.66">prePeerModification</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 abstract&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/ModifyPeerProcedure.html#line.65">prePeerModification</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)
                                      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="../../../../../../org/apache/hadoop/hbase/replication/ReplicationException.html" title="class in org.apache.hadoop.hbase.replication">ReplicationException</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>
@@ -467,7 +467,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockList">
 <li class="blockList">
 <h4>updatePeerStorage</h4>
-<pre>protected abstract&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/ModifyPeerProcedure.html#line.69">updatePeerStorage</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 abstract&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/ModifyPeerProcedure.html#line.68">updatePeerStorage</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)
                                    throws <a href="../../../../../../org/apache/hadoop/hbase/replication/ReplicationException.html" title="class in org.apache.hadoop.hbase.replication">ReplicationException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -481,7 +481,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockList">
 <li class="blockList">
 <h4>postPeerModification</h4>
-<pre>protected abstract&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/ModifyPeerProcedure.html#line.80">postPeerModification</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 abstract&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/ModifyPeerProcedure.html#line.79">postPeerModification</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)
                                       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="../../../../../../org/apache/hadoop/hbase/replication/ReplicationException.html" title="class in org.apache.hadoop.hbase.replication">ReplicationException</a></pre>
 <div class="block">Called before we finish the procedure. The implementation can do some logging work, and also
@@ -504,7 +504,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockList">
 <li class="blockList">
 <h4>releaseLatch</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/ModifyPeerProcedure.html#line.83">releaseLatch</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/replication/ModifyPeerProcedure.html#line.82">releaseLatch</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="nextStateAfterRefresh--">
@@ -513,7 +513,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockList">
 <li class="blockList">
 <h4>nextStateAfterRefresh</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.PeerModificationState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/ModifyPeerProcedure.html#line.91">nextStateAfterRefresh</a>()</pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.PeerModificationState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/ModifyPeerProcedure.html#line.90">nextStateAfterRefresh</a>()</pre>
 <div class="block">Implementation class can override this method. By default we will jump to
  POST_PEER_MODIFICATION and finish the procedure.</div>
 </li>
@@ -524,7 +524,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockList">
 <li class="blockList">
 <h4>enablePeerBeforeFinish</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/ModifyPeerProcedure.html#line.99">enablePeerBeforeFinish</a>()</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/ModifyPeerProcedure.html#line.98">enablePeerBeforeFinish</a>()</pre>
 <div class="block">The implementation class should override this method if the procedure may enter the serial
  related states.</div>
 </li>
@@ -535,7 +535,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockList">
 <li class="blockList">
 <h4>getOldPeerConfig</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/replication/ReplicationPeerConfig.html" title="class in org.apache.hadoop.hbase.replication">ReplicationPeerConfig</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/ModifyPeerProcedure.html#line.103">getOldPeerConfig</a>()</pre>
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/replication/ReplicationPeerConfig.html" title="class in org.apache.hadoop.hbase.replication">ReplicationPeerConfig</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/ModifyPeerProcedure.html#line.102">getOldPeerConfig</a>()</pre>
 </li>
 </ul>
 <a name="getNewPeerConfig--">
@@ -544,7 +544,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockList">
 <li class="blockList">
 <h4>getNewPeerConfig</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/replication/ReplicationPeerConfig.html" title="class in org.apache.hadoop.hbase.replication">ReplicationPeerConfig</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/ModifyPeerProcedure.html#line.107">getNewPeerConfig</a>()</pre>
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/replication/ReplicationPeerConfig.html" title="class in org.apache.hadoop.hbase.replication">ReplicationPeerConfig</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/ModifyPeerProcedure.html#line.106">getNewPeerConfig</a>()</pre>
 </li>
 </ul>
 <a name="updateLastPushedSequenceIdForSerialPeer-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">
@@ -553,7 +553,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockList">
 <li class="blockList">
 <h4>updateLastPushedSequenceIdForSerialPeer</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/ModifyPeerProcedure.html#line.111">updateLastPushedSequenceIdForSerialPeer</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/replication/ModifyPeerProcedure.html#line.110">updateLastPushedSequenceIdForSerialPeer</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)
                                                 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="../../../../../../org/apache/hadoop/hbase/replication/ReplicationException.html" title="class in org.apache.hadoop.hbase.replication">ReplicationException</a></pre>
 <dl>
@@ -569,7 +569,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockList">
 <li class="blockList">
 <h4>needReopen</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/ModifyPeerProcedure.html#line.118">needReopen</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/TableStateManager.html" title="class in org.apache.hadoop.hbase.master">TableStateManager</a>&nbsp;tsm,
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/ModifyPeerProcedure.html#line.117">needReopen</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/TableStateManager.html" title="class in org.apache.hadoop.hbase.master">TableStateManager</a>&nbsp;tsm,
                            <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tn)
                     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>
@@ -584,7 +584,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockList">
 <li class="blockList">
 <h4>reopenRegions</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/ModifyPeerProcedure.html#line.139">reopenRegions</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/replication/ModifyPeerProcedure.html#line.138">reopenRegions</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)
                       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>
@@ -598,7 +598,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockList">
 <li class="blockList">
 <h4>executeFromState</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2">StateMachineProcedure.Flow</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/ModifyPeerProcedure.html#line.162">executeFromState</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">Mast [...]
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2">StateMachineProcedure.Flow</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/ModifyPeerProcedure.html#line.161">executeFromState</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">Mast [...]
                                                       org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.PeerModificationState&nbsp;state)
                                                throws <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>
@@ -623,7 +623,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockList">
 <li class="blockList">
 <h4>getState</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.PeerModificationState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/ModifyPeerProcedure.html#line.260">getState</a>(int&nbsp;stateId)</pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.PeerModificationState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/ModifyPeerProcedure.html#line.254">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>
@@ -642,7 +642,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockList">
 <li class="blockList">
 <h4>getStateId</h4>
-<pre>protected&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/ModifyPeerProcedure.html#line.265">getStateId</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.PeerModificationState&nbsp;state)</pre>
+<pre>protected&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/ModifyPeerProcedure.html#line.259">getStateId</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.PeerModificationState&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>
@@ -661,7 +661,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getInitialState</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.PeerModificationState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/ModifyPeerProcedure.html#line.270">getInitialState</a>()</pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.PeerModificationState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/ModifyPeerProcedure.html#line.264">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>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/replication/RecoverStandbyProcedure.html b/devapidocs/org/apache/hadoop/hbase/master/replication/RecoverStandbyProcedure.html
index eac0c95..4ec76b1 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/replication/RecoverStandbyProcedure.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/replication/RecoverStandbyProcedure.html
@@ -194,7 +194,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <!--   -->
 </a>
 <h3>Fields inherited from class&nbsp;org.apache.hadoop.hbase.master.replication.<a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html" title="class in org.apache.hadoop.hbase.master.replication">AbstractPeerNoLockProcedure</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#attempts">attempts</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#peerId">peerId</a></code></li>
+<code><a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#peerId">peerId</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="fields.inherited.from.class.org.apache.hadoop.hbase.procedure2.StateMachineProcedure">
@@ -305,7 +305,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.master.replication.<a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html" title="class in org.apache.hadoop.hbase.master.replication">AbstractPeerNoLockProcedure</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#getPeerId--">getPeerId</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#rollbackState-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-TState-">rollbackState</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#setTimeoutFailure-org.apache.hadoop.hbase.maste [...]
+<code><a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#getPeerId--">getPeerId</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#resetRetry--">resetRetry</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#rollbackState-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-TState-">rollbackState</a>, <a href="../../.. [...]
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.procedure2.StateMachineProcedure">
diff --git a/devapidocs/org/apache/hadoop/hbase/master/replication/RemovePeerProcedure.html b/devapidocs/org/apache/hadoop/hbase/master/replication/RemovePeerProcedure.html
index 4a742d1..d9be3bc 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/replication/RemovePeerProcedure.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/replication/RemovePeerProcedure.html
@@ -210,7 +210,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Mo
 <!--   -->
 </a>
 <h3>Fields inherited from class&nbsp;org.apache.hadoop.hbase.master.replication.<a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html" title="class in org.apache.hadoop.hbase.master.replication">AbstractPeerNoLockProcedure</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#attempts">attempts</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#peerId">peerId</a></code></li>
+<code><a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#peerId">peerId</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="fields.inherited.from.class.org.apache.hadoop.hbase.procedure2.StateMachineProcedure">
@@ -318,7 +318,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Mo
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.master.replication.<a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html" title="class in org.apache.hadoop.hbase.master.replication">AbstractPeerNoLockProcedure</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#getPeerId--">getPeerId</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#rollbackState-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-TState-">rollbackState</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#setTimeoutFailure-org.apache.hadoop.hbase.maste [...]
+<code><a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#getPeerId--">getPeerId</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#resetRetry--">resetRetry</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#rollbackState-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-TState-">rollbackState</a>, <a href="../../.. [...]
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.procedure2.StateMachineProcedure">
diff --git a/devapidocs/org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALProcedure.html b/devapidocs/org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALProcedure.html
index b35e6cb..d83c6b3 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALProcedure.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALProcedure.html
@@ -129,7 +129,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.Private
-public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALProcedure.html#line.41">SyncReplicationReplayWALProcedure</a>
+public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALProcedure.html#line.40">SyncReplicationReplayWALProcedure</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html" title="class in org.apache.hadoop.hbase.master.replication">AbstractPeerNoLockProcedure</a>&lt;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.SyncReplicationReplayWALState&gt;</pre>
 <div class="block">The procedure for replaying a set of remote wals. It will get an available region server and
  schedule a <a href="../../../../../../org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALRemoteProcedure.html" title="class in org.apache.hadoop.hbase.master.replication"><code>SyncReplicationReplayWALRemoteProcedure</code></a> to actually send the request to region
@@ -199,7 +199,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <!--   -->
 </a>
 <h3>Fields inherited from class&nbsp;org.apache.hadoop.hbase.master.replication.<a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html" title="class in org.apache.hadoop.hbase.master.replication">AbstractPeerNoLockProcedure</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#attempts">attempts</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#peerId">peerId</a></code></li>
+<code><a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#peerId">peerId</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="fields.inherited.from.class.org.apache.hadoop.hbase.procedure2.StateMachineProcedure">
@@ -313,7 +313,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.master.replication.<a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html" title="class in org.apache.hadoop.hbase.master.replication">AbstractPeerNoLockProcedure</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#getPeerId--">getPeerId</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#setTimeoutFailure-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">setTimeoutFailure</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#suspend-long-">suspend</a>, <a href="../../../ [...]
+<code><a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#getPeerId--">getPeerId</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#resetRetry--">resetRetry</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#setTimeoutFailure-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">setTimeoutFailure</a>, <a href="../../. [...]
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.procedure2.StateMachineProcedure">
@@ -356,7 +356,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockList">
 <li class="blockList">
 <h4>LOG</h4>
-<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALProcedure.html#line.44">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALProcedure.html#line.43">LOG</a></pre>
 </li>
 </ul>
 <a name="worker">
@@ -365,7 +365,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockList">
 <li class="blockList">
 <h4>worker</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/replication/SyncReplicationReplayWALProcedure.html#line.47">worker</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/replication/SyncReplicationReplayWALProcedure.html#line.46">worker</a></pre>
 </li>
 </ul>
 <a name="wals">
@@ -374,7 +374,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockListLast">
 <li class="blockList">
 <h4>wals</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALProcedure.html#line.49">wals</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALProcedure.html#line.48">wals</a></pre>
 </li>
 </ul>
 </li>
@@ -391,7 +391,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockList">
 <li class="blockList">
 <h4>SyncReplicationReplayWALProcedure</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALProcedure.html#line.51">SyncReplicationReplayWALProcedure</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALProcedure.html#line.50">SyncReplicationReplayWALProcedure</a>()</pre>
 </li>
 </ul>
 <a name="SyncReplicationReplayWALProcedure-java.lang.String-java.util.List-">
@@ -400,7 +400,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockListLast">
 <li class="blockList">
 <h4>SyncReplicationReplayWALProcedure</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALProcedure.html#line.54">SyncReplicationReplayWALProcedure</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;peerId,
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALProcedure.html#line.53">SyncReplicationReplayWALProcedure</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;peerId,
                                          <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;wals)</pre>
 </li>
 </ul>
@@ -418,7 +418,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockList">
 <li class="blockList">
 <h4>executeFromState</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2">StateMachineProcedure.Flow</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALProcedure.html#line.60">executeFromState</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.pr [...]
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2">StateMachineProcedure.Flow</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALProcedure.html#line.59">executeFromState</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.pr [...]
                                                       org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.SyncReplicationReplayWALState&nbsp;state)
                                                throws <a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureSuspendedException.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureSuspendedException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#executeFromState-TEnvironment-TState-">StateMachineProcedure</a></code></span></div>
@@ -441,7 +441,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockList">
 <li class="blockList">
 <h4>rollbackState</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALProcedure.html#line.97">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/replication/SyncReplicationReplayWALProcedure.html#line.95">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.SyncReplicationReplayWALState&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>
@@ -463,7 +463,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockList">
 <li class="blockList">
 <h4>getState</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.SyncReplicationReplayWALState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALProcedure.html#line.106">getState</a>(int&nbsp;state)</pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.SyncReplicationReplayWALState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALProcedure.html#line.104">getState</a>(int&nbsp;state)</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>
@@ -482,7 +482,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockList">
 <li class="blockList">
 <h4>getStateId</h4>
-<pre>protected&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALProcedure.html#line.111">getStateId</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.SyncReplicationReplayWALState&nbsp;state)</pre>
+<pre>protected&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALProcedure.html#line.109">getStateId</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.SyncReplicationReplayWALState&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>
@@ -501,7 +501,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockList">
 <li class="blockList">
 <h4>getInitialState</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.SyncReplicationReplayWALState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALProcedure.html#line.116">getInitialState</a>()</pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.SyncReplicationReplayWALState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALProcedure.html#line.114">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>
@@ -518,7 +518,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockList">
 <li class="blockList">
 <h4>serializeStateData</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALProcedure.html#line.121">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/replication/SyncReplicationReplayWALProcedure.html#line.119">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
@@ -540,7 +540,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockList">
 <li class="blockList">
 <h4>deserializeStateData</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALProcedure.html#line.132">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/replication/SyncReplicationReplayWALProcedure.html#line.130">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
@@ -561,7 +561,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockList">
 <li class="blockList">
 <h4>getPeerOperationType</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/PeerProcedureInterface.PeerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure">PeerProcedureInterface.PeerOperationType</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALProcedure.html#line.144">getPeerOperationType</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/PeerProcedureInterface.PeerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure">PeerProcedureInterface.PeerOperationType</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALProcedure.html#line.142">getPeerOperationType</a>()</pre>
 </li>
 </ul>
 <a name="afterReplay-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">
@@ -570,7 +570,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockListLast">
 <li class="blockList">
 <h4>afterReplay</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALProcedure.html#line.149">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/replication/SyncReplicationReplayWALProcedure.html#line.147">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/replication/TransitPeerSyncReplicationStateProcedure.html b/devapidocs/org/apache/hadoop/hbase/master/replication/TransitPeerSyncReplicationStateProcedure.html
index 30e0aa3..3638964 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/replication/TransitPeerSyncReplicationStateProcedure.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/replication/TransitPeerSyncReplicationStateProcedure.html
@@ -134,7 +134,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.Private
-public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/TransitPeerSyncReplicationStateProcedure.html#line.49">TransitPeerSyncReplicationStateProcedure</a>
+public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/TransitPeerSyncReplicationStateProcedure.html#line.48">TransitPeerSyncReplicationStateProcedure</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerProcedure.html" title="class in org.apache.hadoop.hbase.master.replication">AbstractPeerProcedure</a>&lt;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.PeerSyncReplicationStateTransitionState&gt;</pre>
 <div class="block">The procedure for transit current sync replication state for a synchronous replication peer.</div>
 </li>
@@ -217,7 +217,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <!--   -->
 </a>
 <h3>Fields inherited from class&nbsp;org.apache.hadoop.hbase.master.replication.<a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html" title="class in org.apache.hadoop.hbase.master.replication">AbstractPeerNoLockProcedure</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#attempts">attempts</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#peerId">peerId</a></code></li>
+<code><a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#peerId">peerId</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="fields.inherited.from.class.org.apache.hadoop.hbase.procedure2.StateMachineProcedure">
@@ -364,7 +364,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.master.replication.<a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html" title="class in org.apache.hadoop.hbase.master.replication">AbstractPeerNoLockProcedure</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#getPeerId--">getPeerId</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#rollbackState-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-TState-">rollbackState</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#setTimeoutFailure-org.apache.hadoop.hbase.maste [...]
+<code><a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#getPeerId--">getPeerId</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#resetRetry--">resetRetry</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#rollbackState-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-TState-">rollbackState</a>, <a href="../../.. [...]
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.procedure2.StateMachineProcedure">
@@ -414,7 +414,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockList">
 <li class="blockList">
 <h4>LOG</h4>
-<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/TransitPeerSyncReplicationStateProcedure.html#line.52">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/TransitPeerSyncReplicationStateProcedure.html#line.51">LOG</a></pre>
 </li>
 </ul>
 <a name="fromState">
@@ -423,7 +423,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockList">
 <li class="blockList">
 <h4>fromState</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/replication/SyncReplicationState.html" title="enum in org.apache.hadoop.hbase.replication">SyncReplicationState</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/TransitPeerSyncReplicationStateProcedure.html#line.55">fromState</a></pre>
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/replication/SyncReplicationState.html" title="enum in org.apache.hadoop.hbase.replication">SyncReplicationState</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/TransitPeerSyncReplicationStateProcedure.html#line.54">fromState</a></pre>
 </li>
 </ul>
 <a name="toState">
@@ -432,7 +432,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockList">
 <li class="blockList">
 <h4>toState</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/replication/SyncReplicationState.html" title="enum in org.apache.hadoop.hbase.replication">SyncReplicationState</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/TransitPeerSyncReplicationStateProcedure.html#line.57">toState</a></pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/replication/SyncReplicationState.html" title="enum in org.apache.hadoop.hbase.replication">SyncReplicationState</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/TransitPeerSyncReplicationStateProcedure.html#line.56">toState</a></pre>
 </li>
 </ul>
 <a name="enabled">
@@ -441,7 +441,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockList">
 <li class="blockList">
 <h4>enabled</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/TransitPeerSyncReplicationStateProcedure.html#line.59">enabled</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/TransitPeerSyncReplicationStateProcedure.html#line.58">enabled</a></pre>
 </li>
 </ul>
 <a name="serial">
@@ -450,7 +450,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockListLast">
 <li class="blockList">
 <h4>serial</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/TransitPeerSyncReplicationStateProcedure.html#line.61">serial</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/TransitPeerSyncReplicationStateProcedure.html#line.60">serial</a></pre>
 </li>
 </ul>
 </li>
@@ -467,7 +467,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockList">
 <li class="blockList">
 <h4>TransitPeerSyncReplicationStateProcedure</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/TransitPeerSyncReplicationStateProcedure.html#line.63">TransitPeerSyncReplicationStateProcedure</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/TransitPeerSyncReplicationStateProcedure.html#line.62">TransitPeerSyncReplicationStateProcedure</a>()</pre>
 </li>
 </ul>
 <a name="TransitPeerSyncReplicationStateProcedure-java.lang.String-org.apache.hadoop.hbase.replication.SyncReplicationState-">
@@ -476,7 +476,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TransitPeerSyncReplicationStateProcedure</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/TransitPeerSyncReplicationStateProcedure.html#line.66">TransitPeerSyncReplicationStateProcedure</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;peerId,
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/TransitPeerSyncReplicationStateProcedure.html#line.65">TransitPeerSyncReplicationStateProcedure</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;peerId,
                                                 <a href="../../../../../../org/apache/hadoop/hbase/replication/SyncReplicationState.html" title="enum in org.apache.hadoop.hbase.replication">SyncReplicationState</a>&nbsp;state)</pre>
 </li>
 </ul>
@@ -494,7 +494,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockList">
 <li class="blockList">
 <h4>getPeerOperationType</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/PeerProcedureInterface.PeerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure">PeerProcedureInterface.PeerOperationType</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/TransitPeerSyncReplicationStateProcedure.html#line.72">getPeerOperationType</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/PeerProcedureInterface.PeerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure">PeerProcedureInterface.PeerOperationType</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/TransitPeerSyncReplicationStateProcedure.html#line.71">getPeerOperationType</a>()</pre>
 </li>
 </ul>
 <a name="serializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">
@@ -503,7 +503,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockList">
 <li class="blockList">
 <h4>serializeStateData</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/TransitPeerSyncReplicationStateProcedure.html#line.77">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/replication/TransitPeerSyncReplicationStateProcedure.html#line.76">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
@@ -525,7 +525,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockList">
 <li class="blockList">
 <h4>deserializeStateData</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/TransitPeerSyncReplicationStateProcedure.html#line.89">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/replication/TransitPeerSyncReplicationStateProcedure.html#line.88">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
@@ -546,7 +546,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockList">
 <li class="blockList">
 <h4>getState</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.PeerSyncReplicationStateTransitionState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/TransitPeerSyncReplicationStateProcedure.html#line.100">getState</a>(int&nbsp;stateId)</pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.PeerSyncReplicationStateTransitionState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/TransitPeerSyncReplicationStateProcedure.html#line.99">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>
@@ -565,7 +565,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockList">
 <li class="blockList">
 <h4>getStateId</h4>
-<pre>protected&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/TransitPeerSyncReplicationStateProcedure.html#line.105">getStateId</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.PeerSyncReplicationStateTransitionState&nbsp;state)</pre>
+<pre>protected&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/TransitPeerSyncReplicationStateProcedure.html#line.104">getStateId</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.PeerSyncReplicationStateTransitionState&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>
@@ -584,7 +584,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockList">
 <li class="blockList">
 <h4>getInitialState</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.PeerSyncReplicationStateTransitionState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/TransitPeerSyncReplicationStateProcedure.html#line.110">getInitialState</a>()</pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.PeerSyncReplicationStateTransitionState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/TransitPeerSyncReplicationStateProcedure.html#line.109">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>
@@ -601,7 +601,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockList">
 <li class="blockList">
 <h4>preTransit</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/TransitPeerSyncReplicationStateProcedure.html#line.115">preTransit</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/replication/TransitPeerSyncReplicationStateProcedure.html#line.114">preTransit</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)
                    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>
@@ -615,7 +615,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockList">
 <li class="blockList">
 <h4>postTransit</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/TransitPeerSyncReplicationStateProcedure.html#line.137">postTransit</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/replication/TransitPeerSyncReplicationStateProcedure.html#line.136">postTransit</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)
                   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>
@@ -629,7 +629,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockList">
 <li class="blockList">
 <h4>reopenRegions</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/TransitPeerSyncReplicationStateProcedure.html#line.149">reopenRegions</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/replication/TransitPeerSyncReplicationStateProcedure.html#line.148">reopenRegions</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="createDirForRemoteWAL-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">
@@ -638,7 +638,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockList">
 <li class="blockList">
 <h4>createDirForRemoteWAL</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/TransitPeerSyncReplicationStateProcedure.html#line.156">createDirForRemoteWAL</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/replication/TransitPeerSyncReplicationStateProcedure.html#line.155">createDirForRemoteWAL</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)
                               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>
@@ -652,7 +652,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockList">
 <li class="blockList">
 <h4>setNextStateAfterRefreshBegin</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/TransitPeerSyncReplicationStateProcedure.html#line.169">setNextStateAfterRefreshBegin</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/TransitPeerSyncReplicationStateProcedure.html#line.168">setNextStateAfterRefreshBegin</a>()</pre>
 </li>
 </ul>
 <a name="setNextStateAfterRefreshEnd--">
@@ -661,7 +661,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockList">
 <li class="blockList">
 <h4>setNextStateAfterRefreshEnd</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/TransitPeerSyncReplicationStateProcedure.html#line.188">setNextStateAfterRefreshEnd</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/TransitPeerSyncReplicationStateProcedure.html#line.187">setNextStateAfterRefreshEnd</a>()</pre>
 </li>
 </ul>
 <a name="replayRemoteWAL-boolean-">
@@ -670,7 +670,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockList">
 <li class="blockList">
 <h4>replayRemoteWAL</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/TransitPeerSyncReplicationStateProcedure.html#line.204">replayRemoteWAL</a>(boolean&nbsp;serial)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/TransitPeerSyncReplicationStateProcedure.html#line.203">replayRemoteWAL</a>(boolean&nbsp;serial)</pre>
 </li>
 </ul>
 <a name="setPeerNewSyncReplicationState-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">
@@ -679,7 +679,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockList">
 <li class="blockList">
 <h4>setPeerNewSyncReplicationState</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/TransitPeerSyncReplicationStateProcedure.html#line.209">setPeerNewSyncReplicationState</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/replication/TransitPeerSyncReplicationStateProcedure.html#line.208">setPeerNewSyncReplicationState</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)
                                        throws <a href="../../../../../../org/apache/hadoop/hbase/replication/ReplicationException.html" title="class in org.apache.hadoop.hbase.replication">ReplicationException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -693,7 +693,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockList">
 <li class="blockList">
 <h4>removeAllReplicationQueues</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/TransitPeerSyncReplicationStateProcedure.html#line.228">removeAllReplicationQueues</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/replication/TransitPeerSyncReplicationStateProcedure.html#line.227">removeAllReplicationQueues</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)
                                    throws <a href="../../../../../../org/apache/hadoop/hbase/replication/ReplicationException.html" title="class in org.apache.hadoop.hbase.replication">ReplicationException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -707,7 +707,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockList">
 <li class="blockList">
 <h4>transitPeerSyncReplicationState</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/TransitPeerSyncReplicationStateProcedure.html#line.233">transitPeerSyncReplicationState</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/replication/TransitPeerSyncReplicationStateProcedure.html#line.232">transitPeerSyncReplicationState</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)
                                         throws <a href="../../../../../../org/apache/hadoop/hbase/replication/ReplicationException.html" title="class in org.apache.hadoop.hbase.replication">ReplicationException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -721,7 +721,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Ab
 <ul class="blockListLast">
 <li class="blockList">
 <h4>executeFromState</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2">StateMachineProcedure.Flow</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/TransitPeerSyncReplicationStateProcedure.html#line.239">executeFromState</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.m [...]
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2">StateMachineProcedure.Flow</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/TransitPeerSyncReplicationStateProcedure.html#line.238">executeFromState</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.m [...]
                                                       org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.PeerSyncReplicationStateTransitionState&nbsp;state)
                                                throws <a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureSuspendedException.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureSuspendedException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#executeFromState-TEnvironment-TState-">StateMachineProcedure</a></code></span></div>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/replication/UpdatePeerConfigProcedure.html b/devapidocs/org/apache/hadoop/hbase/master/replication/UpdatePeerConfigProcedure.html
index e5fe0c3..c406963 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/replication/UpdatePeerConfigProcedure.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/replication/UpdatePeerConfigProcedure.html
@@ -218,7 +218,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Mo
 <!--   -->
 </a>
 <h3>Fields inherited from class&nbsp;org.apache.hadoop.hbase.master.replication.<a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html" title="class in org.apache.hadoop.hbase.master.replication">AbstractPeerNoLockProcedure</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#attempts">attempts</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#peerId">peerId</a></code></li>
+<code><a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#peerId">peerId</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="fields.inherited.from.class.org.apache.hadoop.hbase.procedure2.StateMachineProcedure">
@@ -354,7 +354,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/replication/Mo
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.master.replication.<a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html" title="class in org.apache.hadoop.hbase.master.replication">AbstractPeerNoLockProcedure</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#getPeerId--">getPeerId</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#rollbackState-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-TState-">rollbackState</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#setTimeoutFailure-org.apache.hadoop.hbase.maste [...]
+<code><a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#getPeerId--">getPeerId</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#resetRetry--">resetRetry</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#rollbackState-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-TState-">rollbackState</a>, <a href="../../.. [...]
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.procedure2.StateMachineProcedure">
diff --git a/devapidocs/org/apache/hadoop/hbase/package-tree.html b/devapidocs/org/apache/hadoop/hbase/package-tree.html
index 15f3ffc..ba44e48 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/CompareOperator.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompareOperator</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Coprocessor.State.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Coprocessor.State</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/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/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MetaTableAccessor.QueryType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Size.Unit.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Size.Unit</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/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/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/MemoryCompactionPolicy.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MemoryCompactionPolicy</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HealthChecker.HealthCheckerExitStatus.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HealthChecker.HealthCheckerExitStatus</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/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/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/HConstants.OperationStatusCode.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HConstants.OperationStatusCode</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/KeepDeletedCells.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeepDeletedCells</span></a></li>
 <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/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/Cell.Type.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Cell.Type</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CompatibilitySingletonFactory.SingletonStorage.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompatibilitySingletonFactory.SingletonStorage</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/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/KeepDeletedCells.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeepDeletedCells</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CompareOperator.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompareOperator</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureUtil.CompatStateSerializer.html b/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureUtil.CompatStateSerializer.html
index a0b55b9..dd937a9 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureUtil.CompatStateSerializer.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureUtil.CompatStateSerializer.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#line.131">ProcedureUtil.CompatStateSerializer</a>
+<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#line.135">ProcedureUtil.CompatStateSerializer</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
 implements <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a></pre>
 <div class="block">A serializer (deserializer) for those Procedures which were serialized
@@ -212,7 +212,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureS
 <ul class="blockListLast">
 <li class="blockList">
 <h4>inputStream</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/io/InputStream.html?is-external=true" title="class or interface in java.io">InputStream</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.CompatStateSerializer.html#line.132">inputStream</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/io/InputStream.html?is-external=true" title="class or interface in java.io">InputStream</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.CompatStateSerializer.html#line.136">inputStream</a></pre>
 </li>
 </ul>
 </li>
@@ -229,7 +229,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureS
 <ul class="blockListLast">
 <li class="blockList">
 <h4>CompatStateSerializer</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.CompatStateSerializer.html#line.134">CompatStateSerializer</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/io/InputStream.html?is-external=true" title="class or interface in java.io">InputStream</a>&nbsp;inputStream)</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.CompatStateSerializer.html#line.138">CompatStateSerializer</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/io/InputStream.html?is-external=true" title="class or interface in java.io">InputStream</a>&nbsp;inputStream)</pre>
 </li>
 </ul>
 </li>
@@ -246,7 +246,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureS
 <ul class="blockList">
 <li class="blockList">
 <h4>serialize</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.CompatStateSerializer.html#line.139">serialize</a>(org.apache.hbase.thirdparty.com.google.protobuf.Message&nbsp;message)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.CompatStateSerializer.html#line.143">serialize</a>(org.apache.hbase.thirdparty.com.google.protobuf.Message&nbsp;message)
                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>
@@ -262,7 +262,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureS
 <ul class="blockListLast">
 <li class="blockList">
 <h4>deserialize</h4>
-<pre>public&nbsp;&lt;M extends org.apache.hbase.thirdparty.com.google.protobuf.Message&gt;&nbsp;M&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.CompatStateSerializer.html#line.145">deserialize</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;M&gt;&nbsp;clazz)
+<pre>public&nbsp;&lt;M extends org.apache.hbase.thirdparty.com.google.protobuf.Message&gt;&nbsp;M&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.CompatStateSerializer.html#line.149">deserialize</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;M&gt;&nbsp;clazz)
                                                                                   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>
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureUtil.StateSerializer.html b/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureUtil.StateSerializer.html
index d26e855..7f06bee 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureUtil.StateSerializer.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureUtil.StateSerializer.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#line.97">ProcedureUtil.StateSerializer</a>
+<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#line.101">ProcedureUtil.StateSerializer</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
 implements <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a></pre>
 <div class="block">A serializer for our Procedures. Instead of the previous serializer, it
@@ -216,7 +216,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureS
 <ul class="blockList">
 <li class="blockList">
 <h4>builder</h4>
-<pre>private final&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.Procedure.Builder <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.StateSerializer.html#line.98">builder</a></pre>
+<pre>private final&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.Procedure.Builder <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.StateSerializer.html#line.102">builder</a></pre>
 </li>
 </ul>
 <a name="deserializeIndex">
@@ -225,7 +225,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureS
 <ul class="blockListLast">
 <li class="blockList">
 <h4>deserializeIndex</h4>
-<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.StateSerializer.html#line.99">deserializeIndex</a></pre>
+<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.StateSerializer.html#line.103">deserializeIndex</a></pre>
 </li>
 </ul>
 </li>
@@ -242,7 +242,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureS
 <ul class="blockListLast">
 <li class="blockList">
 <h4>StateSerializer</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.StateSerializer.html#line.101">StateSerializer</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.Procedure.Builder&nbsp;builder)</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.StateSerializer.html#line.105">StateSerializer</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.Procedure.Builder&nbsp;builder)</pre>
 </li>
 </ul>
 </li>
@@ -259,7 +259,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureS
 <ul class="blockList">
 <li class="blockList">
 <h4>serialize</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.StateSerializer.html#line.106">serialize</a>(org.apache.hbase.thirdparty.com.google.protobuf.Message&nbsp;message)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.StateSerializer.html#line.110">serialize</a>(org.apache.hbase.thirdparty.com.google.protobuf.Message&nbsp;message)
                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>
@@ -275,7 +275,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureS
 <ul class="blockListLast">
 <li class="blockList">
 <h4>deserialize</h4>
-<pre>public&nbsp;&lt;M extends org.apache.hbase.thirdparty.com.google.protobuf.Message&gt;&nbsp;M&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.StateSerializer.html#line.112">deserialize</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;M&gt;&nbsp;clazz)
+<pre>public&nbsp;&lt;M extends org.apache.hbase.thirdparty.com.google.protobuf.Message&gt;&nbsp;M&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.StateSerializer.html#line.116">deserialize</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;M&gt;&nbsp;clazz)
                                                                                   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>
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html b/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html
index 774f521..8be1989 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html
@@ -75,13 +75,13 @@ var activeTableTab = "activeTableTab";
 <ul class="subNavList">
 <li>Summary:&nbsp;</li>
 <li><a href="#nested.class.summary">Nested</a>&nbsp;|&nbsp;</li>
-<li>Field&nbsp;|&nbsp;</li>
+<li><a href="#field.summary">Field</a>&nbsp;|&nbsp;</li>
 <li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
 <li><a href="#method.summary">Method</a></li>
 </ul>
 <ul class="subNavList">
 <li>Detail:&nbsp;</li>
-<li>Field&nbsp;|&nbsp;</li>
+<li><a href="#field.detail">Field</a>&nbsp;|&nbsp;</li>
 <li><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
 <li><a href="#method.detail">Method</a></li>
 </ul>
@@ -110,7 +110,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.Private
-public final class <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#line.44">ProcedureUtil</a>
+public final class <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#line.48">ProcedureUtil</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>
 <div class="block">Helper to convert to/from ProcedureProtos</div>
 </li>
@@ -147,6 +147,37 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </table>
 </li>
 </ul>
+<!-- =========== FIELD SUMMARY =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="field.summary">
+<!--   -->
+</a>
+<h3>Field Summary</h3>
+<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Field Summary table, listing fields, and an explanation">
+<caption><span>Fields</span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th class="colLast" scope="col">Field and Description</th>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>static long</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#DEFAULT_PROCEDURE_RETRY_MAX_SLEEP_TIME_MS">DEFAULT_PROCEDURE_RETRY_MAX_SLEEP_TIME_MS</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>static long</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#DEFAULT_PROCEDURE_RETRY_SLEEP_INTERVAL_MS">DEFAULT_PROCEDURE_RETRY_SLEEP_INTERVAL_MS</a></span></code>&nbsp;</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#PROCEDURE_RETRY_MAX_SLEEP_TIME_MS">PROCEDURE_RETRY_MAX_SLEEP_TIME_MS</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#PROCEDURE_RETRY_SLEEP_INTERVAL_MS">PROCEDURE_RETRY_SLEEP_INTERVAL_MS</a></span></code>&nbsp;</td>
+</tr>
+</table>
+</li>
+</ul>
 <!-- ======== CONSTRUCTOR SUMMARY ======== -->
 <ul class="blockList">
 <li class="blockList"><a name="constructor.summary">
@@ -203,9 +234,9 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#convertToProtoResourceType-org.apache.hadoop.hbase.procedure2.LockedResourceType-">convertToProtoResourceType</a></span>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/LockedResourceType.html" title="enum in org.apache.hadoop.hbase.procedure2">LockedResourceType</a>&nbsp;resourceType)</code>&nbsp;</td>
 </tr>
 <tr id="i5" class="rowColor">
-<td class="colFirst"><code>static long</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#getBackoffTimeMs-int-">getBackoffTimeMs</a></span>(int&nbsp;attempts)</code>
-<div class="block">Get an exponential backoff time, in milliseconds.</div>
+<td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/util/RetryCounter.html" title="class in org.apache.hadoop.hbase.util">RetryCounter</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#createRetryCounter-org.apache.hadoop.conf.Configuration-">createRetryCounter</a></span>(org.apache.hadoop.conf.Configuration&nbsp;conf)</code>
+<div class="block">Get a retry counter for getting the backoff time.</div>
 </td>
 </tr>
 <tr id="i6" class="altColor">
@@ -232,6 +263,62 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <div class="details">
 <ul class="blockList">
 <li class="blockList">
+<!-- ============ FIELD DETAIL =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="field.detail">
+<!--   -->
+</a>
+<h3>Field Detail</h3>
+<a name="PROCEDURE_RETRY_SLEEP_INTERVAL_MS">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>PROCEDURE_RETRY_SLEEP_INTERVAL_MS</h4>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#line.342">PROCEDURE_RETRY_SLEEP_INTERVAL_MS</a></pre>
+<dl>
+<dt><span class="seeLabel">See Also:</span></dt>
+<dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.procedure2.ProcedureUtil.PROCEDURE_RETRY_SLEEP_INTERVAL_MS">Constant Field Values</a></dd>
+</dl>
+</li>
+</ul>
+<a name="DEFAULT_PROCEDURE_RETRY_SLEEP_INTERVAL_MS">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>DEFAULT_PROCEDURE_RETRY_SLEEP_INTERVAL_MS</h4>
+<pre>public static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#line.346">DEFAULT_PROCEDURE_RETRY_SLEEP_INTERVAL_MS</a></pre>
+<dl>
+<dt><span class="seeLabel">See Also:</span></dt>
+<dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.procedure2.ProcedureUtil.DEFAULT_PROCEDURE_RETRY_SLEEP_INTERVAL_MS">Constant Field Values</a></dd>
+</dl>
+</li>
+</ul>
+<a name="PROCEDURE_RETRY_MAX_SLEEP_TIME_MS">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>PROCEDURE_RETRY_MAX_SLEEP_TIME_MS</h4>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#line.348">PROCEDURE_RETRY_MAX_SLEEP_TIME_MS</a></pre>
+<dl>
+<dt><span class="seeLabel">See Also:</span></dt>
+<dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.procedure2.ProcedureUtil.PROCEDURE_RETRY_MAX_SLEEP_TIME_MS">Constant Field Values</a></dd>
+</dl>
+</li>
+</ul>
+<a name="DEFAULT_PROCEDURE_RETRY_MAX_SLEEP_TIME_MS">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>DEFAULT_PROCEDURE_RETRY_MAX_SLEEP_TIME_MS</h4>
+<pre>public static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#line.352">DEFAULT_PROCEDURE_RETRY_MAX_SLEEP_TIME_MS</a></pre>
+</li>
+</ul>
+</li>
+</ul>
 <!-- ========= CONSTRUCTOR DETAIL ======== -->
 <ul class="blockList">
 <li class="blockList"><a name="constructor.detail">
@@ -244,7 +331,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>ProcedureUtil</h4>
-<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#line.45">ProcedureUtil</a>()</pre>
+<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#line.49">ProcedureUtil</a>()</pre>
 </li>
 </ul>
 </li>
@@ -261,7 +348,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>newProcedure</h4>
-<pre>private static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#line.50">newProcedure</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;className)
+<pre>private static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#line.54">newProcedure</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;className)
                                   throws <a href="../../../../../org/apache/hadoop/hbase/procedure2/BadProcedureException.html" title="class in org.apache.hadoop.hbase.procedure2">BadProcedureException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -275,7 +362,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>validateClass</h4>
-<pre>static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#line.71">validateClass</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>static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#line.75">validateClass</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;proc)
                    throws <a href="../../../../../org/apache/hadoop/hbase/procedure2/BadProcedureException.html" title="class in org.apache.hadoop.hbase.procedure2">BadProcedureException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -289,7 +376,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>convertToProtoProcedure</h4>
-<pre>public static&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.Procedure&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#line.161">convertToProtoProcedure</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 static&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.Procedure&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#line.165">convertToProtoProcedure</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;proc)
                                                                                                            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">Helper to convert the procedure to protobuf.
  <p/>
@@ -306,7 +393,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>convertToProcedure</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#line.230">convertToProcedure</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.Procedure&nbsp;proto)
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#line.234">convertToProcedure</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.Procedure&nbsp;proto)
                                        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">Helper to convert the protobuf procedure.
  <p/>
@@ -327,7 +414,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>convertToProtoResourceType</h4>
-<pre>public static&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.LockServiceProtos.LockedResourceType&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#line.300">convertToProtoResourceType</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/LockedResourceType.html" title="enum in org.apache.hadoop.hbase.procedure2">LockedResourceType</a>&nbsp;resourceType)</pre>
+<pre>public static&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.LockServiceProtos.LockedResourceType&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#line.304">convertToProtoResourceType</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/LockedResourceType.html" title="enum in org.apache.hadoop.hbase.procedure2">LockedResourceType</a>&nbsp;resourceType)</pre>
 </li>
 </ul>
 <a name="convertToProtoLockType-org.apache.hadoop.hbase.procedure2.LockType-">
@@ -336,7 +423,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>convertToProtoLockType</h4>
-<pre>public static&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.LockServiceProtos.LockType&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#line.305">convertToProtoLockType</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/LockType.html" title="enum in org.apache.hadoop.hbase.procedure2">LockType</a>&nbsp;lockType)</pre>
+<pre>public static&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.LockServiceProtos.LockType&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#line.309">convertToProtoLockType</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/LockType.html" title="enum in org.apache.hadoop.hbase.procedure2">LockType</a>&nbsp;lockType)</pre>
 </li>
 </ul>
 <a name="convertToProtoLockedResource-org.apache.hadoop.hbase.procedure2.LockedResource-">
@@ -345,7 +432,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>convertToProtoLockedResource</h4>
-<pre>public static&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.LockServiceProtos.LockedResource&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#line.309">convertToProtoLockedResource</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/LockedResource.html" title="class in org.apache.hadoop.hbase.procedure2">LockedResource</a>&nbsp;lockedResource)
+<pre>public static&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.LockServiceProtos.LockedResource&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#line.313">convertToProtoLockedResource</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/LockedResource.html" title="class in org.apache.hadoop.hbase.procedure2">LockedResource</a>&nbsp;lockedResource)
                                                                                                                        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>
@@ -353,16 +440,20 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </dl>
 </li>
 </ul>
-<a name="getBackoffTimeMs-int-">
+<a name="createRetryCounter-org.apache.hadoop.conf.Configuration-">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
-<h4>getBackoffTimeMs</h4>
-<pre>public static&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#line.343">getBackoffTimeMs</a>(int&nbsp;attempts)</pre>
-<div class="block">Get an exponential backoff time, in milliseconds. The base unit is 1 second, and the max
- backoff time is 10 minutes. This is the general backoff policy for most procedure
- implementation.</div>
+<h4>createRetryCounter</h4>
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/RetryCounter.html" title="class in org.apache.hadoop.hbase.util">RetryCounter</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#line.364">createRetryCounter</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<div class="block">Get a retry counter for getting the backoff time. We will use the
+ <a href="../../../../../org/apache/hadoop/hbase/util/RetryCounter.ExponentialBackoffPolicyWithLimit.html" title="class in org.apache.hadoop.hbase.util"><code>RetryCounter.ExponentialBackoffPolicyWithLimit</code></a> policy, and the base unit is 1 second, max sleep time
+ is 10 minutes by default.
+ <p/>
+ For UTs, you can set the <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#PROCEDURE_RETRY_SLEEP_INTERVAL_MS"><code>PROCEDURE_RETRY_SLEEP_INTERVAL_MS</code></a> and
+ <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#PROCEDURE_RETRY_MAX_SLEEP_TIME_MS"><code>PROCEDURE_RETRY_MAX_SLEEP_TIME_MS</code></a> to make more frequent retry so your UT will not
+ timeout.</div>
 </li>
 </ul>
 </li>
@@ -419,13 +510,13 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="subNavList">
 <li>Summary:&nbsp;</li>
 <li><a href="#nested.class.summary">Nested</a>&nbsp;|&nbsp;</li>
-<li>Field&nbsp;|&nbsp;</li>
+<li><a href="#field.summary">Field</a>&nbsp;|&nbsp;</li>
 <li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
 <li><a href="#method.summary">Method</a></li>
 </ul>
 <ul class="subNavList">
 <li>Detail:&nbsp;</li>
-<li>Field&nbsp;|&nbsp;</li>
+<li><a href="#field.detail">Field</a>&nbsp;|&nbsp;</li>
 <li><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
 <li><a href="#method.detail">Method</a></li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/class-use/ProcedureSuspendedException.html b/devapidocs/org/apache/hadoop/hbase/procedure2/class-use/ProcedureSuspendedException.html
index 663549f..dc5ee17 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/class-use/ProcedureSuspendedException.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/class-use/ProcedureSuspendedException.html
@@ -224,19 +224,6 @@
 </a>
 <h3>Uses of <a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureSuspendedException.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureSuspendedException</a> in <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/package-summary.html">org.apache.hadoop.hbase.master.procedure</a></h3>
 <table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="Use table, listing methods, and an explanation">
-<caption><span>Methods in <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/package-summary.html">org.apache.hadoop.hbase.master.procedure</a> that return <a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureSuspendedException.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureSuspendedException</a></span><span class="tabEnd">&nbsp;</span></caption>
-<tr>
-<th class="colFirst" scope="col">Modifier and Type</th>
-<th class="colLast" scope="col">Method and Description</th>
-</tr>
-<tbody>
-<tr class="altColor">
-<td class="colFirst"><code>protected <a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureSuspendedException.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureSuspendedException</a></code></td>
-<td class="colLast"><span class="typeNameLabel">SplitWALProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html#suspend-long-">suspend</a></span>(long&nbsp;backoff)</code>&nbsp;</td>
-</tr>
-</tbody>
-</table>
-<table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="Use table, listing methods, and an explanation">
 <caption><span>Methods in <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/package-summary.html">org.apache.hadoop.hbase.master.procedure</a> that throw <a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureSuspendedException.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureSuspendedException</a></span><span class="tabEnd">&nbsp;</span></caption>
 <tr>
 <th class="colFirst" scope="col">Modifier and Type</th>
@@ -279,10 +266,6 @@
 <td class="colLast"><span class="typeNameLabel">SwitchRpcThrottleProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html#executeFromState-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.SwitchRpcThrottleState-">executeFromState</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Maste [...]
                 org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.SwitchRpcThrottleState&nbsp;state)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
-<td class="colFirst"><code>protected <a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureSuspendedException.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureSuspendedException</a></code></td>
-<td class="colLast"><span class="typeNameLabel">SplitWALProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html#suspend-long-">suspend</a></span>(long&nbsp;backoff)</code>&nbsp;</td>
-</tr>
 </tbody>
 </table>
 </li>
@@ -299,7 +282,8 @@
 <tbody>
 <tr class="altColor">
 <td class="colFirst"><code>protected <a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureSuspendedException.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureSuspendedException</a></code></td>
-<td class="colLast"><span class="typeNameLabel">AbstractPeerNoLockProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#suspend-long-">suspend</a></span>(long&nbsp;backoff)</code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">AbstractPeerNoLockProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#suspend-org.apache.hadoop.conf.Configuration-java.util.function.LongConsumer-">suspend</a></span>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+       <a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/LongConsumer.html?is-external=true" title="class or interface in java.util.function">LongConsumer</a>&nbsp;backoffConsumer)</code>&nbsp;</td>
 </tr>
 </tbody>
 </table>
@@ -339,7 +323,8 @@
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>protected <a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureSuspendedException.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureSuspendedException</a></code></td>
-<td class="colLast"><span class="typeNameLabel">AbstractPeerNoLockProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#suspend-long-">suspend</a></span>(long&nbsp;backoff)</code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">AbstractPeerNoLockProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#suspend-org.apache.hadoop.conf.Configuration-java.util.function.LongConsumer-">suspend</a></span>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+       <a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/LongConsumer.html?is-external=true" title="class or interface in java.util.function">LongConsumer</a>&nbsp;backoffConsumer)</code>&nbsp;</td>
 </tr>
 </tbody>
 </table>
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html b/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
index 6805800..bd9476c 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
@@ -218,9 +218,9 @@
 <ul>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.LockState.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">Procedure.LockState</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/LockedResourceType.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">LockedResourceType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/RootProcedureState.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">RootProcedureState.State</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">StateMachineProcedure.Flow</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/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>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/quotas/class-use/RpcThrottleStorage.html b/devapidocs/org/apache/hadoop/hbase/quotas/class-use/RpcThrottleStorage.html
index 8063654..c818943 100644
--- a/devapidocs/org/apache/hadoop/hbase/quotas/class-use/RpcThrottleStorage.html
+++ b/devapidocs/org/apache/hadoop/hbase/quotas/class-use/RpcThrottleStorage.html
@@ -107,7 +107,7 @@
 </tr>
 <tbody>
 <tr class="altColor">
-<td class="colFirst"><code>(package private) <a href="../../../../../../org/apache/hadoop/hbase/quotas/RpcThrottleStorage.html" title="class in org.apache.hadoop.hbase.quotas">RpcThrottleStorage</a></code></td>
+<td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/quotas/RpcThrottleStorage.html" title="class in org.apache.hadoop.hbase.quotas">RpcThrottleStorage</a></code></td>
 <td class="colLast"><span class="typeNameLabel">SwitchRpcThrottleProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html#rpcThrottleStorage">rpcThrottleStorage</a></span></code>&nbsp;</td>
 </tr>
 </tbody>
diff --git a/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html b/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
index 2b89b54..8a70252 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/SpaceViolationPolicy.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">SpaceViolationPolicy</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/QuotaType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">QuotaType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/ThrottleType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">ThrottleType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/RpcThrottlingException.Type.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">RpcThrottlingException.Type</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/QuotaScope.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">QuotaScope</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/OperationQuota.OperationType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">OperationQuota.OperationType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/QuotaScope.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">QuotaScope</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/RpcThrottlingException.Type.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">RpcThrottlingException.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/QuotaType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">QuotaType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/SpaceViolationPolicy.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">SpaceViolationPolicy</span></a></li>
 </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 21441b3..b6b2e0f 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -715,20 +715,20 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DefaultHeapMemoryTuner.StepDirection.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">DefaultHeapMemoryTuner.StepDirection</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">FlushType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScanType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MemStoreCompactionStrategy.Action</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TimeRangeTracker.Type.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TimeRangeTracker.Type</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.LimitScope.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScannerContext.LimitScope</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/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/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MemStoreCompactionStrategy.Action</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/CompactingMemStore.IndexType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">CompactingMemStore.IndexType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/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/ChunkCreator.ChunkType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ChunkCreator.ChunkType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.NextState.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScannerContext.NextState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/CompactingMemStore.IndexType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">CompactingMemStore.IndexType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsRegionServerSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MetricsRegionServerSourceFactoryImpl.FactoryStorage</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/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/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>
+<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/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/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/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/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">FlushType</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 74ae4b0..45a338f 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/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/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/StripeCompactionScanQueryMatcher.DropDeletesInOutput.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">StripeCompactionScanQueryMatcher.DropDeletesInOutput</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.querymatcher.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/DeleteTracker.DeleteResult.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">DeleteTracker.DeleteResult</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
index dcee643..5ef6472 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
@@ -247,10 +247,10 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/WALActionsListener.RollRequestReason.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">WALActionsListener.RollRequestReason</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/ProtobufLogReader.WALHdrResult.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">ProtobufLogReader.WALHdrResult</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/CompressionContext.DictionaryIndex.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">CompressionContext.DictionaryIndex</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/RingBufferTruck.Type.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">RingBufferTruck.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/WALActionsListener.RollRequestReason.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">WALActionsListener.RollRequestReason</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/CompressionContext.DictionaryIndex.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">CompressionContext.DictionaryIndex</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/replication/package-tree.html b/devapidocs/org/apache/hadoop/hbase/replication/package-tree.html
index 02505ac..818a04c 100644
--- a/devapidocs/org/apache/hadoop/hbase/replication/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/replication/package-tree.html
@@ -162,8 +162,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.replication.<a href="../../../../../org/apache/hadoop/hbase/replication/ReplicationPeer.PeerState.html" title="enum in org.apache.hadoop.hbase.replication"><span class="typeNameLink">ReplicationPeer.PeerState</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.replication.<a href="../../../../../org/apache/hadoop/hbase/replication/SyncReplicationState.html" title="enum in org.apache.hadoop.hbase.replication"><span class="typeNameLink">SyncReplicationState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.replication.<a href="../../../../../org/apache/hadoop/hbase/replication/ReplicationPeer.PeerState.html" title="enum in org.apache.hadoop.hbase.replication"><span class="typeNameLink">ReplicationPeer.PeerState</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html b/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html
index 9a2ed16..19d2ff4 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/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>
+<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>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/rest/model/package-tree.html b/devapidocs/org/apache/hadoop/hbase/rest/model/package-tree.html
index 7d70035..3aa879d 100644
--- a/devapidocs/org/apache/hadoop/hbase/rest/model/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/rest/model/package-tree.html
@@ -110,8 +110,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.rest.model.<a href="../../../../../../org/apache/hadoop/hbase/rest/model/ScannerModel.FilterModel.ByteArrayComparableModel.ComparatorType.html" title="enum in org.apache.hadoop.hbase.rest.model"><span class="typeNameLink">ScannerModel.FilterModel.ByteArrayComparableModel.ComparatorType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.rest.model.<a href="../../../../../../org/apache/hadoop/hbase/rest/model/ScannerModel.FilterModel.FilterType.html" title="enum in org.apache.hadoop.hbase.rest.model"><span class="typeNameLink">ScannerModel.FilterModel.FilterType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.rest.model.<a href="../../../../../../org/apache/hadoop/hbase/rest/model/ScannerModel.FilterModel.ByteArrayComparableModel.ComparatorType.html" title="enum in org.apache.hadoop.hbase.rest.model"><span class="typeNameLink">ScannerModel.FilterModel.ByteArrayComparableModel.ComparatorType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html b/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
index 6c54bc9..7f67ffe 100644
--- a/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
@@ -143,10 +143,10 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/Permission.Action.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">Permission.Action</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/Permission.Scope.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">Permission.Scope</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">AccessController.OpType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessControlFilter.Strategy.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">AccessControlFilter.Strategy</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/Permission.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/Permission.Action.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">Permission.Action</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/security/package-tree.html b/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
index bd591e2..25eb637 100644
--- a/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
@@ -192,8 +192,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslStatus.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">SaslStatus</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslUtil.QualityOfProtection.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">SaslUtil.QualityOfProtection</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslStatus.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">SaslStatus</span></a></li>
 <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>
diff --git a/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html b/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
index 7edef14..47e3265 100644
--- a/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
@@ -208,8 +208,8 @@
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
 <li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/ImplType.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">ImplType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/ThriftMetrics.ThriftServerType.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">ThriftMetrics.ThriftServerType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/MetricsThriftServerSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">MetricsThriftServerSourceFactoryImpl.FactoryStorage</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/ThriftMetrics.ThriftServerType.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">ThriftMetrics.ThriftServerType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/util/class-use/RetryCounter.html b/devapidocs/org/apache/hadoop/hbase/util/class-use/RetryCounter.html
index 8b3e6cd..87d74c7 100644
--- a/devapidocs/org/apache/hadoop/hbase/util/class-use/RetryCounter.html
+++ b/devapidocs/org/apache/hadoop/hbase/util/class-use/RetryCounter.html
@@ -83,6 +83,22 @@
 </tr>
 <tbody>
 <tr class="altColor">
+<td class="colFirst"><a href="#org.apache.hadoop.hbase.master.assignment">org.apache.hadoop.hbase.master.assignment</a></td>
+<td class="colLast">&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><a href="#org.apache.hadoop.hbase.master.procedure">org.apache.hadoop.hbase.master.procedure</a></td>
+<td class="colLast">&nbsp;</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><a href="#org.apache.hadoop.hbase.master.replication">org.apache.hadoop.hbase.master.replication</a></td>
+<td class="colLast">&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><a href="#org.apache.hadoop.hbase.procedure2">org.apache.hadoop.hbase.procedure2</a></td>
+<td class="colLast">&nbsp;</td>
+</tr>
+<tr class="altColor">
 <td class="colFirst"><a href="#org.apache.hadoop.hbase.regionserver.handler">org.apache.hadoop.hbase.regionserver.handler</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
@@ -99,6 +115,96 @@
 </li>
 <li class="blockList">
 <ul class="blockList">
+<li class="blockList"><a name="org.apache.hadoop.hbase.master.assignment">
+<!--   -->
+</a>
+<h3>Uses of <a href="../../../../../../org/apache/hadoop/hbase/util/RetryCounter.html" title="class in org.apache.hadoop.hbase.util">RetryCounter</a> in <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/package-summary.html">org.apache.hadoop.hbase.master.assignment</a></h3>
+<table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="Use table, listing fields, and an explanation">
+<caption><span>Fields in <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/package-summary.html">org.apache.hadoop.hbase.master.assignment</a> declared as <a href="../../../../../../org/apache/hadoop/hbase/util/RetryCounter.html" title="class in org.apache.hadoop.hbase.util">RetryCounter</a></span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th class="colLast" scope="col">Field and Description</th>
+</tr>
+<tbody>
+<tr class="altColor">
+<td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/util/RetryCounter.html" title="class in org.apache.hadoop.hbase.util">RetryCounter</a></code></td>
+<td class="colLast"><span class="typeNameLabel">RegionRemoteProcedureBase.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html#retryCounter">retryCounter</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/util/RetryCounter.html" title="class in org.apache.hadoop.hbase.util">RetryCounter</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#retryCounter">retryCounter</a></span></code>&nbsp;</td>
+</tr>
+</tbody>
+</table>
+</li>
+<li class="blockList"><a name="org.apache.hadoop.hbase.master.procedure">
+<!--   -->
+</a>
+<h3>Uses of <a href="../../../../../../org/apache/hadoop/hbase/util/RetryCounter.html" title="class in org.apache.hadoop.hbase.util">RetryCounter</a> in <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/package-summary.html">org.apache.hadoop.hbase.master.procedure</a></h3>
+<table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="Use table, listing fields, and an explanation">
+<caption><span>Fields in <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/package-summary.html">org.apache.hadoop.hbase.master.procedure</a> declared as <a href="../../../../../../org/apache/hadoop/hbase/util/RetryCounter.html" title="class in org.apache.hadoop.hbase.util">RetryCounter</a></span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th class="colLast" scope="col">Field and Description</th>
+</tr>
+<tbody>
+<tr class="altColor">
+<td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/util/RetryCounter.html" title="class in org.apache.hadoop.hbase.util">RetryCounter</a></code></td>
+<td class="colLast"><span class="typeNameLabel">SplitWALProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html#retryCounter">retryCounter</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/util/RetryCounter.html" title="class in org.apache.hadoop.hbase.util">RetryCounter</a></code></td>
+<td class="colLast"><span class="typeNameLabel">InitMetaProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/InitMetaProcedure.html#retryCounter">retryCounter</a></span></code>&nbsp;</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/util/RetryCounter.html" title="class in org.apache.hadoop.hbase.util">RetryCounter</a></code></td>
+<td class="colLast"><span class="typeNameLabel">ReopenTableRegionsProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#retryCounter">retryCounter</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/util/RetryCounter.html" title="class in org.apache.hadoop.hbase.util">RetryCounter</a></code></td>
+<td class="colLast"><span class="typeNameLabel">SwitchRpcThrottleProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html#retryCounter">retryCounter</a></span></code>&nbsp;</td>
+</tr>
+</tbody>
+</table>
+</li>
+<li class="blockList"><a name="org.apache.hadoop.hbase.master.replication">
+<!--   -->
+</a>
+<h3>Uses of <a href="../../../../../../org/apache/hadoop/hbase/util/RetryCounter.html" title="class in org.apache.hadoop.hbase.util">RetryCounter</a> in <a href="../../../../../../org/apache/hadoop/hbase/master/replication/package-summary.html">org.apache.hadoop.hbase.master.replication</a></h3>
+<table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="Use table, listing fields, and an explanation">
+<caption><span>Fields in <a href="../../../../../../org/apache/hadoop/hbase/master/replication/package-summary.html">org.apache.hadoop.hbase.master.replication</a> declared as <a href="../../../../../../org/apache/hadoop/hbase/util/RetryCounter.html" title="class in org.apache.hadoop.hbase.util">RetryCounter</a></span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th class="colLast" scope="col">Field and Description</th>
+</tr>
+<tbody>
+<tr class="altColor">
+<td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/util/RetryCounter.html" title="class in org.apache.hadoop.hbase.util">RetryCounter</a></code></td>
+<td class="colLast"><span class="typeNameLabel">AbstractPeerNoLockProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html#retryCounter">retryCounter</a></span></code>&nbsp;</td>
+</tr>
+</tbody>
+</table>
+</li>
+<li class="blockList"><a name="org.apache.hadoop.hbase.procedure2">
+<!--   -->
+</a>
+<h3>Uses of <a href="../../../../../../org/apache/hadoop/hbase/util/RetryCounter.html" title="class in org.apache.hadoop.hbase.util">RetryCounter</a> in <a href="../../../../../../org/apache/hadoop/hbase/procedure2/package-summary.html">org.apache.hadoop.hbase.procedure2</a></h3>
+<table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="Use table, listing methods, and an explanation">
+<caption><span>Methods in <a href="../../../../../../org/apache/hadoop/hbase/procedure2/package-summary.html">org.apache.hadoop.hbase.procedure2</a> that return <a href="../../../../../../org/apache/hadoop/hbase/util/RetryCounter.html" title="class in org.apache.hadoop.hbase.util">RetryCounter</a></span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th class="colLast" scope="col">Method and Description</th>
+</tr>
+<tbody>
+<tr class="altColor">
+<td class="colFirst"><code>static <a href="../../../../../../org/apache/hadoop/hbase/util/RetryCounter.html" title="class in org.apache.hadoop.hbase.util">RetryCounter</a></code></td>
+<td class="colLast"><span class="typeNameLabel">ProcedureUtil.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#createRetryCounter-org.apache.hadoop.conf.Configuration-">createRetryCounter</a></span>(org.apache.hadoop.conf.Configuration&nbsp;conf)</code>
+<div class="block">Get a retry counter for getting the backoff time.</div>
+</td>
+</tr>
+</tbody>
+</table>
+</li>
 <li class="blockList"><a name="org.apache.hadoop.hbase.regionserver.handler">
 <!--   -->
 </a>
diff --git a/devapidocs/org/apache/hadoop/hbase/util/package-tree.html b/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
index d56e11e..f9434de 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/Bytes.LexicographicalComparerHolder.UnsafeComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Bytes.LexicographicalComparerHolder.UnsafeComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Order.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Order</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/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/IdReadWriteLock.ReferenceType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">IdReadWriteLock.ReferenceType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PrettyPrinter.Unit.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PrettyPrinter.Unit</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/ChecksumType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">ChecksumType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/HBaseFsck.ErrorReporter.ERROR_CODE.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">HBaseFsck.ErrorReporter.ERROR_CODE</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Order.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Order</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.LexicographicalComparerHolder.UnsafeComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Bytes.LexicographicalComparerHolder.UnsafeComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/ChecksumType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">ChecksumType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/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/PoolMap.PoolType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PoolMap.PoolType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.LexicographicalComparerHolder.PureJavaComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Bytes.LexicographicalComparerHolder.PureJavaComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/util/package-use.html b/devapidocs/org/apache/hadoop/hbase/util/package-use.html
index 95e6362..14b7d04 100644
--- a/devapidocs/org/apache/hadoop/hbase/util/package-use.html
+++ b/devapidocs/org/apache/hadoop/hbase/util/package-use.html
@@ -232,97 +232,101 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><a href="#org.apache.hadoop.hbase.master.snapshot">org.apache.hadoop.hbase.master.snapshot</a></td>
+<td class="colFirst"><a href="#org.apache.hadoop.hbase.master.replication">org.apache.hadoop.hbase.master.replication</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><a href="#org.apache.hadoop.hbase.mob">org.apache.hadoop.hbase.mob</a></td>
+<td class="colFirst"><a href="#org.apache.hadoop.hbase.master.snapshot">org.apache.hadoop.hbase.master.snapshot</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><a href="#org.apache.hadoop.hbase.mob.compactions">org.apache.hadoop.hbase.mob.compactions</a></td>
+<td class="colFirst"><a href="#org.apache.hadoop.hbase.mob">org.apache.hadoop.hbase.mob</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><a href="#org.apache.hadoop.hbase.nio">org.apache.hadoop.hbase.nio</a></td>
+<td class="colFirst"><a href="#org.apache.hadoop.hbase.mob.compactions">org.apache.hadoop.hbase.mob.compactions</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><a href="#org.apache.hadoop.hbase.procedure2">org.apache.hadoop.hbase.procedure2</a></td>
+<td class="colFirst"><a href="#org.apache.hadoop.hbase.nio">org.apache.hadoop.hbase.nio</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><a href="#org.apache.hadoop.hbase.regionserver">org.apache.hadoop.hbase.regionserver</a></td>
+<td class="colFirst"><a href="#org.apache.hadoop.hbase.procedure2">org.apache.hadoop.hbase.procedure2</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><a href="#org.apache.hadoop.hbase.regionserver.compactions">org.apache.hadoop.hbase.regionserver.compactions</a></td>
+<td class="colFirst"><a href="#org.apache.hadoop.hbase.regionserver">org.apache.hadoop.hbase.regionserver</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><a href="#org.apache.hadoop.hbase.regionserver.handler">org.apache.hadoop.hbase.regionserver.handler</a></td>
+<td class="colFirst"><a href="#org.apache.hadoop.hbase.regionserver.compactions">org.apache.hadoop.hbase.regionserver.compactions</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><a href="#org.apache.hadoop.hbase.regionserver.querymatcher">org.apache.hadoop.hbase.regionserver.querymatcher</a></td>
+<td class="colFirst"><a href="#org.apache.hadoop.hbase.regionserver.handler">org.apache.hadoop.hbase.regionserver.handler</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><a href="#org.apache.hadoop.hbase.regionserver.wal">org.apache.hadoop.hbase.regionserver.wal</a></td>
+<td class="colFirst"><a href="#org.apache.hadoop.hbase.regionserver.querymatcher">org.apache.hadoop.hbase.regionserver.querymatcher</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="rowColor">
+<td class="colFirst"><a href="#org.apache.hadoop.hbase.regionserver.wal">org.apache.hadoop.hbase.regionserver.wal</a></td>
+<td class="colLast">&nbsp;</td>
+</tr>
+<tr class="altColor">
 <td class="colFirst"><a href="#org.apache.hadoop.hbase.replication">org.apache.hadoop.hbase.replication</a></td>
 <td class="colLast">
 <div class="block">Multi Cluster Replication</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="#org.apache.hadoop.hbase.replication.regionserver">org.apache.hadoop.hbase.replication.regionserver</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="#org.apache.hadoop.hbase.rest">org.apache.hadoop.hbase.rest</a></td>
 <td class="colLast">
 <div class="block">HBase REST</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="#org.apache.hadoop.hbase.rsgroup">org.apache.hadoop.hbase.rsgroup</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="#org.apache.hadoop.hbase.security.access">org.apache.hadoop.hbase.security.access</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="#org.apache.hadoop.hbase.security.visibility">org.apache.hadoop.hbase.security.visibility</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="#org.apache.hadoop.hbase.snapshot">org.apache.hadoop.hbase.snapshot</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="#org.apache.hadoop.hbase.thrift">org.apache.hadoop.hbase.thrift</a></td>
 <td class="colLast">
 <div class="block">Provides an HBase <a href="http://incubator.apache.org/thrift/">Thrift</a>
 service.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="#org.apache.hadoop.hbase.thrift2.client">org.apache.hadoop.hbase.thrift2.client</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="#org.apache.hadoop.hbase.tool">org.apache.hadoop.hbase.tool</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="#org.apache.hadoop.hbase.tool.coprocessor">org.apache.hadoop.hbase.tool.coprocessor</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="#org.apache.hadoop.hbase.types">org.apache.hadoop.hbase.types</a></td>
 <td class="colLast">
 <div class="block">
@@ -330,19 +334,19 @@ service.</div>
  extensible data type API.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="#org.apache.hadoop.hbase.util">org.apache.hadoop.hbase.util</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="#org.apache.hadoop.hbase.util.hbck">org.apache.hadoop.hbase.util.hbck</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="#org.apache.hadoop.hbase.wal">org.apache.hadoop.hbase.wal</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="#org.apache.hadoop.hbase.zookeeper">org.apache.hadoop.hbase.zookeeper</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
@@ -969,6 +973,11 @@ service.</div>
 <div class="block">A generic class for pairs.</div>
 </td>
 </tr>
+<tr class="rowColor">
+<td class="colOne"><a href="../../../../../org/apache/hadoop/hbase/util/class-use/RetryCounter.html#org.apache.hadoop.hbase.master.assignment">RetryCounter</a>
+<div class="block">Operation retry accounting.</div>
+</td>
+</tr>
 </tbody>
 </table>
 </li>
@@ -1058,6 +1067,28 @@ service.</div>
 <div class="block">A generic class for pairs.</div>
 </td>
 </tr>
+<tr class="rowColor">
+<td class="colOne"><a href="../../../../../org/apache/hadoop/hbase/util/class-use/RetryCounter.html#org.apache.hadoop.hbase.master.procedure">RetryCounter</a>
+<div class="block">Operation retry accounting.</div>
+</td>
+</tr>
+</tbody>
+</table>
+</li>
+<li class="blockList"><a name="org.apache.hadoop.hbase.master.replication">
+<!--   -->
+</a>
+<table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="Use table, listing classes, and an explanation">
+<caption><span>Classes in <a href="../../../../../org/apache/hadoop/hbase/util/package-summary.html">org.apache.hadoop.hbase.util</a> used by <a href="../../../../../org/apache/hadoop/hbase/master/replication/package-summary.html">org.apache.hadoop.hbase.master.replication</a></span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colOne" scope="col">Class and Description</th>
+</tr>
+<tbody>
+<tr class="altColor">
+<td class="colOne"><a href="../../../../../org/apache/hadoop/hbase/util/class-use/RetryCounter.html#org.apache.hadoop.hbase.master.replication">RetryCounter</a>
+<div class="block">Operation retry accounting.</div>
+</td>
+</tr>
 </tbody>
 </table>
 </li>
@@ -1160,6 +1191,11 @@ service.</div>
 <div class="block">This implementation is not smart and just treats nonce group and nonce as random bits.</div>
 </td>
 </tr>
+<tr class="altColor">
+<td class="colOne"><a href="../../../../../org/apache/hadoop/hbase/util/class-use/RetryCounter.html#org.apache.hadoop.hbase.procedure2">RetryCounter</a>
+<div class="block">Operation retry accounting.</div>
+</td>
+</tr>
 </tbody>
 </table>
 </li>
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 51b17eb..eb053a7 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
@@ -18,9 +18,9 @@
 <span class="sourceLineNo">010</span>  public static final String version = "3.0.0-SNAPSHOT";<a name="line.10"></a>
 <span class="sourceLineNo">011</span>  public static final String revision = "Unknown";<a name="line.11"></a>
 <span class="sourceLineNo">012</span>  public static final String user = "jenkins";<a name="line.12"></a>
-<span class="sourceLineNo">013</span>  public static final String date = "Fri May  3 14:34:30 UTC 2019";<a name="line.13"></a>
+<span class="sourceLineNo">013</span>  public static final String date = "Sat May  4 17:27:11 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 = "fe48d5c5d2de4fe6b4e89d6da1c8038f";<a name="line.15"></a>
+<span class="sourceLineNo">015</span>  public static final String srcChecksum = "4b63fe9b04e1c2cf4788ef56a264dc16";<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/RegionRemoteProcedureBase.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html
index 3b159a2..36b0433 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionRemoteProcedureBase.html
@@ -42,286 +42,290 @@
 <span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.procedure2.ProcedureYieldException;<a name="line.34"></a>
 <span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.procedure2.RemoteProcedureDispatcher.RemoteProcedure;<a name="line.35"></a>
 <span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.procedure2.RemoteProcedureException;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.slf4j.Logger;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.slf4j.LoggerFactory;<a name="line.39"></a>
-<span class="sourceLineNo">040</span><a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionRemoteProcedureBaseState;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionRemoteProcedureBaseStateData;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode;<a name="line.45"></a>
-<span class="sourceLineNo">046</span><a name="line.46"></a>
-<span class="sourceLineNo">047</span>/**<a name="line.47"></a>
-<span class="sourceLineNo">048</span> * The base class for the remote procedures used to open/close a region.<a name="line.48"></a>
-<span class="sourceLineNo">049</span> * &lt;p/&gt;<a name="line.49"></a>
-<span class="sourceLineNo">050</span> * Notice that here we do not care about the result of the remote call, if the remote call is<a name="line.50"></a>
-<span class="sourceLineNo">051</span> * finished, either succeeded or not, we will always finish the procedure. The parent procedure<a name="line.51"></a>
-<span class="sourceLineNo">052</span> * should take care of the result and try to reschedule if the result is not good.<a name="line.52"></a>
-<span class="sourceLineNo">053</span> */<a name="line.53"></a>
-<span class="sourceLineNo">054</span>@InterfaceAudience.Private<a name="line.54"></a>
-<span class="sourceLineNo">055</span>public abstract class RegionRemoteProcedureBase extends Procedure&lt;MasterProcedureEnv&gt;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>    implements TableProcedureInterface, RemoteProcedure&lt;MasterProcedureEnv, ServerName&gt; {<a name="line.56"></a>
-<span class="sourceLineNo">057</span><a name="line.57"></a>
-<span class="sourceLineNo">058</span>  private static final Logger LOG = LoggerFactory.getLogger(RegionRemoteProcedureBase.class);<a name="line.58"></a>
-<span class="sourceLineNo">059</span><a name="line.59"></a>
-<span class="sourceLineNo">060</span>  protected RegionInfo region;<a name="line.60"></a>
-<span class="sourceLineNo">061</span><a name="line.61"></a>
-<span class="sourceLineNo">062</span>  protected ServerName targetServer;<a name="line.62"></a>
-<span class="sourceLineNo">063</span><a name="line.63"></a>
-<span class="sourceLineNo">064</span>  private RegionRemoteProcedureBaseState state =<a name="line.64"></a>
-<span class="sourceLineNo">065</span>    RegionRemoteProcedureBaseState.REGION_REMOTE_PROCEDURE_DISPATCH;<a name="line.65"></a>
-<span class="sourceLineNo">066</span><a name="line.66"></a>
-<span class="sourceLineNo">067</span>  private TransitionCode transitionCode;<a name="line.67"></a>
-<span class="sourceLineNo">068</span><a name="line.68"></a>
-<span class="sourceLineNo">069</span>  private long seqId;<a name="line.69"></a>
-<span class="sourceLineNo">070</span><a name="line.70"></a>
-<span class="sourceLineNo">071</span>  private int attempt;<a name="line.71"></a>
-<span class="sourceLineNo">072</span><a name="line.72"></a>
-<span class="sourceLineNo">073</span>  protected RegionRemoteProcedureBase() {<a name="line.73"></a>
-<span class="sourceLineNo">074</span>  }<a name="line.74"></a>
-<span class="sourceLineNo">075</span><a name="line.75"></a>
-<span class="sourceLineNo">076</span>  protected RegionRemoteProcedureBase(TransitRegionStateProcedure parent, RegionInfo region,<a name="line.76"></a>
-<span class="sourceLineNo">077</span>      ServerName targetServer) {<a name="line.77"></a>
-<span class="sourceLineNo">078</span>    this.region = region;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>    this.targetServer = targetServer;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>    parent.attachRemoteProc(this);<a name="line.80"></a>
-<span class="sourceLineNo">081</span>  }<a name="line.81"></a>
-<span class="sourceLineNo">082</span><a name="line.82"></a>
-<span class="sourceLineNo">083</span>  @Override<a name="line.83"></a>
-<span class="sourceLineNo">084</span>  public void remoteOperationCompleted(MasterProcedureEnv env) {<a name="line.84"></a>
-<span class="sourceLineNo">085</span>    // should not be called since we use reportRegionStateTransition to report the result<a name="line.85"></a>
-<span class="sourceLineNo">086</span>    throw new UnsupportedOperationException();<a name="line.86"></a>
-<span class="sourceLineNo">087</span>  }<a name="line.87"></a>
-<span class="sourceLineNo">088</span><a name="line.88"></a>
-<span class="sourceLineNo">089</span>  @Override<a name="line.89"></a>
-<span class="sourceLineNo">090</span>  public void remoteOperationFailed(MasterProcedureEnv env, RemoteProcedureException error) {<a name="line.90"></a>
-<span class="sourceLineNo">091</span>    // should not be called since we use reportRegionStateTransition to report the result<a name="line.91"></a>
-<span class="sourceLineNo">092</span>    throw new UnsupportedOperationException();<a name="line.92"></a>
-<span class="sourceLineNo">093</span>  }<a name="line.93"></a>
-<span class="sourceLineNo">094</span><a name="line.94"></a>
-<span class="sourceLineNo">095</span>  private RegionStateNode getRegionNode(MasterProcedureEnv env) {<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    return env.getAssignmentManager().getRegionStates().getRegionStateNode(region);<a name="line.96"></a>
-<span class="sourceLineNo">097</span>  }<a name="line.97"></a>
-<span class="sourceLineNo">098</span><a name="line.98"></a>
-<span class="sourceLineNo">099</span>  @Override<a name="line.99"></a>
-<span class="sourceLineNo">100</span>  public void remoteCallFailed(MasterProcedureEnv env, ServerName remote, IOException exception) {<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    RegionStateNode regionNode = getRegionNode(env);<a name="line.101"></a>
-<span class="sourceLineNo">102</span>    regionNode.lock();<a name="line.102"></a>
-<span class="sourceLineNo">103</span>    try {<a name="line.103"></a>
-<span class="sourceLineNo">104</span>      if (!env.getMasterServices().getServerManager().isServerOnline(remote)) {<a name="line.104"></a>
-<span class="sourceLineNo">105</span>        // the SCP will interrupt us, give up<a name="line.105"></a>
-<span class="sourceLineNo">106</span>        LOG.debug("{} for region {}, targetServer {} is dead, SCP will interrupt us, give up", this,<a name="line.106"></a>
-<span class="sourceLineNo">107</span>          regionNode, remote);<a name="line.107"></a>
-<span class="sourceLineNo">108</span>        return;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>      }<a name="line.109"></a>
-<span class="sourceLineNo">110</span>      if (state != RegionRemoteProcedureBaseState.REGION_REMOTE_PROCEDURE_DISPATCH) {<a name="line.110"></a>
-<span class="sourceLineNo">111</span>        // not sure how can this happen but anyway let's add a check here to avoid waking the wrong<a name="line.111"></a>
-<span class="sourceLineNo">112</span>        // procedure...<a name="line.112"></a>
-<span class="sourceLineNo">113</span>        LOG.warn("{} for region {}, targetServer={} has already been woken up, ignore", this,<a name="line.113"></a>
-<span class="sourceLineNo">114</span>          regionNode, remote);<a name="line.114"></a>
-<span class="sourceLineNo">115</span>        return;<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      }<a name="line.116"></a>
-<span class="sourceLineNo">117</span>      LOG.warn("The remote operation {} for region {} to server {} failed", this, regionNode,<a name="line.117"></a>
-<span class="sourceLineNo">118</span>        remote, exception);<a name="line.118"></a>
-<span class="sourceLineNo">119</span>      // It is OK to not persist the state here, as we do not need to change the region state if the<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      // remote call is failed. If the master crashed before we actually execute the procedure and<a name="line.120"></a>
-<span class="sourceLineNo">121</span>      // persist the new state, it is fine to retry on the same target server again.<a name="line.121"></a>
-<span class="sourceLineNo">122</span>      state = RegionRemoteProcedureBaseState.REGION_REMOTE_PROCEDURE_DISPATCH_FAIL;<a name="line.122"></a>
-<span class="sourceLineNo">123</span>      regionNode.getProcedureEvent().wake(env.getProcedureScheduler());<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    } finally {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      regionNode.unlock();<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    }<a name="line.126"></a>
-<span class="sourceLineNo">127</span>  }<a name="line.127"></a>
-<span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span>  @Override<a name="line.129"></a>
-<span class="sourceLineNo">130</span>  public TableName getTableName() {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    return region.getTable();<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  }<a name="line.132"></a>
-<span class="sourceLineNo">133</span><a name="line.133"></a>
-<span class="sourceLineNo">134</span>  @Override<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  protected boolean waitInitialized(MasterProcedureEnv env) {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    if (TableName.isMetaTableName(getTableName())) {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>      return false;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    }<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    // First we need meta to be loaded, and second, if meta is not online then we will likely to<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    // fail when updating meta so we wait until it is assigned.<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    AssignmentManager am = env.getAssignmentManager();<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    return am.waitMetaLoaded(this) || am.waitMetaAssigned(this, region);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  }<a name="line.143"></a>
-<span class="sourceLineNo">144</span><a name="line.144"></a>
-<span class="sourceLineNo">145</span>  @Override<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  protected void rollback(MasterProcedureEnv env) throws IOException, InterruptedException {<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    throw new UnsupportedOperationException();<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  }<a name="line.148"></a>
-<span class="sourceLineNo">149</span><a name="line.149"></a>
-<span class="sourceLineNo">150</span>  @Override<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  protected boolean abort(MasterProcedureEnv env) {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    return false;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  }<a name="line.153"></a>
-<span class="sourceLineNo">154</span><a name="line.154"></a>
-<span class="sourceLineNo">155</span>  // do some checks to see if the report is valid, without actually updating meta.<a name="line.155"></a>
-<span class="sourceLineNo">156</span>  protected abstract void reportTransition(RegionStateNode regionNode,<a name="line.156"></a>
-<span class="sourceLineNo">157</span>      TransitionCode transitionCode, long seqId) throws IOException;<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  // A bit strange but the procedure store will throw RuntimeException if we can not persist the<a name="line.159"></a>
-<span class="sourceLineNo">160</span>  // state, so upper layer should take care of this...<a name="line.160"></a>
-<span class="sourceLineNo">161</span>  private void persistAndWake(MasterProcedureEnv env, RegionStateNode regionNode) {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    env.getMasterServices().getMasterProcedureExecutor().getStore().update(this);<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    regionNode.getProcedureEvent().wake(env.getProcedureScheduler());<a name="line.163"></a>
-<span class="sourceLineNo">164</span>  }<a name="line.164"></a>
-<span class="sourceLineNo">165</span><a name="line.165"></a>
-<span class="sourceLineNo">166</span>  // should be called with RegionStateNode locked, to avoid race with the execute method below<a name="line.166"></a>
-<span class="sourceLineNo">167</span>  void reportTransition(MasterProcedureEnv env, RegionStateNode regionNode, ServerName serverName,<a name="line.167"></a>
-<span class="sourceLineNo">168</span>      TransitionCode transitionCode, long seqId) throws IOException {<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    if (state != RegionRemoteProcedureBaseState.REGION_REMOTE_PROCEDURE_DISPATCH) {<a name="line.169"></a>
-<span class="sourceLineNo">170</span>      // should be a retry<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      return;<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    }<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    if (!targetServer.equals(serverName)) {<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      throw new UnexpectedStateException("Received report from " + serverName + ", expected " +<a name="line.174"></a>
-<span class="sourceLineNo">175</span>        targetServer + ", " + regionNode + ", proc=" + this);<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    }<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    reportTransition(regionNode, transitionCode, seqId);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    // this state means we have received the report from RS, does not mean the result is fine, as we<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    // may received a FAILED_OPEN.<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    this.state = RegionRemoteProcedureBaseState.REGION_REMOTE_PROCEDURE_REPORT_SUCCEED;<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    this.transitionCode = transitionCode;<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    this.seqId = seqId;<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    // Persist the transition code and openSeqNum(if provided).<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    // We should not update the hbase:meta directly as this may cause races when master restarts,<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    // as the old active master may incorrectly report back to RS and cause the new master to hang<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    // on a OpenRegionProcedure forever. See HBASE-22060 and HBASE-22074 for more details.<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    boolean succ = false;<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    try {<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      persistAndWake(env, regionNode);<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      succ = true;<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    } finally {<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      if (!succ) {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>        this.state = RegionRemoteProcedureBaseState.REGION_REMOTE_PROCEDURE_DISPATCH;<a name="line.193"></a>
-<span class="sourceLineNo">194</span>        this.transitionCode = null;<a name="line.194"></a>
-<span class="sourceLineNo">195</span>        this.seqId = HConstants.NO_SEQNUM;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      }<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    }<a name="line.197"></a>
-<span class="sourceLineNo">198</span>  }<a name="line.198"></a>
-<span class="sourceLineNo">199</span><a name="line.199"></a>
-<span class="sourceLineNo">200</span>  void serverCrashed(MasterProcedureEnv env, RegionStateNode regionNode, ServerName serverName) {<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    if (state != RegionRemoteProcedureBaseState.REGION_REMOTE_PROCEDURE_DISPATCH) {<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      // should be a retry<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      return;<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    }<a name="line.204"></a>
-<span class="sourceLineNo">205</span>    this.state = RegionRemoteProcedureBaseState.REGION_REMOTE_PROCEDURE_SERVER_CRASH;<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    boolean succ = false;<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    try {<a name="line.207"></a>
-<span class="sourceLineNo">208</span>      persistAndWake(env, regionNode);<a name="line.208"></a>
-<span class="sourceLineNo">209</span>      succ = true;<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    } finally {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>      if (!succ) {<a name="line.211"></a>
-<span class="sourceLineNo">212</span>        this.state = RegionRemoteProcedureBaseState.REGION_REMOTE_PROCEDURE_DISPATCH;<a name="line.212"></a>
-<span class="sourceLineNo">213</span>      }<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    }<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>  private TransitRegionStateProcedure getParent(MasterProcedureEnv env) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    return (TransitRegionStateProcedure) env.getMasterServices().getMasterProcedureExecutor()<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      .getProcedure(getParentProcId());<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>  private void unattach(MasterProcedureEnv env) {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    getParent(env).unattachRemoteProc(this);<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>  // actually update the state to meta<a name="line.226"></a>
-<span class="sourceLineNo">227</span>  protected abstract void updateTransition(MasterProcedureEnv env, RegionStateNode regionNode,<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      TransitionCode transitionCode, long seqId) throws IOException;<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>  @Override<a name="line.230"></a>
-<span class="sourceLineNo">231</span>  protected Procedure&lt;MasterProcedureEnv&gt;[] execute(MasterProcedureEnv env)<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      throws ProcedureYieldException, ProcedureSuspendedException, InterruptedException {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    RegionStateNode regionNode = getRegionNode(env);<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    regionNode.lock();<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    try {<a name="line.235"></a>
-<span class="sourceLineNo">236</span>      switch (state) {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>        case REGION_REMOTE_PROCEDURE_DISPATCH: {<a name="line.237"></a>
-<span class="sourceLineNo">238</span>          // The code which wakes us up also needs to lock the RSN so here we do not need to<a name="line.238"></a>
-<span class="sourceLineNo">239</span>          // synchronize<a name="line.239"></a>
-<span class="sourceLineNo">240</span>          // on the event.<a name="line.240"></a>
-<span class="sourceLineNo">241</span>          ProcedureEvent&lt;?&gt; event = regionNode.getProcedureEvent();<a name="line.241"></a>
-<span class="sourceLineNo">242</span>          try {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>            env.getRemoteDispatcher().addOperationToNode(targetServer, this);<a name="line.243"></a>
-<span class="sourceLineNo">244</span>          } catch (FailedRemoteDispatchException e) {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>            LOG.warn("Can not add remote operation {} for region {} to server {}, this usually " +<a name="line.245"></a>
-<span class="sourceLineNo">246</span>              "because the server is alread dead, give up and mark the procedure as complete, " +<a name="line.246"></a>
-<span class="sourceLineNo">247</span>              "the parent procedure will take care of this.", this, region, targetServer, e);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>            unattach(env);<a name="line.248"></a>
-<span class="sourceLineNo">249</span>            return null;<a name="line.249"></a>
-<span class="sourceLineNo">250</span>          }<a name="line.250"></a>
-<span class="sourceLineNo">251</span>          event.suspend();<a name="line.251"></a>
-<span class="sourceLineNo">252</span>          event.suspendIfNotReady(this);<a name="line.252"></a>
-<span class="sourceLineNo">253</span>          throw new ProcedureSuspendedException();<a name="line.253"></a>
-<span class="sourceLineNo">254</span>        }<a name="line.254"></a>
-<span class="sourceLineNo">255</span>        case REGION_REMOTE_PROCEDURE_REPORT_SUCCEED:<a name="line.255"></a>
-<span class="sourceLineNo">256</span>          updateTransition(env, regionNode, transitionCode, seqId);<a name="line.256"></a>
-<span class="sourceLineNo">257</span>          unattach(env);<a name="line.257"></a>
-<span class="sourceLineNo">258</span>          return null;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>        case REGION_REMOTE_PROCEDURE_DISPATCH_FAIL:<a name="line.259"></a>
-<span class="sourceLineNo">260</span>          // the remote call is failed so we do not need to change the region state, just return.<a name="line.260"></a>
-<span class="sourceLineNo">261</span>          unattach(env);<a name="line.261"></a>
-<span class="sourceLineNo">262</span>          return null;<a name="line.262"></a>
-<span class="sourceLineNo">263</span>        case REGION_REMOTE_PROCEDURE_SERVER_CRASH:<a name="line.263"></a>
-<span class="sourceLineNo">264</span>          env.getAssignmentManager().regionClosed(regionNode, false);<a name="line.264"></a>
-<span class="sourceLineNo">265</span>          unattach(env);<a name="line.265"></a>
-<span class="sourceLineNo">266</span>          return null;<a name="line.266"></a>
-<span class="sourceLineNo">267</span>        default:<a name="line.267"></a>
-<span class="sourceLineNo">268</span>          throw new IllegalStateException("Unknown state: " + state);<a name="line.268"></a>
-<span class="sourceLineNo">269</span>      }<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    } catch (IOException e) {<a name="line.270"></a>
-<span class="sourceLineNo">271</span>      long backoff = ProcedureUtil.getBackoffTimeMs(this.attempt++);<a name="line.271"></a>
-<span class="sourceLineNo">272</span>      LOG.warn("Failed updating meta, suspend {}secs {}; {};", backoff / 1000, this, regionNode, e);<a name="line.272"></a>
-<span class="sourceLineNo">273</span>      setTimeout(Math.toIntExact(backoff));<a name="line.273"></a>
-<span class="sourceLineNo">274</span>      setState(ProcedureProtos.ProcedureState.WAITING_TIMEOUT);<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      skipPersistence();<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      throw new ProcedureSuspendedException();<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    } finally {<a name="line.277"></a>
-<span class="sourceLineNo">278</span>      regionNode.unlock();<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    }<a name="line.279"></a>
-<span class="sourceLineNo">280</span>  }<a name="line.280"></a>
-<span class="sourceLineNo">281</span><a name="line.281"></a>
-<span class="sourceLineNo">282</span>  @Override<a name="line.282"></a>
-<span class="sourceLineNo">283</span>  public boolean storeInDispatchedQueue() {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    return false;<a name="line.284"></a>
-<span class="sourceLineNo">285</span>  }<a name="line.285"></a>
-<span class="sourceLineNo">286</span><a name="line.286"></a>
-<span class="sourceLineNo">287</span>  @Override<a name="line.287"></a>
-<span class="sourceLineNo">288</span>  protected void serializeStateData(ProcedureStateSerializer serializer) throws IOException {<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    RegionRemoteProcedureBaseStateData.Builder builder =<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      RegionRemoteProcedureBaseStateData.newBuilder().setRegion(ProtobufUtil.toRegionInfo(region))<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        .setTargetServer(ProtobufUtil.toServerName(targetServer)).setState(state);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    if (transitionCode != null) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      builder.setTransitionCode(transitionCode);<a name="line.293"></a>
-<span class="sourceLineNo">294</span>      builder.setSeqId(seqId);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    serializer.serialize(builder.build());<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>  @Override<a name="line.299"></a>
-<span class="sourceLineNo">300</span>  protected void deserializeStateData(ProcedureStateSerializer serializer) throws IOException {<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    RegionRemoteProcedureBaseStateData data =<a name="line.301"></a>
-<span class="sourceLineNo">302</span>      serializer.deserialize(RegionRemoteProcedureBaseStateData.class);<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    region = ProtobufUtil.toRegionInfo(data.getRegion());<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    targetServer = ProtobufUtil.toServerName(data.getTargetServer());<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    state = data.getState();<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    if (data.hasTransitionCode()) {<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      transitionCode = data.getTransitionCode();<a name="line.307"></a>
-<span class="sourceLineNo">308</span>      seqId = data.getSeqId();<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    }<a name="line.309"></a>
-<span class="sourceLineNo">310</span>  }<a name="line.310"></a>
-<span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span>  @Override<a name="line.312"></a>
-<span class="sourceLineNo">313</span>  protected void afterReplay(MasterProcedureEnv env) {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    getParent(env).attachRemoteProc(this);<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  }<a name="line.315"></a>
-<span class="sourceLineNo">316</span>}<a name="line.316"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.util.RetryCounter;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.slf4j.Logger;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.slf4j.LoggerFactory;<a name="line.40"></a>
+<span class="sourceLineNo">041</span><a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionRemoteProcedureBaseState;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionRemoteProcedureBaseStateData;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode;<a name="line.46"></a>
+<span class="sourceLineNo">047</span><a name="line.47"></a>
+<span class="sourceLineNo">048</span>/**<a name="line.48"></a>
+<span class="sourceLineNo">049</span> * The base class for the remote procedures used to open/close a region.<a name="line.49"></a>
+<span class="sourceLineNo">050</span> * &lt;p/&gt;<a name="line.50"></a>
+<span class="sourceLineNo">051</span> * Notice that here we do not care about the result of the remote call, if the remote call is<a name="line.51"></a>
+<span class="sourceLineNo">052</span> * finished, either succeeded or not, we will always finish the procedure. The parent procedure<a name="line.52"></a>
+<span class="sourceLineNo">053</span> * should take care of the result and try to reschedule if the result is not good.<a name="line.53"></a>
+<span class="sourceLineNo">054</span> */<a name="line.54"></a>
+<span class="sourceLineNo">055</span>@InterfaceAudience.Private<a name="line.55"></a>
+<span class="sourceLineNo">056</span>public abstract class RegionRemoteProcedureBase extends Procedure&lt;MasterProcedureEnv&gt;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>    implements TableProcedureInterface, RemoteProcedure&lt;MasterProcedureEnv, ServerName&gt; {<a name="line.57"></a>
+<span class="sourceLineNo">058</span><a name="line.58"></a>
+<span class="sourceLineNo">059</span>  private static final Logger LOG = LoggerFactory.getLogger(RegionRemoteProcedureBase.class);<a name="line.59"></a>
+<span class="sourceLineNo">060</span><a name="line.60"></a>
+<span class="sourceLineNo">061</span>  protected RegionInfo region;<a name="line.61"></a>
+<span class="sourceLineNo">062</span><a name="line.62"></a>
+<span class="sourceLineNo">063</span>  protected ServerName targetServer;<a name="line.63"></a>
+<span class="sourceLineNo">064</span><a name="line.64"></a>
+<span class="sourceLineNo">065</span>  private RegionRemoteProcedureBaseState state =<a name="line.65"></a>
+<span class="sourceLineNo">066</span>    RegionRemoteProcedureBaseState.REGION_REMOTE_PROCEDURE_DISPATCH;<a name="line.66"></a>
+<span class="sourceLineNo">067</span><a name="line.67"></a>
+<span class="sourceLineNo">068</span>  private TransitionCode transitionCode;<a name="line.68"></a>
+<span class="sourceLineNo">069</span><a name="line.69"></a>
+<span class="sourceLineNo">070</span>  private long seqId;<a name="line.70"></a>
+<span class="sourceLineNo">071</span><a name="line.71"></a>
+<span class="sourceLineNo">072</span>  private RetryCounter retryCounter;<a name="line.72"></a>
+<span class="sourceLineNo">073</span><a name="line.73"></a>
+<span class="sourceLineNo">074</span>  protected RegionRemoteProcedureBase() {<a name="line.74"></a>
+<span class="sourceLineNo">075</span>  }<a name="line.75"></a>
+<span class="sourceLineNo">076</span><a name="line.76"></a>
+<span class="sourceLineNo">077</span>  protected RegionRemoteProcedureBase(TransitRegionStateProcedure parent, RegionInfo region,<a name="line.77"></a>
+<span class="sourceLineNo">078</span>      ServerName targetServer) {<a name="line.78"></a>
+<span class="sourceLineNo">079</span>    this.region = region;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>    this.targetServer = targetServer;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>    parent.attachRemoteProc(this);<a name="line.81"></a>
+<span class="sourceLineNo">082</span>  }<a name="line.82"></a>
+<span class="sourceLineNo">083</span><a name="line.83"></a>
+<span class="sourceLineNo">084</span>  @Override<a name="line.84"></a>
+<span class="sourceLineNo">085</span>  public void remoteOperationCompleted(MasterProcedureEnv env) {<a name="line.85"></a>
+<span class="sourceLineNo">086</span>    // should not be called since we use reportRegionStateTransition to report the result<a name="line.86"></a>
+<span class="sourceLineNo">087</span>    throw new UnsupportedOperationException();<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  }<a name="line.88"></a>
+<span class="sourceLineNo">089</span><a name="line.89"></a>
+<span class="sourceLineNo">090</span>  @Override<a name="line.90"></a>
+<span class="sourceLineNo">091</span>  public void remoteOperationFailed(MasterProcedureEnv env, RemoteProcedureException error) {<a name="line.91"></a>
+<span class="sourceLineNo">092</span>    // should not be called since we use reportRegionStateTransition to report the result<a name="line.92"></a>
+<span class="sourceLineNo">093</span>    throw new UnsupportedOperationException();<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  }<a name="line.94"></a>
+<span class="sourceLineNo">095</span><a name="line.95"></a>
+<span class="sourceLineNo">096</span>  private RegionStateNode getRegionNode(MasterProcedureEnv env) {<a name="line.96"></a>
+<span class="sourceLineNo">097</span>    return env.getAssignmentManager().getRegionStates().getRegionStateNode(region);<a name="line.97"></a>
+<span class="sourceLineNo">098</span>  }<a name="line.98"></a>
+<span class="sourceLineNo">099</span><a name="line.99"></a>
+<span class="sourceLineNo">100</span>  @Override<a name="line.100"></a>
+<span class="sourceLineNo">101</span>  public void remoteCallFailed(MasterProcedureEnv env, ServerName remote, IOException exception) {<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    RegionStateNode regionNode = getRegionNode(env);<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    regionNode.lock();<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    try {<a name="line.104"></a>
+<span class="sourceLineNo">105</span>      if (!env.getMasterServices().getServerManager().isServerOnline(remote)) {<a name="line.105"></a>
+<span class="sourceLineNo">106</span>        // the SCP will interrupt us, give up<a name="line.106"></a>
+<span class="sourceLineNo">107</span>        LOG.debug("{} for region {}, targetServer {} is dead, SCP will interrupt us, give up", this,<a name="line.107"></a>
+<span class="sourceLineNo">108</span>          regionNode, remote);<a name="line.108"></a>
+<span class="sourceLineNo">109</span>        return;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>      }<a name="line.110"></a>
+<span class="sourceLineNo">111</span>      if (state != RegionRemoteProcedureBaseState.REGION_REMOTE_PROCEDURE_DISPATCH) {<a name="line.111"></a>
+<span class="sourceLineNo">112</span>        // not sure how can this happen but anyway let's add a check here to avoid waking the wrong<a name="line.112"></a>
+<span class="sourceLineNo">113</span>        // procedure...<a name="line.113"></a>
+<span class="sourceLineNo">114</span>        LOG.warn("{} for region {}, targetServer={} has already been woken up, ignore", this,<a name="line.114"></a>
+<span class="sourceLineNo">115</span>          regionNode, remote);<a name="line.115"></a>
+<span class="sourceLineNo">116</span>        return;<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      }<a name="line.117"></a>
+<span class="sourceLineNo">118</span>      LOG.warn("The remote operation {} for region {} to server {} failed", this, regionNode,<a name="line.118"></a>
+<span class="sourceLineNo">119</span>        remote, exception);<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      // It is OK to not persist the state here, as we do not need to change the region state if the<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      // remote call is failed. If the master crashed before we actually execute the procedure and<a name="line.121"></a>
+<span class="sourceLineNo">122</span>      // persist the new state, it is fine to retry on the same target server again.<a name="line.122"></a>
+<span class="sourceLineNo">123</span>      state = RegionRemoteProcedureBaseState.REGION_REMOTE_PROCEDURE_DISPATCH_FAIL;<a name="line.123"></a>
+<span class="sourceLineNo">124</span>      regionNode.getProcedureEvent().wake(env.getProcedureScheduler());<a name="line.124"></a>
+<span class="sourceLineNo">125</span>    } finally {<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      regionNode.unlock();<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    }<a name="line.127"></a>
+<span class="sourceLineNo">128</span>  }<a name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span>  @Override<a name="line.130"></a>
+<span class="sourceLineNo">131</span>  public TableName getTableName() {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    return region.getTable();<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  }<a name="line.133"></a>
+<span class="sourceLineNo">134</span><a name="line.134"></a>
+<span class="sourceLineNo">135</span>  @Override<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  protected boolean waitInitialized(MasterProcedureEnv env) {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    if (TableName.isMetaTableName(getTableName())) {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>      return false;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    }<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    // First we need meta to be loaded, and second, if meta is not online then we will likely to<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    // fail when updating meta so we wait until it is assigned.<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    AssignmentManager am = env.getAssignmentManager();<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    return am.waitMetaLoaded(this) || am.waitMetaAssigned(this, region);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  }<a name="line.144"></a>
+<span class="sourceLineNo">145</span><a name="line.145"></a>
+<span class="sourceLineNo">146</span>  @Override<a name="line.146"></a>
+<span class="sourceLineNo">147</span>  protected void rollback(MasterProcedureEnv env) throws IOException, InterruptedException {<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    throw new UnsupportedOperationException();<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  }<a name="line.149"></a>
+<span class="sourceLineNo">150</span><a name="line.150"></a>
+<span class="sourceLineNo">151</span>  @Override<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  protected boolean abort(MasterProcedureEnv env) {<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    return false;<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  }<a name="line.154"></a>
+<span class="sourceLineNo">155</span><a name="line.155"></a>
+<span class="sourceLineNo">156</span>  // do some checks to see if the report is valid, without actually updating meta.<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  protected abstract void reportTransition(RegionStateNode regionNode,<a name="line.157"></a>
+<span class="sourceLineNo">158</span>      TransitionCode transitionCode, long seqId) throws IOException;<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  // A bit strange but the procedure store will throw RuntimeException if we can not persist the<a name="line.160"></a>
+<span class="sourceLineNo">161</span>  // state, so upper layer should take care of this...<a name="line.161"></a>
+<span class="sourceLineNo">162</span>  private void persistAndWake(MasterProcedureEnv env, RegionStateNode regionNode) {<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    env.getMasterServices().getMasterProcedureExecutor().getStore().update(this);<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    regionNode.getProcedureEvent().wake(env.getProcedureScheduler());<a name="line.164"></a>
+<span class="sourceLineNo">165</span>  }<a name="line.165"></a>
+<span class="sourceLineNo">166</span><a name="line.166"></a>
+<span class="sourceLineNo">167</span>  // should be called with RegionStateNode locked, to avoid race with the execute method below<a name="line.167"></a>
+<span class="sourceLineNo">168</span>  void reportTransition(MasterProcedureEnv env, RegionStateNode regionNode, ServerName serverName,<a name="line.168"></a>
+<span class="sourceLineNo">169</span>      TransitionCode transitionCode, long seqId) throws IOException {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    if (state != RegionRemoteProcedureBaseState.REGION_REMOTE_PROCEDURE_DISPATCH) {<a name="line.170"></a>
+<span class="sourceLineNo">171</span>      // should be a retry<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      return;<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    }<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    if (!targetServer.equals(serverName)) {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      throw new UnexpectedStateException("Received report from " + serverName + ", expected " +<a name="line.175"></a>
+<span class="sourceLineNo">176</span>        targetServer + ", " + regionNode + ", proc=" + this);<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    }<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    reportTransition(regionNode, transitionCode, seqId);<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    // this state means we have received the report from RS, does not mean the result is fine, as we<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    // may received a FAILED_OPEN.<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    this.state = RegionRemoteProcedureBaseState.REGION_REMOTE_PROCEDURE_REPORT_SUCCEED;<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    this.transitionCode = transitionCode;<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    this.seqId = seqId;<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    // Persist the transition code and openSeqNum(if provided).<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    // We should not update the hbase:meta directly as this may cause races when master restarts,<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    // as the old active master may incorrectly report back to RS and cause the new master to hang<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    // on a OpenRegionProcedure forever. See HBASE-22060 and HBASE-22074 for more details.<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    boolean succ = false;<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    try {<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      persistAndWake(env, regionNode);<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      succ = true;<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    } finally {<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      if (!succ) {<a name="line.193"></a>
+<span class="sourceLineNo">194</span>        this.state = RegionRemoteProcedureBaseState.REGION_REMOTE_PROCEDURE_DISPATCH;<a name="line.194"></a>
+<span class="sourceLineNo">195</span>        this.transitionCode = null;<a name="line.195"></a>
+<span class="sourceLineNo">196</span>        this.seqId = HConstants.NO_SEQNUM;<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      }<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    }<a name="line.198"></a>
+<span class="sourceLineNo">199</span>  }<a name="line.199"></a>
+<span class="sourceLineNo">200</span><a name="line.200"></a>
+<span class="sourceLineNo">201</span>  void serverCrashed(MasterProcedureEnv env, RegionStateNode regionNode, ServerName serverName) {<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    if (state != RegionRemoteProcedureBaseState.REGION_REMOTE_PROCEDURE_DISPATCH) {<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      // should be a retry<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      return;<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    }<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    this.state = RegionRemoteProcedureBaseState.REGION_REMOTE_PROCEDURE_SERVER_CRASH;<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    boolean succ = false;<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    try {<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      persistAndWake(env, regionNode);<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      succ = true;<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    } finally {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      if (!succ) {<a name="line.212"></a>
+<span class="sourceLineNo">213</span>        this.state = RegionRemoteProcedureBaseState.REGION_REMOTE_PROCEDURE_DISPATCH;<a name="line.213"></a>
+<span class="sourceLineNo">214</span>      }<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    }<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  }<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>  private TransitRegionStateProcedure getParent(MasterProcedureEnv env) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    return (TransitRegionStateProcedure) env.getMasterServices().getMasterProcedureExecutor()<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      .getProcedure(getParentProcId());<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>  private void unattach(MasterProcedureEnv env) {<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    getParent(env).unattachRemoteProc(this);<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>  // actually update the state to meta<a name="line.227"></a>
+<span class="sourceLineNo">228</span>  protected abstract void updateTransition(MasterProcedureEnv env, RegionStateNode regionNode,<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      TransitionCode transitionCode, long seqId) throws IOException;<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span>  @Override<a name="line.231"></a>
+<span class="sourceLineNo">232</span>  protected Procedure&lt;MasterProcedureEnv&gt;[] execute(MasterProcedureEnv env)<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      throws ProcedureYieldException, ProcedureSuspendedException, InterruptedException {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    RegionStateNode regionNode = getRegionNode(env);<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    regionNode.lock();<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    try {<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      switch (state) {<a name="line.237"></a>
+<span class="sourceLineNo">238</span>        case REGION_REMOTE_PROCEDURE_DISPATCH: {<a name="line.238"></a>
+<span class="sourceLineNo">239</span>          // The code which wakes us up also needs to lock the RSN so here we do not need to<a name="line.239"></a>
+<span class="sourceLineNo">240</span>          // synchronize<a name="line.240"></a>
+<span class="sourceLineNo">241</span>          // on the event.<a name="line.241"></a>
+<span class="sourceLineNo">242</span>          ProcedureEvent&lt;?&gt; event = regionNode.getProcedureEvent();<a name="line.242"></a>
+<span class="sourceLineNo">243</span>          try {<a name="line.243"></a>
+<span class="sourceLineNo">244</span>            env.getRemoteDispatcher().addOperationToNode(targetServer, this);<a name="line.244"></a>
+<span class="sourceLineNo">245</span>          } catch (FailedRemoteDispatchException e) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>            LOG.warn("Can not add remote operation {} for region {} to server {}, this usually " +<a name="line.246"></a>
+<span class="sourceLineNo">247</span>              "because the server is alread dead, give up and mark the procedure as complete, " +<a name="line.247"></a>
+<span class="sourceLineNo">248</span>              "the parent procedure will take care of this.", this, region, targetServer, e);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>            unattach(env);<a name="line.249"></a>
+<span class="sourceLineNo">250</span>            return null;<a name="line.250"></a>
+<span class="sourceLineNo">251</span>          }<a name="line.251"></a>
+<span class="sourceLineNo">252</span>          event.suspend();<a name="line.252"></a>
+<span class="sourceLineNo">253</span>          event.suspendIfNotReady(this);<a name="line.253"></a>
+<span class="sourceLineNo">254</span>          throw new ProcedureSuspendedException();<a name="line.254"></a>
+<span class="sourceLineNo">255</span>        }<a name="line.255"></a>
+<span class="sourceLineNo">256</span>        case REGION_REMOTE_PROCEDURE_REPORT_SUCCEED:<a name="line.256"></a>
+<span class="sourceLineNo">257</span>          updateTransition(env, regionNode, transitionCode, seqId);<a name="line.257"></a>
+<span class="sourceLineNo">258</span>          unattach(env);<a name="line.258"></a>
+<span class="sourceLineNo">259</span>          return null;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>        case REGION_REMOTE_PROCEDURE_DISPATCH_FAIL:<a name="line.260"></a>
+<span class="sourceLineNo">261</span>          // the remote call is failed so we do not need to change the region state, just return.<a name="line.261"></a>
+<span class="sourceLineNo">262</span>          unattach(env);<a name="line.262"></a>
+<span class="sourceLineNo">263</span>          return null;<a name="line.263"></a>
+<span class="sourceLineNo">264</span>        case REGION_REMOTE_PROCEDURE_SERVER_CRASH:<a name="line.264"></a>
+<span class="sourceLineNo">265</span>          env.getAssignmentManager().regionClosed(regionNode, false);<a name="line.265"></a>
+<span class="sourceLineNo">266</span>          unattach(env);<a name="line.266"></a>
+<span class="sourceLineNo">267</span>          return null;<a name="line.267"></a>
+<span class="sourceLineNo">268</span>        default:<a name="line.268"></a>
+<span class="sourceLineNo">269</span>          throw new IllegalStateException("Unknown state: " + state);<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      }<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    } catch (IOException e) {<a name="line.271"></a>
+<span class="sourceLineNo">272</span>      if (retryCounter == null) {<a name="line.272"></a>
+<span class="sourceLineNo">273</span>        retryCounter = ProcedureUtil.createRetryCounter(env.getMasterConfiguration());<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      }<a name="line.274"></a>
+<span class="sourceLineNo">275</span>      long backoff = retryCounter.getBackoffTimeAndIncrementAttempts();<a name="line.275"></a>
+<span class="sourceLineNo">276</span>      LOG.warn("Failed updating meta, suspend {}secs {}; {};", backoff / 1000, this, regionNode, e);<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      setTimeout(Math.toIntExact(backoff));<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      setState(ProcedureProtos.ProcedureState.WAITING_TIMEOUT);<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      skipPersistence();<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      throw new ProcedureSuspendedException();<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    } finally {<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      regionNode.unlock();<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    }<a name="line.283"></a>
+<span class="sourceLineNo">284</span>  }<a name="line.284"></a>
+<span class="sourceLineNo">285</span><a name="line.285"></a>
+<span class="sourceLineNo">286</span>  @Override<a name="line.286"></a>
+<span class="sourceLineNo">287</span>  public boolean storeInDispatchedQueue() {<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    return false;<a name="line.288"></a>
+<span class="sourceLineNo">289</span>  }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>  @Override<a name="line.291"></a>
+<span class="sourceLineNo">292</span>  protected void serializeStateData(ProcedureStateSerializer serializer) throws IOException {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    RegionRemoteProcedureBaseStateData.Builder builder =<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      RegionRemoteProcedureBaseStateData.newBuilder().setRegion(ProtobufUtil.toRegionInfo(region))<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        .setTargetServer(ProtobufUtil.toServerName(targetServer)).setState(state);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    if (transitionCode != null) {<a name="line.296"></a>
+<span class="sourceLineNo">297</span>      builder.setTransitionCode(transitionCode);<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      builder.setSeqId(seqId);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    }<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    serializer.serialize(builder.build());<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>  @Override<a name="line.303"></a>
+<span class="sourceLineNo">304</span>  protected void deserializeStateData(ProcedureStateSerializer serializer) throws IOException {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    RegionRemoteProcedureBaseStateData data =<a name="line.305"></a>
+<span class="sourceLineNo">306</span>      serializer.deserialize(RegionRemoteProcedureBaseStateData.class);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    region = ProtobufUtil.toRegionInfo(data.getRegion());<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    targetServer = ProtobufUtil.toServerName(data.getTargetServer());<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    state = data.getState();<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    if (data.hasTransitionCode()) {<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      transitionCode = data.getTransitionCode();<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      seqId = data.getSeqId();<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><a name="line.315"></a>
+<span class="sourceLineNo">316</span>  @Override<a name="line.316"></a>
+<span class="sourceLineNo">317</span>  protected void afterReplay(MasterProcedureEnv env) {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    getParent(env).attachRemoteProc(this);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  }<a name="line.319"></a>
+<span class="sourceLineNo">320</span>}<a name="line.320"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.TransitionType.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.TransitionType.html
index 05e9fa7..6c6c639 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.TransitionType.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.TransitionType.html
@@ -44,522 +44,526 @@
 <span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.procedure2.ProcedureSuspendedException;<a name="line.36"></a>
 <span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.procedure2.ProcedureUtil;<a name="line.37"></a>
 <span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.procedure2.ProcedureYieldException;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.slf4j.Logger;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.slf4j.LoggerFactory;<a name="line.41"></a>
-<span class="sourceLineNo">042</span><a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.43"></a>
-<span class="sourceLineNo">044</span><a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionState;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionStateData;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionTransitionType;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode;<a name="line.50"></a>
-<span class="sourceLineNo">051</span><a name="line.51"></a>
-<span class="sourceLineNo">052</span>/**<a name="line.52"></a>
-<span class="sourceLineNo">053</span> * The procedure to deal with the state transition of a region. A region with a TRSP in place is<a name="line.53"></a>
-<span class="sourceLineNo">054</span> * called RIT, i.e, RegionInTransition.<a name="line.54"></a>
-<span class="sourceLineNo">055</span> * &lt;p/&gt;<a name="line.55"></a>
-<span class="sourceLineNo">056</span> * It can be used to assign/unassign/reopen/move a region, and for<a name="line.56"></a>
-<span class="sourceLineNo">057</span> * {@link #unassign(MasterProcedureEnv, RegionInfo)} and<a name="line.57"></a>
-<span class="sourceLineNo">058</span> * {@link #reopen(MasterProcedureEnv, RegionInfo)}, you do not need to specify a target server, and<a name="line.58"></a>
-<span class="sourceLineNo">059</span> * for {@link #assign(MasterProcedureEnv, RegionInfo, ServerName)} and<a name="line.59"></a>
-<span class="sourceLineNo">060</span> * {@link #move(MasterProcedureEnv, RegionInfo, ServerName)}, if you want to you can provide a<a name="line.60"></a>
-<span class="sourceLineNo">061</span> * target server. And for {@link #move(MasterProcedureEnv, RegionInfo, ServerName)}, if you do not<a name="line.61"></a>
-<span class="sourceLineNo">062</span> * specify a targetServer, we will select one randomly.<a name="line.62"></a>
-<span class="sourceLineNo">063</span> * &lt;p/&gt;<a name="line.63"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.util.RetryCounter;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.slf4j.Logger;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.slf4j.LoggerFactory;<a name="line.42"></a>
+<span class="sourceLineNo">043</span><a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.44"></a>
+<span class="sourceLineNo">045</span><a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionState;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionStateData;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionTransitionType;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode;<a name="line.51"></a>
+<span class="sourceLineNo">052</span><a name="line.52"></a>
+<span class="sourceLineNo">053</span>/**<a name="line.53"></a>
+<span class="sourceLineNo">054</span> * The procedure to deal with the state transition of a region. A region with a TRSP in place is<a name="line.54"></a>
+<span class="sourceLineNo">055</span> * called RIT, i.e, RegionInTransition.<a name="line.55"></a>
+<span class="sourceLineNo">056</span> * &lt;p/&gt;<a name="line.56"></a>
+<span class="sourceLineNo">057</span> * It can be used to assign/unassign/reopen/move a region, and for<a name="line.57"></a>
+<span class="sourceLineNo">058</span> * {@link #unassign(MasterProcedureEnv, RegionInfo)} and<a name="line.58"></a>
+<span class="sourceLineNo">059</span> * {@link #reopen(MasterProcedureEnv, RegionInfo)}, you do not need to specify a target server, and<a name="line.59"></a>
+<span class="sourceLineNo">060</span> * for {@link #assign(MasterProcedureEnv, RegionInfo, ServerName)} and<a name="line.60"></a>
+<span class="sourceLineNo">061</span> * {@link #move(MasterProcedureEnv, RegionInfo, ServerName)}, if you want to you can provide a<a name="line.61"></a>
+<span class="sourceLineNo">062</span> * target server. And for {@link #move(MasterProcedureEnv, RegionInfo, ServerName)}, if you do not<a name="line.62"></a>
+<span class="sourceLineNo">063</span> * specify a targetServer, we will select one randomly.<a name="line.63"></a>
 <span class="sourceLineNo">064</span> * &lt;p/&gt;<a name="line.64"></a>
-<span class="sourceLineNo">065</span> * The typical state transition for assigning a region is:<a name="line.65"></a>
-<span class="sourceLineNo">066</span> *<a name="line.66"></a>
-<span class="sourceLineNo">067</span> * &lt;pre&gt;<a name="line.67"></a>
-<span class="sourceLineNo">068</span> * GET_ASSIGN_CANDIDATE ------&gt; OPEN -----&gt; CONFIRM_OPENED<a name="line.68"></a>
-<span class="sourceLineNo">069</span> * &lt;/pre&gt;<a name="line.69"></a>
-<span class="sourceLineNo">070</span> *<a name="line.70"></a>
-<span class="sourceLineNo">071</span> * Notice that, if there are failures we may go back to the {@code GET_ASSIGN_CANDIDATE} state to<a name="line.71"></a>
-<span class="sourceLineNo">072</span> * try again.<a name="line.72"></a>
-<span class="sourceLineNo">073</span> * &lt;p/&gt;<a name="line.73"></a>
-<span class="sourceLineNo">074</span> * The typical state transition for unassigning a region is:<a name="line.74"></a>
-<span class="sourceLineNo">075</span> *<a name="line.75"></a>
-<span class="sourceLineNo">076</span> * &lt;pre&gt;<a name="line.76"></a>
-<span class="sourceLineNo">077</span> * CLOSE -----&gt; CONFIRM_CLOSED<a name="line.77"></a>
-<span class="sourceLineNo">078</span> * &lt;/pre&gt;<a name="line.78"></a>
-<span class="sourceLineNo">079</span> *<a name="line.79"></a>
-<span class="sourceLineNo">080</span> * Here things go a bit different, if there are failures, especially that if there is a server<a name="line.80"></a>
-<span class="sourceLineNo">081</span> * crash, we will go to the {@code GET_ASSIGN_CANDIDATE} state to bring the region online first, and<a name="line.81"></a>
-<span class="sourceLineNo">082</span> * then go through the normal way to unassign it.<a name="line.82"></a>
-<span class="sourceLineNo">083</span> * &lt;p/&gt;<a name="line.83"></a>
-<span class="sourceLineNo">084</span> * The typical state transition for reopening/moving a region is:<a name="line.84"></a>
-<span class="sourceLineNo">085</span> *<a name="line.85"></a>
-<span class="sourceLineNo">086</span> * &lt;pre&gt;<a name="line.86"></a>
-<span class="sourceLineNo">087</span> * CLOSE -----&gt; CONFIRM_CLOSED -----&gt; GET_ASSIGN_CANDIDATE ------&gt; OPEN -----&gt; CONFIRM_OPENED<a name="line.87"></a>
-<span class="sourceLineNo">088</span> * &lt;/pre&gt;<a name="line.88"></a>
-<span class="sourceLineNo">089</span> *<a name="line.89"></a>
-<span class="sourceLineNo">090</span> * The retry logic is the same with the above assign/unassign.<a name="line.90"></a>
-<span class="sourceLineNo">091</span> * &lt;p/&gt;<a name="line.91"></a>
-<span class="sourceLineNo">092</span> * Notice that, although we allow specify a target server, it just acts as a candidate, we do not<a name="line.92"></a>
-<span class="sourceLineNo">093</span> * guarantee that the region will finally be on the target server. If this is important for you, you<a name="line.93"></a>
-<span class="sourceLineNo">094</span> * should check whether the region is on the target server after the procedure is finished.<a name="line.94"></a>
-<span class="sourceLineNo">095</span> * &lt;p/&gt;<a name="line.95"></a>
-<span class="sourceLineNo">096</span> * When you want to schedule a TRSP, please check whether there is still one for this region, and<a name="line.96"></a>
-<span class="sourceLineNo">097</span> * the check should be under the RegionStateNode lock. We will remove the TRSP from a<a name="line.97"></a>
-<span class="sourceLineNo">098</span> * RegionStateNode when we are done, see the code in {@code reportTransition} method below. There<a name="line.98"></a>
-<span class="sourceLineNo">099</span> * could be at most one TRSP for a give region.<a name="line.99"></a>
-<span class="sourceLineNo">100</span> */<a name="line.100"></a>
-<span class="sourceLineNo">101</span>@InterfaceAudience.Private<a name="line.101"></a>
-<span class="sourceLineNo">102</span>public class TransitRegionStateProcedure<a name="line.102"></a>
-<span class="sourceLineNo">103</span>    extends AbstractStateMachineRegionProcedure&lt;RegionStateTransitionState&gt; {<a name="line.103"></a>
-<span class="sourceLineNo">104</span><a name="line.104"></a>
-<span class="sourceLineNo">105</span>  private static final Logger LOG = LoggerFactory.getLogger(TransitRegionStateProcedure.class);<a name="line.105"></a>
-<span class="sourceLineNo">106</span><a name="line.106"></a>
-<span class="sourceLineNo">107</span>  private TransitionType type;<a name="line.107"></a>
-<span class="sourceLineNo">108</span><a name="line.108"></a>
-<span class="sourceLineNo">109</span>  private RegionStateTransitionState initialState;<a name="line.109"></a>
-<span class="sourceLineNo">110</span><a name="line.110"></a>
-<span class="sourceLineNo">111</span>  private RegionStateTransitionState lastState;<a name="line.111"></a>
-<span class="sourceLineNo">112</span><a name="line.112"></a>
-<span class="sourceLineNo">113</span>  // the candidate where we want to assign the region to.<a name="line.113"></a>
-<span class="sourceLineNo">114</span>  private ServerName assignCandidate;<a name="line.114"></a>
-<span class="sourceLineNo">115</span><a name="line.115"></a>
-<span class="sourceLineNo">116</span>  private boolean forceNewPlan;<a name="line.116"></a>
-<span class="sourceLineNo">117</span><a name="line.117"></a>
-<span class="sourceLineNo">118</span>  private int attempt;<a name="line.118"></a>
-<span class="sourceLineNo">119</span><a name="line.119"></a>
-<span class="sourceLineNo">120</span>  private RegionRemoteProcedureBase remoteProc;<a name="line.120"></a>
-<span class="sourceLineNo">121</span><a name="line.121"></a>
-<span class="sourceLineNo">122</span>  public TransitRegionStateProcedure() {<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  }<a name="line.123"></a>
-<span class="sourceLineNo">124</span><a name="line.124"></a>
-<span class="sourceLineNo">125</span>  private void setInitalAndLastState() {<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    switch (type) {<a name="line.126"></a>
-<span class="sourceLineNo">127</span>      case ASSIGN:<a name="line.127"></a>
-<span class="sourceLineNo">128</span>        initialState = RegionStateTransitionState.REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE;<a name="line.128"></a>
-<span class="sourceLineNo">129</span>        lastState = RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_OPENED;<a name="line.129"></a>
-<span class="sourceLineNo">130</span>        break;<a name="line.130"></a>
-<span class="sourceLineNo">131</span>      case UNASSIGN:<a name="line.131"></a>
-<span class="sourceLineNo">132</span>        initialState = RegionStateTransitionState.REGION_STATE_TRANSITION_CLOSE;<a name="line.132"></a>
-<span class="sourceLineNo">133</span>        lastState = RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_CLOSED;<a name="line.133"></a>
-<span class="sourceLineNo">134</span>        break;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      case MOVE:<a name="line.135"></a>
-<span class="sourceLineNo">136</span>      case REOPEN:<a name="line.136"></a>
-<span class="sourceLineNo">137</span>        initialState = RegionStateTransitionState.REGION_STATE_TRANSITION_CLOSE;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>        lastState = RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_OPENED;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>        break;<a name="line.139"></a>
-<span class="sourceLineNo">140</span>      default:<a name="line.140"></a>
-<span class="sourceLineNo">141</span>        throw new IllegalArgumentException("Unknown TransitionType: " + type);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    }<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  }<a name="line.143"></a>
-<span class="sourceLineNo">144</span><a name="line.144"></a>
-<span class="sourceLineNo">145</span>  @VisibleForTesting<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  protected TransitRegionStateProcedure(MasterProcedureEnv env, RegionInfo hri,<a name="line.146"></a>
-<span class="sourceLineNo">147</span>      ServerName assignCandidate, boolean forceNewPlan, TransitionType type) {<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    super(env, hri);<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    this.assignCandidate = assignCandidate;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    this.forceNewPlan = forceNewPlan;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    this.type = type;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    setInitalAndLastState();<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  }<a name="line.153"></a>
-<span class="sourceLineNo">154</span><a name="line.154"></a>
-<span class="sourceLineNo">155</span>  @Override<a name="line.155"></a>
-<span class="sourceLineNo">156</span>  public TableOperationType getTableOperationType() {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    // TODO: maybe we should make another type here, REGION_TRANSITION?<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    return TableOperationType.REGION_EDIT;<a name="line.158"></a>
-<span class="sourceLineNo">159</span>  }<a name="line.159"></a>
-<span class="sourceLineNo">160</span><a name="line.160"></a>
-<span class="sourceLineNo">161</span>  @Override<a name="line.161"></a>
-<span class="sourceLineNo">162</span>  protected boolean waitInitialized(MasterProcedureEnv env) {<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    if (TableName.isMetaTableName(getTableName())) {<a name="line.163"></a>
-<span class="sourceLineNo">164</span>      return false;<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    }<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    // First we need meta to be loaded, and second, if meta is not online then we will likely to<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    // fail when updating meta so we wait until it is assigned.<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    AssignmentManager am = env.getAssignmentManager();<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    return am.waitMetaLoaded(this) || am.waitMetaAssigned(this, getRegion());<a name="line.169"></a>
-<span class="sourceLineNo">170</span>  }<a name="line.170"></a>
-<span class="sourceLineNo">171</span><a name="line.171"></a>
-<span class="sourceLineNo">172</span>  private void queueAssign(MasterProcedureEnv env, RegionStateNode regionNode)<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      throws ProcedureSuspendedException {<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    // Here the assumption is that, the region must be in CLOSED state, so the region location<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    // will be null. And if we fail to open the region and retry here, the forceNewPlan will be<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    // true, and also we will set the region location to null.<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    boolean retain = false;<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    if (!forceNewPlan) {<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      if (assignCandidate != null) {<a name="line.179"></a>
-<span class="sourceLineNo">180</span>        retain = assignCandidate.equals(regionNode.getLastHost());<a name="line.180"></a>
-<span class="sourceLineNo">181</span>        regionNode.setRegionLocation(assignCandidate);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      } else if (regionNode.getLastHost() != null) {<a name="line.182"></a>
-<span class="sourceLineNo">183</span>        retain = true;<a name="line.183"></a>
-<span class="sourceLineNo">184</span>        LOG.info("Setting lastHost as the region location {}", regionNode.getLastHost());<a name="line.184"></a>
-<span class="sourceLineNo">185</span>        regionNode.setRegionLocation(regionNode.getLastHost());<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      }<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    }<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    LOG.info("Starting {}; {}; forceNewPlan={}, retain={}", this, regionNode.toShortString(),<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      forceNewPlan, retain);<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    env.getAssignmentManager().queueAssign(regionNode);<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_OPEN);<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    if (regionNode.getProcedureEvent().suspendIfNotReady(this)) {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      throw new ProcedureSuspendedException();<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    }<a name="line.194"></a>
-<span class="sourceLineNo">195</span>  }<a name="line.195"></a>
-<span class="sourceLineNo">196</span><a name="line.196"></a>
-<span class="sourceLineNo">197</span>  private void openRegion(MasterProcedureEnv env, RegionStateNode regionNode) throws IOException {<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    ServerName loc = regionNode.getRegionLocation();<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    if (loc == null) {<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      LOG.warn("No location specified for {}, jump back to state {} to get one", getRegion(),<a name="line.200"></a>
-<span class="sourceLineNo">201</span>        RegionStateTransitionState.REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE);<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE);<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      return;<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    }<a name="line.204"></a>
-<span class="sourceLineNo">205</span>    env.getAssignmentManager().regionOpening(regionNode);<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    addChildProcedure(new OpenRegionProcedure(this, getRegion(), loc));<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_OPENED);<a name="line.207"></a>
-<span class="sourceLineNo">208</span>  }<a name="line.208"></a>
-<span class="sourceLineNo">209</span><a name="line.209"></a>
-<span class="sourceLineNo">210</span>  private Flow confirmOpened(MasterProcedureEnv env, RegionStateNode regionNode)<a name="line.210"></a>
-<span class="sourceLineNo">211</span>      throws IOException {<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    if (regionNode.isInState(State.OPEN)) {<a name="line.212"></a>
-<span class="sourceLineNo">213</span>      attempt = 0;<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      if (lastState == RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_OPENED) {<a name="line.214"></a>
-<span class="sourceLineNo">215</span>        // we are the last state, finish<a name="line.215"></a>
-<span class="sourceLineNo">216</span>        regionNode.unsetProcedure(this);<a name="line.216"></a>
-<span class="sourceLineNo">217</span>        ServerCrashProcedure.updateProgress(env, getParentProcId());<a name="line.217"></a>
-<span class="sourceLineNo">218</span>        return Flow.NO_MORE_STATE;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      }<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      // It is possible that we arrive here but confirm opened is not the last state, for example,<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      // when merging or splitting a region, we unassign the region from a RS and the RS is crashed,<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      // then there will be recovered edits for this region, we'd better make the region online<a name="line.222"></a>
-<span class="sourceLineNo">223</span>      // again and then unassign it, otherwise we have to fail the merge/split procedure as we may<a name="line.223"></a>
-<span class="sourceLineNo">224</span>      // loss data.<a name="line.224"></a>
-<span class="sourceLineNo">225</span>      setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_CLOSE);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>      return Flow.HAS_MORE_STATE;<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    }<a name="line.227"></a>
-<span class="sourceLineNo">228</span><a name="line.228"></a>
-<span class="sourceLineNo">229</span>    int retries = env.getAssignmentManager().getRegionStates().addToFailedOpen(regionNode)<a name="line.229"></a>
-<span class="sourceLineNo">230</span>        .incrementAndGetRetries();<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    int maxAttempts = env.getAssignmentManager().getAssignMaxAttempts();<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    LOG.info("Retry={} of max={}; {}; {}", retries, maxAttempts, this, regionNode.toShortString());<a name="line.232"></a>
-<span class="sourceLineNo">233</span><a name="line.233"></a>
-<span class="sourceLineNo">234</span>    if (retries &gt;= maxAttempts) {<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      env.getAssignmentManager().regionFailedOpen(regionNode, true);<a name="line.235"></a>
-<span class="sourceLineNo">236</span>      setFailure(getClass().getSimpleName(), new RetriesExhaustedException(<a name="line.236"></a>
-<span class="sourceLineNo">237</span>        "Max attempts " + env.getAssignmentManager().getAssignMaxAttempts() + " exceeded"));<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      regionNode.unsetProcedure(this);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      return Flow.NO_MORE_STATE;<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    }<a name="line.240"></a>
-<span class="sourceLineNo">241</span><a name="line.241"></a>
-<span class="sourceLineNo">242</span>    env.getAssignmentManager().regionFailedOpen(regionNode, false);<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    // we failed to assign the region, force a new plan<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    forceNewPlan = true;<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    regionNode.setRegionLocation(null);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE);<a name="line.246"></a>
-<span class="sourceLineNo">247</span><a name="line.247"></a>
-<span class="sourceLineNo">248</span>    if (retries &gt; env.getAssignmentManager().getAssignRetryImmediatelyMaxAttempts()) {<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      // Throw exception to backoff and retry when failed open too many times<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      throw new HBaseIOException("Failed to open region");<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    } else {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      // Here we do not throw exception because we want to the region to be online ASAP<a name="line.252"></a>
-<span class="sourceLineNo">253</span>      return Flow.HAS_MORE_STATE;<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    }<a name="line.254"></a>
-<span class="sourceLineNo">255</span>  }<a name="line.255"></a>
-<span class="sourceLineNo">256</span><a name="line.256"></a>
-<span class="sourceLineNo">257</span>  private void closeRegion(MasterProcedureEnv env, RegionStateNode regionNode) throws IOException {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    if (regionNode.isInState(State.OPEN, State.CLOSING, State.MERGING, State.SPLITTING)) {<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      // this is the normal case<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      env.getAssignmentManager().regionClosing(regionNode);<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      addChildProcedure(new CloseRegionProcedure(this, getRegion(), regionNode.getRegionLocation(),<a name="line.261"></a>
-<span class="sourceLineNo">262</span>        assignCandidate));<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_CLOSED);<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    } else {<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      forceNewPlan = true;<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      regionNode.setRegionLocation(null);<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE);<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    }<a name="line.268"></a>
-<span class="sourceLineNo">269</span>  }<a name="line.269"></a>
-<span class="sourceLineNo">270</span><a name="line.270"></a>
-<span class="sourceLineNo">271</span>  private Flow confirmClosed(MasterProcedureEnv env, RegionStateNode regionNode)<a name="line.271"></a>
-<span class="sourceLineNo">272</span>      throws IOException {<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    if (regionNode.isInState(State.CLOSED)) {<a name="line.273"></a>
-<span class="sourceLineNo">274</span>      attempt = 0;<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      if (lastState == RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_CLOSED) {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>        // we are the last state, finish<a name="line.276"></a>
-<span class="sourceLineNo">277</span>        regionNode.unsetProcedure(this);<a name="line.277"></a>
-<span class="sourceLineNo">278</span>        return Flow.NO_MORE_STATE;<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      }<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      // This means we need to open the region again, should be a move or reopen<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      return Flow.HAS_MORE_STATE;<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    }<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    if (regionNode.isInState(State.CLOSING)) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      // This is possible, think the target RS crashes and restarts immediately, the close region<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      // operation will return a NotServingRegionException soon, we can only recover after SCP takes<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      // care of this RS. So here we throw an IOException to let upper layer to retry with backoff.<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_CLOSE);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      throw new HBaseIOException("Failed to close region");<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    }<a name="line.290"></a>
-<span class="sourceLineNo">291</span>    // abnormally closed, need to reopen it, no matter what is the last state, see the comment in<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    // confirmOpened for more details that why we need to reopen the region first even if we just<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    // want to close it.<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    // The only exception is for non-default replica, where we do not need to deal with recovered<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    // edits. Notice that the region will remain in ABNORMALLY_CLOSED state, the upper layer need to<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    // deal with this state. For non-default replica, this is usually the same with CLOSED.<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    assert regionNode.isInState(State.ABNORMALLY_CLOSED);<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    if (!RegionReplicaUtil.isDefaultReplica(getRegion()) &amp;&amp;<a name="line.298"></a>
-<span class="sourceLineNo">299</span>      lastState == RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_CLOSED) {<a name="line.299"></a>
-<span class="sourceLineNo">300</span>      regionNode.unsetProcedure(this);<a name="line.300"></a>
-<span class="sourceLineNo">301</span>      return Flow.NO_MORE_STATE;<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    }<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    attempt = 0;<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE);<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    return Flow.HAS_MORE_STATE;<a name="line.305"></a>
-<span class="sourceLineNo">306</span>  }<a name="line.306"></a>
-<span class="sourceLineNo">307</span><a name="line.307"></a>
-<span class="sourceLineNo">308</span>  // Override to lock RegionStateNode<a name="line.308"></a>
-<span class="sourceLineNo">309</span>  @SuppressWarnings("rawtypes")<a name="line.309"></a>
-<span class="sourceLineNo">310</span>  @Override<a name="line.310"></a>
-<span class="sourceLineNo">311</span>  protected Procedure[] execute(MasterProcedureEnv env)<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      throws ProcedureSuspendedException, ProcedureYieldException, InterruptedException {<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    RegionStateNode regionNode =<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      env.getAssignmentManager().getRegionStates().getOrCreateRegionStateNode(getRegion());<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    regionNode.lock();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    try {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>      return super.execute(env);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>    } finally {<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      regionNode.unlock();<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    }<a name="line.320"></a>
-<span class="sourceLineNo">321</span>  }<a name="line.321"></a>
-<span class="sourceLineNo">322</span><a name="line.322"></a>
-<span class="sourceLineNo">323</span>  private RegionStateNode getRegionStateNode(MasterProcedureEnv env) {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    return env.getAssignmentManager().getRegionStates().getOrCreateRegionStateNode(getRegion());<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>  @Override<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  protected Flow executeFromState(MasterProcedureEnv env, RegionStateTransitionState state)<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      throws ProcedureSuspendedException, ProcedureYieldException, InterruptedException {<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    RegionStateNode regionNode = getRegionStateNode(env);<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    try {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      switch (state) {<a name="line.332"></a>
-<span class="sourceLineNo">333</span>        case REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE:<a name="line.333"></a>
-<span class="sourceLineNo">334</span>          queueAssign(env, regionNode);<a name="line.334"></a>
-<span class="sourceLineNo">335</span>          return Flow.HAS_MORE_STATE;<a name="line.335"></a>
-<span class="sourceLineNo">336</span>        case REGION_STATE_TRANSITION_OPEN:<a name="line.336"></a>
-<span class="sourceLineNo">337</span>          openRegion(env, regionNode);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>          return Flow.HAS_MORE_STATE;<a name="line.338"></a>
-<span class="sourceLineNo">339</span>        case REGION_STATE_TRANSITION_CONFIRM_OPENED:<a name="line.339"></a>
-<span class="sourceLineNo">340</span>          return confirmOpened(env, regionNode);<a name="line.340"></a>
-<span class="sourceLineNo">341</span>        case REGION_STATE_TRANSITION_CLOSE:<a name="line.341"></a>
-<span class="sourceLineNo">342</span>          closeRegion(env, regionNode);<a name="line.342"></a>
-<span class="sourceLineNo">343</span>          return Flow.HAS_MORE_STATE;<a name="line.343"></a>
-<span class="sourceLineNo">344</span>        case REGION_STATE_TRANSITION_CONFIRM_CLOSED:<a name="line.344"></a>
-<span class="sourceLineNo">345</span>          return confirmClosed(env, regionNode);<a name="line.345"></a>
-<span class="sourceLineNo">346</span>        default:<a name="line.346"></a>
-<span class="sourceLineNo">347</span>          throw new UnsupportedOperationException("unhandled state=" + state);<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      }<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    } catch (IOException e) {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>      long backoff = ProcedureUtil.getBackoffTimeMs(this.attempt++);<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      LOG.warn(<a name="line.351"></a>
-<span class="sourceLineNo">352</span>        "Failed transition, suspend {}secs {}; {}; waiting on rectified condition fixed " +<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          "by other Procedure or operator intervention",<a name="line.353"></a>
-<span class="sourceLineNo">354</span>        backoff / 1000, this, regionNode.toShortString(), e);<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      setTimeout(Math.toIntExact(backoff));<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      setState(ProcedureProtos.ProcedureState.WAITING_TIMEOUT);<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      skipPersistence();<a name="line.357"></a>
-<span class="sourceLineNo">358</span>      throw new ProcedureSuspendedException();<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><a name="line.361"></a>
-<span class="sourceLineNo">362</span>  /**<a name="line.362"></a>
-<span class="sourceLineNo">363</span>   * At end of timeout, wake ourselves up so we run again.<a name="line.363"></a>
-<span class="sourceLineNo">364</span>   */<a name="line.364"></a>
-<span class="sourceLineNo">365</span>  @Override<a name="line.365"></a>
-<span class="sourceLineNo">366</span>  protected synchronized boolean setTimeoutFailure(MasterProcedureEnv env) {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    setState(ProcedureProtos.ProcedureState.RUNNABLE);<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    env.getProcedureScheduler().addFront(this);<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    return false; // 'false' means that this procedure handled the timeout<a name="line.369"></a>
-<span class="sourceLineNo">370</span>  }<a name="line.370"></a>
-<span class="sourceLineNo">371</span><a name="line.371"></a>
-<span class="sourceLineNo">372</span>  // Should be called with RegionStateNode locked<a name="line.372"></a>
-<span class="sourceLineNo">373</span>  public void reportTransition(MasterProcedureEnv env, RegionStateNode regionNode,<a name="line.373"></a>
-<span class="sourceLineNo">374</span>      ServerName serverName, TransitionCode code, long seqId, long procId) throws IOException {<a name="line.374"></a>
-<span class="sourceLineNo">375</span>    if (remoteProc == null) {<a name="line.375"></a>
-<span class="sourceLineNo">376</span>      LOG.warn(<a name="line.376"></a>
-<span class="sourceLineNo">377</span>        "There is no outstanding remote region procedure for {}, serverName={}, code={}," +<a name="line.377"></a>
-<span class="sourceLineNo">378</span>          " seqId={}, proc={}, should be a retry, ignore",<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        regionNode, serverName, code, seqId, this);<a name="line.379"></a>
-<span class="sourceLineNo">380</span>      return;<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    }<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    // The procId could be -1 if it is from an old region server, we need to deal with it so that we<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    // can do rolling upgraing.<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    if (procId &gt;= 0 &amp;&amp; remoteProc.getProcId() != procId) {<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      LOG.warn(<a name="line.385"></a>
-<span class="sourceLineNo">386</span>        "The pid of remote region procedure for {} is {}, the reported pid={}, serverName={}," +<a name="line.386"></a>
-<span class="sourceLineNo">387</span>          " code={}, seqId={}, proc={}, should be a retry, ignore",<a name="line.387"></a>
-<span class="sourceLineNo">388</span>        regionNode, remoteProc.getProcId(), procId, serverName, code, seqId, this);<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      return;<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    }<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    remoteProc.reportTransition(env, regionNode, serverName, code, seqId);<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>  // Should be called with RegionStateNode locked<a name="line.394"></a>
-<span class="sourceLineNo">395</span>  public void serverCrashed(MasterProcedureEnv env, RegionStateNode regionNode,<a name="line.395"></a>
-<span class="sourceLineNo">396</span>      ServerName serverName) throws IOException {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    if (remoteProc != null) {<a name="line.397"></a>
-<span class="sourceLineNo">398</span>      // this means we are waiting for the sub procedure, so wake it up<a name="line.398"></a>
-<span class="sourceLineNo">399</span>      remoteProc.serverCrashed(env, regionNode, serverName);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    } else {<a name="line.400"></a>
-<span class="sourceLineNo">401</span>      // we are in RUNNING state, just update the region state, and we will process it later.<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      env.getAssignmentManager().regionClosed(regionNode, false);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>  }<a name="line.404"></a>
-<span class="sourceLineNo">405</span><a name="line.405"></a>
-<span class="sourceLineNo">406</span>  void attachRemoteProc(RegionRemoteProcedureBase proc) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    this.remoteProc = proc;<a name="line.407"></a>
+<span class="sourceLineNo">065</span> * &lt;p/&gt;<a name="line.65"></a>
+<span class="sourceLineNo">066</span> * The typical state transition for assigning a region is:<a name="line.66"></a>
+<span class="sourceLineNo">067</span> *<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * &lt;pre&gt;<a name="line.68"></a>
+<span class="sourceLineNo">069</span> * GET_ASSIGN_CANDIDATE ------&gt; OPEN -----&gt; CONFIRM_OPENED<a name="line.69"></a>
+<span class="sourceLineNo">070</span> * &lt;/pre&gt;<a name="line.70"></a>
+<span class="sourceLineNo">071</span> *<a name="line.71"></a>
+<span class="sourceLineNo">072</span> * Notice that, if there are failures we may go back to the {@code GET_ASSIGN_CANDIDATE} state to<a name="line.72"></a>
+<span class="sourceLineNo">073</span> * try again.<a name="line.73"></a>
+<span class="sourceLineNo">074</span> * &lt;p/&gt;<a name="line.74"></a>
+<span class="sourceLineNo">075</span> * The typical state transition for unassigning a region is:<a name="line.75"></a>
+<span class="sourceLineNo">076</span> *<a name="line.76"></a>
+<span class="sourceLineNo">077</span> * &lt;pre&gt;<a name="line.77"></a>
+<span class="sourceLineNo">078</span> * CLOSE -----&gt; CONFIRM_CLOSED<a name="line.78"></a>
+<span class="sourceLineNo">079</span> * &lt;/pre&gt;<a name="line.79"></a>
+<span class="sourceLineNo">080</span> *<a name="line.80"></a>
+<span class="sourceLineNo">081</span> * Here things go a bit different, if there are failures, especially that if there is a server<a name="line.81"></a>
+<span class="sourceLineNo">082</span> * crash, we will go to the {@code GET_ASSIGN_CANDIDATE} state to bring the region online first, and<a name="line.82"></a>
+<span class="sourceLineNo">083</span> * then go through the normal way to unassign it.<a name="line.83"></a>
+<span class="sourceLineNo">084</span> * &lt;p/&gt;<a name="line.84"></a>
+<span class="sourceLineNo">085</span> * The typical state transition for reopening/moving a region is:<a name="line.85"></a>
+<span class="sourceLineNo">086</span> *<a name="line.86"></a>
+<span class="sourceLineNo">087</span> * &lt;pre&gt;<a name="line.87"></a>
+<span class="sourceLineNo">088</span> * CLOSE -----&gt; CONFIRM_CLOSED -----&gt; GET_ASSIGN_CANDIDATE ------&gt; OPEN -----&gt; CONFIRM_OPENED<a name="line.88"></a>
+<span class="sourceLineNo">089</span> * &lt;/pre&gt;<a name="line.89"></a>
+<span class="sourceLineNo">090</span> *<a name="line.90"></a>
+<span class="sourceLineNo">091</span> * The retry logic is the same with the above assign/unassign.<a name="line.91"></a>
+<span class="sourceLineNo">092</span> * &lt;p/&gt;<a name="line.92"></a>
+<span class="sourceLineNo">093</span> * Notice that, although we allow specify a target server, it just acts as a candidate, we do not<a name="line.93"></a>
+<span class="sourceLineNo">094</span> * guarantee that the region will finally be on the target server. If this is important for you, you<a name="line.94"></a>
+<span class="sourceLineNo">095</span> * should check whether the region is on the target server after the procedure is finished.<a name="line.95"></a>
+<span class="sourceLineNo">096</span> * &lt;p/&gt;<a name="line.96"></a>
+<span class="sourceLineNo">097</span> * When you want to schedule a TRSP, please check whether there is still one for this region, and<a name="line.97"></a>
+<span class="sourceLineNo">098</span> * the check should be under the RegionStateNode lock. We will remove the TRSP from a<a name="line.98"></a>
+<span class="sourceLineNo">099</span> * RegionStateNode when we are done, see the code in {@code reportTransition} method below. There<a name="line.99"></a>
+<span class="sourceLineNo">100</span> * could be at most one TRSP for a give region.<a name="line.100"></a>
+<span class="sourceLineNo">101</span> */<a name="line.101"></a>
+<span class="sourceLineNo">102</span>@InterfaceAudience.Private<a name="line.102"></a>
+<span class="sourceLineNo">103</span>public class TransitRegionStateProcedure<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    extends AbstractStateMachineRegionProcedure&lt;RegionStateTransitionState&gt; {<a name="line.104"></a>
+<span class="sourceLineNo">105</span><a name="line.105"></a>
+<span class="sourceLineNo">106</span>  private static final Logger LOG = LoggerFactory.getLogger(TransitRegionStateProcedure.class);<a name="line.106"></a>
+<span class="sourceLineNo">107</span><a name="line.107"></a>
+<span class="sourceLineNo">108</span>  private TransitionType type;<a name="line.108"></a>
+<span class="sourceLineNo">109</span><a name="line.109"></a>
+<span class="sourceLineNo">110</span>  private RegionStateTransitionState initialState;<a name="line.110"></a>
+<span class="sourceLineNo">111</span><a name="line.111"></a>
+<span class="sourceLineNo">112</span>  private RegionStateTransitionState lastState;<a name="line.112"></a>
+<span class="sourceLineNo">113</span><a name="line.113"></a>
+<span class="sourceLineNo">114</span>  // the candidate where we want to assign the region to.<a name="line.114"></a>
+<span class="sourceLineNo">115</span>  private ServerName assignCandidate;<a name="line.115"></a>
+<span class="sourceLineNo">116</span><a name="line.116"></a>
+<span class="sourceLineNo">117</span>  private boolean forceNewPlan;<a name="line.117"></a>
+<span class="sourceLineNo">118</span><a name="line.118"></a>
+<span class="sourceLineNo">119</span>  private RetryCounter retryCounter;<a name="line.119"></a>
+<span class="sourceLineNo">120</span><a name="line.120"></a>
+<span class="sourceLineNo">121</span>  private RegionRemoteProcedureBase remoteProc;<a name="line.121"></a>
+<span class="sourceLineNo">122</span><a name="line.122"></a>
+<span class="sourceLineNo">123</span>  public TransitRegionStateProcedure() {<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  }<a name="line.124"></a>
+<span class="sourceLineNo">125</span><a name="line.125"></a>
+<span class="sourceLineNo">126</span>  private void setInitalAndLastState() {<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    switch (type) {<a name="line.127"></a>
+<span class="sourceLineNo">128</span>      case ASSIGN:<a name="line.128"></a>
+<span class="sourceLineNo">129</span>        initialState = RegionStateTransitionState.REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE;<a name="line.129"></a>
+<span class="sourceLineNo">130</span>        lastState = RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_OPENED;<a name="line.130"></a>
+<span class="sourceLineNo">131</span>        break;<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      case UNASSIGN:<a name="line.132"></a>
+<span class="sourceLineNo">133</span>        initialState = RegionStateTransitionState.REGION_STATE_TRANSITION_CLOSE;<a name="line.133"></a>
+<span class="sourceLineNo">134</span>        lastState = RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_CLOSED;<a name="line.134"></a>
+<span class="sourceLineNo">135</span>        break;<a name="line.135"></a>
+<span class="sourceLineNo">136</span>      case MOVE:<a name="line.136"></a>
+<span class="sourceLineNo">137</span>      case REOPEN:<a name="line.137"></a>
+<span class="sourceLineNo">138</span>        initialState = RegionStateTransitionState.REGION_STATE_TRANSITION_CLOSE;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>        lastState = RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_OPENED;<a name="line.139"></a>
+<span class="sourceLineNo">140</span>        break;<a name="line.140"></a>
+<span class="sourceLineNo">141</span>      default:<a name="line.141"></a>
+<span class="sourceLineNo">142</span>        throw new IllegalArgumentException("Unknown TransitionType: " + type);<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    }<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  }<a name="line.144"></a>
+<span class="sourceLineNo">145</span><a name="line.145"></a>
+<span class="sourceLineNo">146</span>  @VisibleForTesting<a name="line.146"></a>
+<span class="sourceLineNo">147</span>  protected TransitRegionStateProcedure(MasterProcedureEnv env, RegionInfo hri,<a name="line.147"></a>
+<span class="sourceLineNo">148</span>      ServerName assignCandidate, boolean forceNewPlan, TransitionType type) {<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    super(env, hri);<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    this.assignCandidate = assignCandidate;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    this.forceNewPlan = forceNewPlan;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>    this.type = type;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    setInitalAndLastState();<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  }<a name="line.154"></a>
+<span class="sourceLineNo">155</span><a name="line.155"></a>
+<span class="sourceLineNo">156</span>  @Override<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  public TableOperationType getTableOperationType() {<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    // TODO: maybe we should make another type here, REGION_TRANSITION?<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    return TableOperationType.REGION_EDIT;<a name="line.159"></a>
+<span class="sourceLineNo">160</span>  }<a name="line.160"></a>
+<span class="sourceLineNo">161</span><a name="line.161"></a>
+<span class="sourceLineNo">162</span>  @Override<a name="line.162"></a>
+<span class="sourceLineNo">163</span>  protected boolean waitInitialized(MasterProcedureEnv env) {<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    if (TableName.isMetaTableName(getTableName())) {<a name="line.164"></a>
+<span class="sourceLineNo">165</span>      return false;<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    }<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    // First we need meta to be loaded, and second, if meta is not online then we will likely to<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    // fail when updating meta so we wait until it is assigned.<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    AssignmentManager am = env.getAssignmentManager();<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    return am.waitMetaLoaded(this) || am.waitMetaAssigned(this, getRegion());<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  }<a name="line.171"></a>
+<span class="sourceLineNo">172</span><a name="line.172"></a>
+<span class="sourceLineNo">173</span>  private void queueAssign(MasterProcedureEnv env, RegionStateNode regionNode)<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      throws ProcedureSuspendedException {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    // Here the assumption is that, the region must be in CLOSED state, so the region location<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    // will be null. And if we fail to open the region and retry here, the forceNewPlan will be<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    // true, and also we will set the region location to null.<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    boolean retain = false;<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    if (!forceNewPlan) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      if (assignCandidate != null) {<a name="line.180"></a>
+<span class="sourceLineNo">181</span>        retain = assignCandidate.equals(regionNode.getLastHost());<a name="line.181"></a>
+<span class="sourceLineNo">182</span>        regionNode.setRegionLocation(assignCandidate);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      } else if (regionNode.getLastHost() != null) {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>        retain = true;<a name="line.184"></a>
+<span class="sourceLineNo">185</span>        LOG.info("Setting lastHost as the region location {}", regionNode.getLastHost());<a name="line.185"></a>
+<span class="sourceLineNo">186</span>        regionNode.setRegionLocation(regionNode.getLastHost());<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      }<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    }<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    LOG.info("Starting {}; {}; forceNewPlan={}, retain={}", this, regionNode.toShortString(),<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      forceNewPlan, retain);<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    env.getAssignmentManager().queueAssign(regionNode);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_OPEN);<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    if (regionNode.getProcedureEvent().suspendIfNotReady(this)) {<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      throw new ProcedureSuspendedException();<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    }<a name="line.195"></a>
+<span class="sourceLineNo">196</span>  }<a name="line.196"></a>
+<span class="sourceLineNo">197</span><a name="line.197"></a>
+<span class="sourceLineNo">198</span>  private void openRegion(MasterProcedureEnv env, RegionStateNode regionNode) throws IOException {<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    ServerName loc = regionNode.getRegionLocation();<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    if (loc == null) {<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      LOG.warn("No location specified for {}, jump back to state {} to get one", getRegion(),<a name="line.201"></a>
+<span class="sourceLineNo">202</span>        RegionStateTransitionState.REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE);<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE);<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      return;<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    }<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    env.getAssignmentManager().regionOpening(regionNode);<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    addChildProcedure(new OpenRegionProcedure(this, getRegion(), loc));<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_OPENED);<a name="line.208"></a>
+<span class="sourceLineNo">209</span>  }<a name="line.209"></a>
+<span class="sourceLineNo">210</span><a name="line.210"></a>
+<span class="sourceLineNo">211</span>  private Flow confirmOpened(MasterProcedureEnv env, RegionStateNode regionNode)<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      throws IOException {<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    if (regionNode.isInState(State.OPEN)) {<a name="line.213"></a>
+<span class="sourceLineNo">214</span>      retryCounter = null;<a name="line.214"></a>
+<span class="sourceLineNo">215</span>      if (lastState == RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_OPENED) {<a name="line.215"></a>
+<span class="sourceLineNo">216</span>        // we are the last state, finish<a name="line.216"></a>
+<span class="sourceLineNo">217</span>        regionNode.unsetProcedure(this);<a name="line.217"></a>
+<span class="sourceLineNo">218</span>        ServerCrashProcedure.updateProgress(env, getParentProcId());<a name="line.218"></a>
+<span class="sourceLineNo">219</span>        return Flow.NO_MORE_STATE;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      }<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      // It is possible that we arrive here but confirm opened is not the last state, for example,<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      // when merging or splitting a region, we unassign the region from a RS and the RS is crashed,<a name="line.222"></a>
+<span class="sourceLineNo">223</span>      // then there will be recovered edits for this region, we'd better make the region online<a name="line.223"></a>
+<span class="sourceLineNo">224</span>      // again and then unassign it, otherwise we have to fail the merge/split procedure as we may<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      // loss data.<a name="line.225"></a>
+<span class="sourceLineNo">226</span>      setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_CLOSE);<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      return Flow.HAS_MORE_STATE;<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
+<span class="sourceLineNo">229</span><a name="line.229"></a>
+<span class="sourceLineNo">230</span>    int retries = env.getAssignmentManager().getRegionStates().addToFailedOpen(regionNode)<a name="line.230"></a>
+<span class="sourceLineNo">231</span>        .incrementAndGetRetries();<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    int maxAttempts = env.getAssignmentManager().getAssignMaxAttempts();<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    LOG.info("Retry={} of max={}; {}; {}", retries, maxAttempts, this, regionNode.toShortString());<a name="line.233"></a>
+<span class="sourceLineNo">234</span><a name="line.234"></a>
+<span class="sourceLineNo">235</span>    if (retries &gt;= maxAttempts) {<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      env.getAssignmentManager().regionFailedOpen(regionNode, true);<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      setFailure(getClass().getSimpleName(), new RetriesExhaustedException(<a name="line.237"></a>
+<span class="sourceLineNo">238</span>        "Max attempts " + env.getAssignmentManager().getAssignMaxAttempts() + " exceeded"));<a name="line.238"></a>
+<span class="sourceLineNo">239</span>      regionNode.unsetProcedure(this);<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      return Flow.NO_MORE_STATE;<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    }<a name="line.241"></a>
+<span class="sourceLineNo">242</span><a name="line.242"></a>
+<span class="sourceLineNo">243</span>    env.getAssignmentManager().regionFailedOpen(regionNode, false);<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    // we failed to assign the region, force a new plan<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    forceNewPlan = true;<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    regionNode.setRegionLocation(null);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE);<a name="line.247"></a>
+<span class="sourceLineNo">248</span><a name="line.248"></a>
+<span class="sourceLineNo">249</span>    if (retries &gt; env.getAssignmentManager().getAssignRetryImmediatelyMaxAttempts()) {<a name="line.249"></a>
+<span class="sourceLineNo">250</span>      // Throw exception to backoff and retry when failed open too many times<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      throw new HBaseIOException("Failed to open region");<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    } else {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      // Here we do not throw exception because we want to the region to be online ASAP<a name="line.253"></a>
+<span class="sourceLineNo">254</span>      return Flow.HAS_MORE_STATE;<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    }<a name="line.255"></a>
+<span class="sourceLineNo">256</span>  }<a name="line.256"></a>
+<span class="sourceLineNo">257</span><a name="line.257"></a>
+<span class="sourceLineNo">258</span>  private void closeRegion(MasterProcedureEnv env, RegionStateNode regionNode) throws IOException {<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    if (regionNode.isInState(State.OPEN, State.CLOSING, State.MERGING, State.SPLITTING)) {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      // this is the normal case<a name="line.260"></a>
+<span class="sourceLineNo">261</span>      env.getAssignmentManager().regionClosing(regionNode);<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      addChildProcedure(new CloseRegionProcedure(this, getRegion(), regionNode.getRegionLocation(),<a name="line.262"></a>
+<span class="sourceLineNo">263</span>        assignCandidate));<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_CLOSED);<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    } else {<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      forceNewPlan = true;<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      regionNode.setRegionLocation(null);<a name="line.267"></a>
+<span class="sourceLineNo">268</span>      setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE);<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    }<a name="line.269"></a>
+<span class="sourceLineNo">270</span>  }<a name="line.270"></a>
+<span class="sourceLineNo">271</span><a name="line.271"></a>
+<span class="sourceLineNo">272</span>  private Flow confirmClosed(MasterProcedureEnv env, RegionStateNode regionNode)<a name="line.272"></a>
+<span class="sourceLineNo">273</span>      throws IOException {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    if (regionNode.isInState(State.CLOSED)) {<a name="line.274"></a>
+<span class="sourceLineNo">275</span>      retryCounter = null;<a name="line.275"></a>
+<span class="sourceLineNo">276</span>      if (lastState == RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_CLOSED) {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>        // we are the last state, finish<a name="line.277"></a>
+<span class="sourceLineNo">278</span>        regionNode.unsetProcedure(this);<a name="line.278"></a>
+<span class="sourceLineNo">279</span>        return Flow.NO_MORE_STATE;<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      }<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      // This means we need to open the region again, should be a move or reopen<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      return Flow.HAS_MORE_STATE;<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    }<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    if (regionNode.isInState(State.CLOSING)) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      // This is possible, think the target RS crashes and restarts immediately, the close region<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      // operation will return a NotServingRegionException soon, we can only recover after SCP takes<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      // care of this RS. So here we throw an IOException to let upper layer to retry with backoff.<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_CLOSE);<a name="line.289"></a>
+<span class="sourceLineNo">290</span>      throw new HBaseIOException("Failed to close region");<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    }<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    // abnormally closed, need to reopen it, no matter what is the last state, see the comment in<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    // confirmOpened for more details that why we need to reopen the region first even if we just<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    // want to close it.<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    // The only exception is for non-default replica, where we do not need to deal with recovered<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    // edits. Notice that the region will remain in ABNORMALLY_CLOSED state, the upper layer need to<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    // deal with this state. For non-default replica, this is usually the same with CLOSED.<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    assert regionNode.isInState(State.ABNORMALLY_CLOSED);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    if (!RegionReplicaUtil.isDefaultReplica(getRegion()) &amp;&amp;<a name="line.299"></a>
+<span class="sourceLineNo">300</span>      lastState == RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_CLOSED) {<a name="line.300"></a>
+<span class="sourceLineNo">301</span>      regionNode.unsetProcedure(this);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>      return Flow.NO_MORE_STATE;<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    }<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    retryCounter = null;<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    return Flow.HAS_MORE_STATE;<a name="line.306"></a>
+<span class="sourceLineNo">307</span>  }<a name="line.307"></a>
+<span class="sourceLineNo">308</span><a name="line.308"></a>
+<span class="sourceLineNo">309</span>  // Override to lock RegionStateNode<a name="line.309"></a>
+<span class="sourceLineNo">310</span>  @SuppressWarnings("rawtypes")<a name="line.310"></a>
+<span class="sourceLineNo">311</span>  @Override<a name="line.311"></a>
+<span class="sourceLineNo">312</span>  protected Procedure[] execute(MasterProcedureEnv env)<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      throws ProcedureSuspendedException, ProcedureYieldException, InterruptedException {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    RegionStateNode regionNode =<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      env.getAssignmentManager().getRegionStates().getOrCreateRegionStateNode(getRegion());<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    regionNode.lock();<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    try {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>      return super.execute(env);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>    } finally {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>      regionNode.unlock();<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><a name="line.323"></a>
+<span class="sourceLineNo">324</span>  private RegionStateNode getRegionStateNode(MasterProcedureEnv env) {<a name="line.324"></a>
+<span class="sourceLineNo">325</span>    return env.getAssignmentManager().getRegionStates().getOrCreateRegionStateNode(getRegion());<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>  @Override<a name="line.328"></a>
+<span class="sourceLineNo">329</span>  protected Flow executeFromState(MasterProcedureEnv env, RegionStateTransitionState state)<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      throws ProcedureSuspendedException, ProcedureYieldException, InterruptedException {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    RegionStateNode regionNode = getRegionStateNode(env);<a name="line.331"></a>
+<span class="sourceLineNo">332</span>    try {<a name="line.332"></a>
+<span class="sourceLineNo">333</span>      switch (state) {<a name="line.333"></a>
+<span class="sourceLineNo">334</span>        case REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE:<a name="line.334"></a>
+<span class="sourceLineNo">335</span>          queueAssign(env, regionNode);<a name="line.335"></a>
+<span class="sourceLineNo">336</span>          return Flow.HAS_MORE_STATE;<a name="line.336"></a>
+<span class="sourceLineNo">337</span>        case REGION_STATE_TRANSITION_OPEN:<a name="line.337"></a>
+<span class="sourceLineNo">338</span>          openRegion(env, regionNode);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>          return Flow.HAS_MORE_STATE;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>        case REGION_STATE_TRANSITION_CONFIRM_OPENED:<a name="line.340"></a>
+<span class="sourceLineNo">341</span>          return confirmOpened(env, regionNode);<a name="line.341"></a>
+<span class="sourceLineNo">342</span>        case REGION_STATE_TRANSITION_CLOSE:<a name="line.342"></a>
+<span class="sourceLineNo">343</span>          closeRegion(env, regionNode);<a name="line.343"></a>
+<span class="sourceLineNo">344</span>          return Flow.HAS_MORE_STATE;<a name="line.344"></a>
+<span class="sourceLineNo">345</span>        case REGION_STATE_TRANSITION_CONFIRM_CLOSED:<a name="line.345"></a>
+<span class="sourceLineNo">346</span>          return confirmClosed(env, regionNode);<a name="line.346"></a>
+<span class="sourceLineNo">347</span>        default:<a name="line.347"></a>
+<span class="sourceLineNo">348</span>          throw new UnsupportedOperationException("unhandled state=" + state);<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      }<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    } catch (IOException e) {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>      if (retryCounter == null) {<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        retryCounter = ProcedureUtil.createRetryCounter(env.getMasterConfiguration());<a name="line.352"></a>
+<span class="sourceLineNo">353</span>      }<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      long backoff = retryCounter.getBackoffTimeAndIncrementAttempts();<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      LOG.warn(<a name="line.355"></a>
+<span class="sourceLineNo">356</span>        "Failed transition, suspend {}secs {}; {}; waiting on rectified condition fixed " +<a name="line.356"></a>
+<span class="sourceLineNo">357</span>          "by other Procedure or operator intervention",<a name="line.357"></a>
+<span class="sourceLineNo">358</span>        backoff / 1000, this, regionNode.toShortString(), e);<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      setTimeout(Math.toIntExact(backoff));<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      setState(ProcedureProtos.ProcedureState.WAITING_TIMEOUT);<a name="line.360"></a>
+<span class="sourceLineNo">361</span>      skipPersistence();<a name="line.361"></a>
+<span class="sourceLineNo">362</span>      throw new ProcedureSuspendedException();<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><a name="line.365"></a>
+<span class="sourceLineNo">366</span>  /**<a name="line.366"></a>
+<span class="sourceLineNo">367</span>   * At end of timeout, wake ourselves up so we run again.<a name="line.367"></a>
+<span class="sourceLineNo">368</span>   */<a name="line.368"></a>
+<span class="sourceLineNo">369</span>  @Override<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  protected synchronized boolean setTimeoutFailure(MasterProcedureEnv env) {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    setState(ProcedureProtos.ProcedureState.RUNNABLE);<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    env.getProcedureScheduler().addFront(this);<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    return false; // 'false' means that this procedure handled the timeout<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>  // Should be called with RegionStateNode locked<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  public void reportTransition(MasterProcedureEnv env, RegionStateNode regionNode,<a name="line.377"></a>
+<span class="sourceLineNo">378</span>      ServerName serverName, TransitionCode code, long seqId, long procId) throws IOException {<a name="line.378"></a>
+<span class="sourceLineNo">379</span>    if (remoteProc == null) {<a name="line.379"></a>
+<span class="sourceLineNo">380</span>      LOG.warn(<a name="line.380"></a>
+<span class="sourceLineNo">381</span>        "There is no outstanding remote region procedure for {}, serverName={}, code={}," +<a name="line.381"></a>
+<span class="sourceLineNo">382</span>          " seqId={}, proc={}, should be a retry, ignore",<a name="line.382"></a>
+<span class="sourceLineNo">383</span>        regionNode, serverName, code, seqId, this);<a name="line.383"></a>
+<span class="sourceLineNo">384</span>      return;<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    }<a name="line.385"></a>
+<span class="sourceLineNo">386</span>    // The procId could be -1 if it is from an old region server, we need to deal with it so that we<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    // can do rolling upgraing.<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    if (procId &gt;= 0 &amp;&amp; remoteProc.getProcId() != procId) {<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      LOG.warn(<a name="line.389"></a>
+<span class="sourceLineNo">390</span>        "The pid of remote region procedure for {} is {}, the reported pid={}, serverName={}," +<a name="line.390"></a>
+<span class="sourceLineNo">391</span>          " code={}, seqId={}, proc={}, should be a retry, ignore",<a name="line.391"></a>
+<span class="sourceLineNo">392</span>        regionNode, remoteProc.getProcId(), procId, serverName, code, seqId, this);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>      return;<a name="line.393"></a>
+<span class="sourceLineNo">394</span>    }<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    remoteProc.reportTransition(env, regionNode, serverName, code, seqId);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>  }<a name="line.396"></a>
+<span class="sourceLineNo">397</span><a name="line.397"></a>
+<span class="sourceLineNo">398</span>  // Should be called with RegionStateNode locked<a name="line.398"></a>
+<span class="sourceLineNo">399</span>  public void serverCrashed(MasterProcedureEnv env, RegionStateNode regionNode,<a name="line.399"></a>
+<span class="sourceLineNo">400</span>      ServerName serverName) throws IOException {<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    if (remoteProc != null) {<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      // this means we are waiting for the sub procedure, so wake it up<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      remoteProc.serverCrashed(env, regionNode, serverName);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    } else {<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      // we are in RUNNING state, just update the region state, and we will process it later.<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      env.getAssignmentManager().regionClosed(regionNode, false);<a name="line.406"></a>
+<span class="sourceLineNo">407</span>    }<a name="line.407"></a>
 <span class="sourceLineNo">408</span>  }<a name="line.408"></a>
 <span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>  void unattachRemoteProc(RegionRemoteProcedureBase proc) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    assert this.remoteProc == proc;<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    this.remoteProc = null;<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>  @Override<a name="line.415"></a>
-<span class="sourceLineNo">416</span>  protected void rollbackState(MasterProcedureEnv env, RegionStateTransitionState state)<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      throws IOException, InterruptedException {<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    // no rollback<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    throw new UnsupportedOperationException();<a name="line.419"></a>
-<span class="sourceLineNo">420</span>  }<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>  @Override<a name="line.422"></a>
-<span class="sourceLineNo">423</span>  protected RegionStateTransitionState getState(int stateId) {<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    return RegionStateTransitionState.forNumber(stateId);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>  }<a name="line.425"></a>
-<span class="sourceLineNo">426</span><a name="line.426"></a>
-<span class="sourceLineNo">427</span>  @Override<a name="line.427"></a>
-<span class="sourceLineNo">428</span>  protected int getStateId(RegionStateTransitionState state) {<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return state.getNumber();<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>  @Override<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  protected RegionStateTransitionState getInitialState() {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    return initialState;<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  }<a name="line.435"></a>
-<span class="sourceLineNo">436</span><a name="line.436"></a>
-<span class="sourceLineNo">437</span>  private static TransitionType convert(RegionTransitionType type) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    switch (type) {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>      case ASSIGN:<a name="line.439"></a>
-<span class="sourceLineNo">440</span>        return TransitionType.ASSIGN;<a name="line.440"></a>
-<span class="sourceLineNo">441</span>      case UNASSIGN:<a name="line.441"></a>
-<span class="sourceLineNo">442</span>        return TransitionType.UNASSIGN;<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      case MOVE:<a name="line.443"></a>
-<span class="sourceLineNo">444</span>        return TransitionType.MOVE;<a name="line.444"></a>
-<span class="sourceLineNo">445</span>      case REOPEN:<a name="line.445"></a>
-<span class="sourceLineNo">446</span>        return TransitionType.REOPEN;<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      default:<a name="line.447"></a>
-<span class="sourceLineNo">448</span>        throw new IllegalArgumentException("Unknown RegionTransitionType: " + type);<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 static RegionTransitionType convert(TransitionType type) {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    switch (type) {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      case ASSIGN:<a name="line.454"></a>
-<span class="sourceLineNo">455</span>        return RegionTransitionType.ASSIGN;<a name="line.455"></a>
-<span class="sourceLineNo">456</span>      case UNASSIGN:<a name="line.456"></a>
-<span class="sourceLineNo">457</span>        return RegionTransitionType.UNASSIGN;<a name="line.457"></a>
-<span class="sourceLineNo">458</span>      case MOVE:<a name="line.458"></a>
-<span class="sourceLineNo">459</span>        return RegionTransitionType.MOVE;<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      case REOPEN:<a name="line.460"></a>
-<span class="sourceLineNo">461</span>        return RegionTransitionType.REOPEN;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      default:<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        throw new IllegalArgumentException("Unknown TransitionType: " + type);<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><a name="line.466"></a>
-<span class="sourceLineNo">467</span>  @Override<a name="line.467"></a>
-<span class="sourceLineNo">468</span>  protected void serializeStateData(ProcedureStateSerializer serializer) throws IOException {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    super.serializeStateData(serializer);<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    RegionStateTransitionStateData.Builder builder = RegionStateTransitionStateData.newBuilder()<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      .setType(convert(type)).setForceNewPlan(forceNewPlan);<a name="line.471"></a>
-<span class="sourceLineNo">472</span>    if (assignCandidate != null) {<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      builder.setAssignCandidate(ProtobufUtil.toServerName(assignCandidate));<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    serializer.serialize(builder.build());<a name="line.475"></a>
-<span class="sourceLineNo">476</span>  }<a name="line.476"></a>
-<span class="sourceLineNo">477</span><a name="line.477"></a>
-<span class="sourceLineNo">478</span>  @Override<a name="line.478"></a>
-<span class="sourceLineNo">479</span>  protected void deserializeStateData(ProcedureStateSerializer serializer) throws IOException {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    super.deserializeStateData(serializer);<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    RegionStateTransitionStateData data =<a name="line.481"></a>
-<span class="sourceLineNo">482</span>      serializer.deserialize(RegionStateTransitionStateData.class);<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    type = convert(data.getType());<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    setInitalAndLastState();<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    forceNewPlan = data.getForceNewPlan();<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    if (data.hasAssignCandidate()) {<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      assignCandidate = ProtobufUtil.toServerName(data.getAssignCandidate());<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    }<a name="line.488"></a>
-<span class="sourceLineNo">489</span>  }<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>  @Override<a name="line.491"></a>
-<span class="sourceLineNo">492</span>  protected ProcedureMetrics getProcedureMetrics(MasterProcedureEnv env) {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    MetricsAssignmentManager metrics = env.getAssignmentManager().getAssignmentManagerMetrics();<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    switch (type) {<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      case ASSIGN:<a name="line.495"></a>
-<span class="sourceLineNo">496</span>        return metrics.getAssignProcMetrics();<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      case UNASSIGN:<a name="line.497"></a>
-<span class="sourceLineNo">498</span>        return metrics.getUnassignProcMetrics();<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      case MOVE:<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        return metrics.getMoveProcMetrics();<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      case REOPEN:<a name="line.501"></a>
-<span class="sourceLineNo">502</span>        return metrics.getReopenProcMetrics();<a name="line.502"></a>
-<span class="sourceLineNo">503</span>      default:<a name="line.503"></a>
-<span class="sourceLineNo">504</span>        throw new IllegalArgumentException("Unknown transition type: " + type);<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    }<a name="line.505"></a>
-<span class="sourceLineNo">506</span>  }<a name="line.506"></a>
-<span class="sourceLineNo">507</span><a name="line.507"></a>
-<span class="sourceLineNo">508</span>  @Override<a name="line.508"></a>
-<span class="sourceLineNo">509</span>  public void toStringClassDetails(StringBuilder sb) {<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    super.toStringClassDetails(sb);<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    if (initialState == RegionStateTransitionState.REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE) {<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      sb.append(", ASSIGN");<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    } else if (lastState == RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_CLOSED) {<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      sb.append(", UNASSIGN");<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    } else {<a name="line.515"></a>
-<span class="sourceLineNo">516</span>      sb.append(", REOPEN/MOVE");<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    }<a name="line.517"></a>
-<span class="sourceLineNo">518</span>  }<a name="line.518"></a>
-<span class="sourceLineNo">519</span><a name="line.519"></a>
-<span class="sourceLineNo">520</span>  private static TransitRegionStateProcedure setOwner(MasterProcedureEnv env,<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      TransitRegionStateProcedure proc) {<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    proc.setOwner(env.getRequestUser().getShortName());<a name="line.522"></a>
-<span class="sourceLineNo">523</span>    return proc;<a name="line.523"></a>
-<span class="sourceLineNo">524</span>  }<a name="line.524"></a>
-<span class="sourceLineNo">525</span><a name="line.525"></a>
-<span class="sourceLineNo">526</span>  public enum TransitionType {<a name="line.526"></a>
-<span class="sourceLineNo">527</span>    ASSIGN, UNASSIGN, MOVE, REOPEN<a name="line.527"></a>
+<span class="sourceLineNo">410</span>  void attachRemoteProc(RegionRemoteProcedureBase proc) {<a name="line.410"></a>
+<span class="sourceLineNo">411</span>    this.remoteProc = proc;<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>  void unattachRemoteProc(RegionRemoteProcedureBase proc) {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    assert this.remoteProc == proc;<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    this.remoteProc = null;<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>  @Override<a name="line.419"></a>
+<span class="sourceLineNo">420</span>  protected void rollbackState(MasterProcedureEnv env, RegionStateTransitionState state)<a name="line.420"></a>
+<span class="sourceLineNo">421</span>      throws IOException, InterruptedException {<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    // no rollback<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    throw new UnsupportedOperationException();<a name="line.423"></a>
+<span class="sourceLineNo">424</span>  }<a name="line.424"></a>
+<span class="sourceLineNo">425</span><a name="line.425"></a>
+<span class="sourceLineNo">426</span>  @Override<a name="line.426"></a>
+<span class="sourceLineNo">427</span>  protected RegionStateTransitionState getState(int stateId) {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>    return RegionStateTransitionState.forNumber(stateId);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>  }<a name="line.429"></a>
+<span class="sourceLineNo">430</span><a name="line.430"></a>
+<span class="sourceLineNo">431</span>  @Override<a name="line.431"></a>
+<span class="sourceLineNo">432</span>  protected int getStateId(RegionStateTransitionState state) {<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    return state.getNumber();<a name="line.433"></a>
+<span class="sourceLineNo">434</span>  }<a name="line.434"></a>
+<span class="sourceLineNo">435</span><a name="line.435"></a>
+<span class="sourceLineNo">436</span>  @Override<a name="line.436"></a>
+<span class="sourceLineNo">437</span>  protected RegionStateTransitionState getInitialState() {<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    return initialState;<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 static TransitionType convert(RegionTransitionType type) {<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    switch (type) {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>      case ASSIGN:<a name="line.443"></a>
+<span class="sourceLineNo">444</span>        return TransitionType.ASSIGN;<a name="line.444"></a>
+<span class="sourceLineNo">445</span>      case UNASSIGN:<a name="line.445"></a>
+<span class="sourceLineNo">446</span>        return TransitionType.UNASSIGN;<a name="line.446"></a>
+<span class="sourceLineNo">447</span>      case MOVE:<a name="line.447"></a>
+<span class="sourceLineNo">448</span>        return TransitionType.MOVE;<a name="line.448"></a>
+<span class="sourceLineNo">449</span>      case REOPEN:<a name="line.449"></a>
+<span class="sourceLineNo">450</span>        return TransitionType.REOPEN;<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      default:<a name="line.451"></a>
+<span class="sourceLineNo">452</span>        throw new IllegalArgumentException("Unknown RegionTransitionType: " + type);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    }<a name="line.453"></a>
+<span class="sourceLineNo">454</span>  }<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>  private static RegionTransitionType convert(TransitionType type) {<a name="line.456"></a>
+<span class="sourceLineNo">457</span>    switch (type) {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>      case ASSIGN:<a name="line.458"></a>
+<span class="sourceLineNo">459</span>        return RegionTransitionType.ASSIGN;<a name="line.459"></a>
+<span class="sourceLineNo">460</span>      case UNASSIGN:<a name="line.460"></a>
+<span class="sourceLineNo">461</span>        return RegionTransitionType.UNASSIGN;<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      case MOVE:<a name="line.462"></a>
+<span class="sourceLineNo">463</span>        return RegionTransitionType.MOVE;<a name="line.463"></a>
+<span class="sourceLineNo">464</span>      case REOPEN:<a name="line.464"></a>
+<span class="sourceLineNo">465</span>        return RegionTransitionType.REOPEN;<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      default:<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        throw new IllegalArgumentException("Unknown TransitionType: " + type);<a name="line.467"></a>
+<span class="sourceLineNo">468</span>    }<a name="line.468"></a>
+<span class="sourceLineNo">469</span>  }<a name="line.469"></a>
+<span class="sourceLineNo">470</span><a name="line.470"></a>
+<span class="sourceLineNo">471</span>  @Override<a name="line.471"></a>
+<span class="sourceLineNo">472</span>  protected void serializeStateData(ProcedureStateSerializer serializer) throws IOException {<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    super.serializeStateData(serializer);<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    RegionStateTransitionStateData.Builder builder = RegionStateTransitionStateData.newBuilder()<a name="line.474"></a>
+<span class="sourceLineNo">475</span>      .setType(convert(type)).setForceNewPlan(forceNewPlan);<a name="line.475"></a>
+<span class="sourceLineNo">476</span>    if (assignCandidate != null) {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>      builder.setAssignCandidate(ProtobufUtil.toServerName(assignCandidate));<a name="line.477"></a>
+<span class="sourceLineNo">478</span>    }<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    serializer.serialize(builder.build());<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>  @Override<a name="line.482"></a>
+<span class="sourceLineNo">483</span>  protected void deserializeStateData(ProcedureStateSerializer serializer) throws IOException {<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    super.deserializeStateData(serializer);<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    RegionStateTransitionStateData data =<a name="line.485"></a>
+<span class="sourceLineNo">486</span>      serializer.deserialize(RegionStateTransitionStateData.class);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    type = convert(data.getType());<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    setInitalAndLastState();<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    forceNewPlan = data.getForceNewPlan();<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    if (data.hasAssignCandidate()) {<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      assignCandidate = ProtobufUtil.toServerName(data.getAssignCandidate());<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    }<a name="line.492"></a>
+<span class="sourceLineNo">493</span>  }<a name="line.493"></a>
+<span class="sourceLineNo">494</span><a name="line.494"></a>
+<span class="sourceLineNo">495</span>  @Override<a name="line.495"></a>
+<span class="sourceLineNo">496</span>  protected ProcedureMetrics getProcedureMetrics(MasterProcedureEnv env) {<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    MetricsAssignmentManager metrics = env.getAssignmentManager().getAssignmentManagerMetrics();<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    switch (type) {<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      case ASSIGN:<a name="line.499"></a>
+<span class="sourceLineNo">500</span>        return metrics.getAssignProcMetrics();<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      case UNASSIGN:<a name="line.501"></a>
+<span class="sourceLineNo">502</span>        return metrics.getUnassignProcMetrics();<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      case MOVE:<a name="line.503"></a>
+<span class="sourceLineNo">504</span>        return metrics.getMoveProcMetrics();<a name="line.504"></a>
+<span class="sourceLineNo">505</span>      case REOPEN:<a name="line.505"></a>
+<span class="sourceLineNo">506</span>        return metrics.getReopenProcMetrics();<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      default:<a name="line.507"></a>
+<span class="sourceLineNo">508</span>        throw new IllegalArgumentException("Unknown transition type: " + type);<a name="line.508"></a>
+<span class="sourceLineNo">509</span>    }<a name="line.509"></a>
+<span class="sourceLineNo">510</span>  }<a name="line.510"></a>
+<span class="sourceLineNo">511</span><a name="line.511"></a>
+<span class="sourceLineNo">512</span>  @Override<a name="line.512"></a>
+<span class="sourceLineNo">513</span>  public void toStringClassDetails(StringBuilder sb) {<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    super.toStringClassDetails(sb);<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    if (initialState == RegionStateTransitionState.REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE) {<a name="line.515"></a>
+<span class="sourceLineNo">516</span>      sb.append(", ASSIGN");<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    } else if (lastState == RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_CLOSED) {<a name="line.517"></a>
+<span class="sourceLineNo">518</span>      sb.append(", UNASSIGN");<a name="line.518"></a>
+<span class="sourceLineNo">519</span>    } else {<a name="line.519"></a>
+<span class="sourceLineNo">520</span>      sb.append(", REOPEN/MOVE");<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    }<a name="line.521"></a>
+<span class="sourceLineNo">522</span>  }<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>  private static TransitRegionStateProcedure setOwner(MasterProcedureEnv env,<a name="line.524"></a>
+<span class="sourceLineNo">525</span>      TransitRegionStateProcedure proc) {<a name="line.525"></a>
+<span class="sourceLineNo">526</span>    proc.setOwner(env.getRequestUser().getShortName());<a name="line.526"></a>
+<span class="sourceLineNo">527</span>    return proc;<a name="line.527"></a>
 <span class="sourceLineNo">528</span>  }<a name="line.528"></a>
 <span class="sourceLineNo">529</span><a name="line.529"></a>
-<span class="sourceLineNo">530</span>  // Be careful that, when you call these 4 methods below, you need to manually attach the returned<a name="line.530"></a>
-<span class="sourceLineNo">531</span>  // procedure with the RegionStateNode, otherwise the procedure will quit immediately without doing<a name="line.531"></a>
-<span class="sourceLineNo">532</span>  // anything. See the comment in executeFromState to find out why we need this assumption.<a name="line.532"></a>
-<span class="sourceLineNo">533</span>  public static TransitRegionStateProcedure assign(MasterProcedureEnv env, RegionInfo region,<a name="line.533"></a>
-<span class="sourceLineNo">534</span>      @Nullable ServerName targetServer) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>    return setOwner(env,<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      new TransitRegionStateProcedure(env, region, targetServer, false, TransitionType.ASSIGN));<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>  public static TransitRegionStateProcedure unassign(MasterProcedureEnv env, RegionInfo region) {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>    return setOwner(env,<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      new TransitRegionStateProcedure(env, region, null, false, TransitionType.UNASSIGN));<a name="line.541"></a>
-<span class="sourceLineNo">542</span>  }<a name="line.542"></a>
-<span class="sourceLineNo">543</span><a name="line.543"></a>
-<span class="sourceLineNo">544</span>  public static TransitRegionStateProcedure reopen(MasterProcedureEnv env, RegionInfo region) {<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    return setOwner(env,<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      new TransitRegionStateProcedure(env, region, null, false, TransitionType.REOPEN));<a name="line.546"></a>
-<span class="sourceLineNo">547</span>  }<a name="line.547"></a>
-<span class="sourceLineNo">548</span><a name="line.548"></a>
-<span class="sourceLineNo">549</span>  public static TransitRegionStateProcedure move(MasterProcedureEnv env, RegionInfo region,<a name="line.549"></a>
-<span class="sourceLineNo">550</span>      @Nullable ServerName targetServer) {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    return setOwner(env, new TransitRegionStateProcedure(env, region, targetServer,<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      targetServer == null, TransitionType.MOVE));<a name="line.552"></a>
-<span class="sourceLineNo">553</span>  }<a name="line.553"></a>
-<span class="sourceLineNo">554</span>}<a name="line.554"></a>
+<span class="sourceLineNo">530</span>  public enum TransitionType {<a name="line.530"></a>
+<span class="sourceLineNo">531</span>    ASSIGN, UNASSIGN, MOVE, REOPEN<a name="line.531"></a>
+<span class="sourceLineNo">532</span>  }<a name="line.532"></a>
+<span class="sourceLineNo">533</span><a name="line.533"></a>
+<span class="sourceLineNo">534</span>  // Be careful that, when you call these 4 methods below, you need to manually attach the returned<a name="line.534"></a>
+<span class="sourceLineNo">535</span>  // procedure with the RegionStateNode, otherwise the procedure will quit immediately without doing<a name="line.535"></a>
+<span class="sourceLineNo">536</span>  // anything. See the comment in executeFromState to find out why we need this assumption.<a name="line.536"></a>
+<span class="sourceLineNo">537</span>  public static TransitRegionStateProcedure assign(MasterProcedureEnv env, RegionInfo region,<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      @Nullable ServerName targetServer) {<a name="line.538"></a>
+<span class="sourceLineNo">539</span>    return setOwner(env,<a name="line.539"></a>
+<span class="sourceLineNo">540</span>      new TransitRegionStateProcedure(env, region, targetServer, false, TransitionType.ASSIGN));<a name="line.540"></a>
+<span class="sourceLineNo">541</span>  }<a name="line.541"></a>
+<span class="sourceLineNo">542</span><a name="line.542"></a>
+<span class="sourceLineNo">543</span>  public static TransitRegionStateProcedure unassign(MasterProcedureEnv env, RegionInfo region) {<a name="line.543"></a>
+<span class="sourceLineNo">544</span>    return setOwner(env,<a name="line.544"></a>
+<span class="sourceLineNo">545</span>      new TransitRegionStateProcedure(env, region, null, false, TransitionType.UNASSIGN));<a name="line.545"></a>
+<span class="sourceLineNo">546</span>  }<a name="line.546"></a>
+<span class="sourceLineNo">547</span><a name="line.547"></a>
+<span class="sourceLineNo">548</span>  public static TransitRegionStateProcedure reopen(MasterProcedureEnv env, RegionInfo region) {<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    return setOwner(env,<a name="line.549"></a>
+<span class="sourceLineNo">550</span>      new TransitRegionStateProcedure(env, region, null, false, TransitionType.REOPEN));<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>  public static TransitRegionStateProcedure move(MasterProcedureEnv env, RegionInfo region,<a name="line.553"></a>
+<span class="sourceLineNo">554</span>      @Nullable ServerName targetServer) {<a name="line.554"></a>
+<span class="sourceLineNo">555</span>    return setOwner(env, new TransitRegionStateProcedure(env, region, targetServer,<a name="line.555"></a>
+<span class="sourceLineNo">556</span>      targetServer == null, TransitionType.MOVE));<a name="line.556"></a>
+<span class="sourceLineNo">557</span>  }<a name="line.557"></a>
+<span class="sourceLineNo">558</span>}<a name="line.558"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html
index 05e9fa7..6c6c639 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html
@@ -44,522 +44,526 @@
 <span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.procedure2.ProcedureSuspendedException;<a name="line.36"></a>
 <span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.procedure2.ProcedureUtil;<a name="line.37"></a>
 <span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.procedure2.ProcedureYieldException;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.slf4j.Logger;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.slf4j.LoggerFactory;<a name="line.41"></a>
-<span class="sourceLineNo">042</span><a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.43"></a>
-<span class="sourceLineNo">044</span><a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionState;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionStateData;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionTransitionType;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode;<a name="line.50"></a>
-<span class="sourceLineNo">051</span><a name="line.51"></a>
-<span class="sourceLineNo">052</span>/**<a name="line.52"></a>
-<span class="sourceLineNo">053</span> * The procedure to deal with the state transition of a region. A region with a TRSP in place is<a name="line.53"></a>
-<span class="sourceLineNo">054</span> * called RIT, i.e, RegionInTransition.<a name="line.54"></a>
-<span class="sourceLineNo">055</span> * &lt;p/&gt;<a name="line.55"></a>
-<span class="sourceLineNo">056</span> * It can be used to assign/unassign/reopen/move a region, and for<a name="line.56"></a>
-<span class="sourceLineNo">057</span> * {@link #unassign(MasterProcedureEnv, RegionInfo)} and<a name="line.57"></a>
-<span class="sourceLineNo">058</span> * {@link #reopen(MasterProcedureEnv, RegionInfo)}, you do not need to specify a target server, and<a name="line.58"></a>
-<span class="sourceLineNo">059</span> * for {@link #assign(MasterProcedureEnv, RegionInfo, ServerName)} and<a name="line.59"></a>
-<span class="sourceLineNo">060</span> * {@link #move(MasterProcedureEnv, RegionInfo, ServerName)}, if you want to you can provide a<a name="line.60"></a>
-<span class="sourceLineNo">061</span> * target server. And for {@link #move(MasterProcedureEnv, RegionInfo, ServerName)}, if you do not<a name="line.61"></a>
-<span class="sourceLineNo">062</span> * specify a targetServer, we will select one randomly.<a name="line.62"></a>
-<span class="sourceLineNo">063</span> * &lt;p/&gt;<a name="line.63"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.util.RetryCounter;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.slf4j.Logger;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.slf4j.LoggerFactory;<a name="line.42"></a>
+<span class="sourceLineNo">043</span><a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.44"></a>
+<span class="sourceLineNo">045</span><a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionState;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionStateData;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionTransitionType;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode;<a name="line.51"></a>
+<span class="sourceLineNo">052</span><a name="line.52"></a>
+<span class="sourceLineNo">053</span>/**<a name="line.53"></a>
+<span class="sourceLineNo">054</span> * The procedure to deal with the state transition of a region. A region with a TRSP in place is<a name="line.54"></a>
+<span class="sourceLineNo">055</span> * called RIT, i.e, RegionInTransition.<a name="line.55"></a>
+<span class="sourceLineNo">056</span> * &lt;p/&gt;<a name="line.56"></a>
+<span class="sourceLineNo">057</span> * It can be used to assign/unassign/reopen/move a region, and for<a name="line.57"></a>
+<span class="sourceLineNo">058</span> * {@link #unassign(MasterProcedureEnv, RegionInfo)} and<a name="line.58"></a>
+<span class="sourceLineNo">059</span> * {@link #reopen(MasterProcedureEnv, RegionInfo)}, you do not need to specify a target server, and<a name="line.59"></a>
+<span class="sourceLineNo">060</span> * for {@link #assign(MasterProcedureEnv, RegionInfo, ServerName)} and<a name="line.60"></a>
+<span class="sourceLineNo">061</span> * {@link #move(MasterProcedureEnv, RegionInfo, ServerName)}, if you want to you can provide a<a name="line.61"></a>
+<span class="sourceLineNo">062</span> * target server. And for {@link #move(MasterProcedureEnv, RegionInfo, ServerName)}, if you do not<a name="line.62"></a>
+<span class="sourceLineNo">063</span> * specify a targetServer, we will select one randomly.<a name="line.63"></a>
 <span class="sourceLineNo">064</span> * &lt;p/&gt;<a name="line.64"></a>
-<span class="sourceLineNo">065</span> * The typical state transition for assigning a region is:<a name="line.65"></a>
-<span class="sourceLineNo">066</span> *<a name="line.66"></a>
-<span class="sourceLineNo">067</span> * &lt;pre&gt;<a name="line.67"></a>
-<span class="sourceLineNo">068</span> * GET_ASSIGN_CANDIDATE ------&gt; OPEN -----&gt; CONFIRM_OPENED<a name="line.68"></a>
-<span class="sourceLineNo">069</span> * &lt;/pre&gt;<a name="line.69"></a>
-<span class="sourceLineNo">070</span> *<a name="line.70"></a>
-<span class="sourceLineNo">071</span> * Notice that, if there are failures we may go back to the {@code GET_ASSIGN_CANDIDATE} state to<a name="line.71"></a>
-<span class="sourceLineNo">072</span> * try again.<a name="line.72"></a>
-<span class="sourceLineNo">073</span> * &lt;p/&gt;<a name="line.73"></a>
-<span class="sourceLineNo">074</span> * The typical state transition for unassigning a region is:<a name="line.74"></a>
-<span class="sourceLineNo">075</span> *<a name="line.75"></a>
-<span class="sourceLineNo">076</span> * &lt;pre&gt;<a name="line.76"></a>
-<span class="sourceLineNo">077</span> * CLOSE -----&gt; CONFIRM_CLOSED<a name="line.77"></a>
-<span class="sourceLineNo">078</span> * &lt;/pre&gt;<a name="line.78"></a>
-<span class="sourceLineNo">079</span> *<a name="line.79"></a>
-<span class="sourceLineNo">080</span> * Here things go a bit different, if there are failures, especially that if there is a server<a name="line.80"></a>
-<span class="sourceLineNo">081</span> * crash, we will go to the {@code GET_ASSIGN_CANDIDATE} state to bring the region online first, and<a name="line.81"></a>
-<span class="sourceLineNo">082</span> * then go through the normal way to unassign it.<a name="line.82"></a>
-<span class="sourceLineNo">083</span> * &lt;p/&gt;<a name="line.83"></a>
-<span class="sourceLineNo">084</span> * The typical state transition for reopening/moving a region is:<a name="line.84"></a>
-<span class="sourceLineNo">085</span> *<a name="line.85"></a>
-<span class="sourceLineNo">086</span> * &lt;pre&gt;<a name="line.86"></a>
-<span class="sourceLineNo">087</span> * CLOSE -----&gt; CONFIRM_CLOSED -----&gt; GET_ASSIGN_CANDIDATE ------&gt; OPEN -----&gt; CONFIRM_OPENED<a name="line.87"></a>
-<span class="sourceLineNo">088</span> * &lt;/pre&gt;<a name="line.88"></a>
-<span class="sourceLineNo">089</span> *<a name="line.89"></a>
-<span class="sourceLineNo">090</span> * The retry logic is the same with the above assign/unassign.<a name="line.90"></a>
-<span class="sourceLineNo">091</span> * &lt;p/&gt;<a name="line.91"></a>
-<span class="sourceLineNo">092</span> * Notice that, although we allow specify a target server, it just acts as a candidate, we do not<a name="line.92"></a>
-<span class="sourceLineNo">093</span> * guarantee that the region will finally be on the target server. If this is important for you, you<a name="line.93"></a>
-<span class="sourceLineNo">094</span> * should check whether the region is on the target server after the procedure is finished.<a name="line.94"></a>
-<span class="sourceLineNo">095</span> * &lt;p/&gt;<a name="line.95"></a>
-<span class="sourceLineNo">096</span> * When you want to schedule a TRSP, please check whether there is still one for this region, and<a name="line.96"></a>
-<span class="sourceLineNo">097</span> * the check should be under the RegionStateNode lock. We will remove the TRSP from a<a name="line.97"></a>
-<span class="sourceLineNo">098</span> * RegionStateNode when we are done, see the code in {@code reportTransition} method below. There<a name="line.98"></a>
-<span class="sourceLineNo">099</span> * could be at most one TRSP for a give region.<a name="line.99"></a>
-<span class="sourceLineNo">100</span> */<a name="line.100"></a>
-<span class="sourceLineNo">101</span>@InterfaceAudience.Private<a name="line.101"></a>
-<span class="sourceLineNo">102</span>public class TransitRegionStateProcedure<a name="line.102"></a>
-<span class="sourceLineNo">103</span>    extends AbstractStateMachineRegionProcedure&lt;RegionStateTransitionState&gt; {<a name="line.103"></a>
-<span class="sourceLineNo">104</span><a name="line.104"></a>
-<span class="sourceLineNo">105</span>  private static final Logger LOG = LoggerFactory.getLogger(TransitRegionStateProcedure.class);<a name="line.105"></a>
-<span class="sourceLineNo">106</span><a name="line.106"></a>
-<span class="sourceLineNo">107</span>  private TransitionType type;<a name="line.107"></a>
-<span class="sourceLineNo">108</span><a name="line.108"></a>
-<span class="sourceLineNo">109</span>  private RegionStateTransitionState initialState;<a name="line.109"></a>
-<span class="sourceLineNo">110</span><a name="line.110"></a>
-<span class="sourceLineNo">111</span>  private RegionStateTransitionState lastState;<a name="line.111"></a>
-<span class="sourceLineNo">112</span><a name="line.112"></a>
-<span class="sourceLineNo">113</span>  // the candidate where we want to assign the region to.<a name="line.113"></a>
-<span class="sourceLineNo">114</span>  private ServerName assignCandidate;<a name="line.114"></a>
-<span class="sourceLineNo">115</span><a name="line.115"></a>
-<span class="sourceLineNo">116</span>  private boolean forceNewPlan;<a name="line.116"></a>
-<span class="sourceLineNo">117</span><a name="line.117"></a>
-<span class="sourceLineNo">118</span>  private int attempt;<a name="line.118"></a>
-<span class="sourceLineNo">119</span><a name="line.119"></a>
-<span class="sourceLineNo">120</span>  private RegionRemoteProcedureBase remoteProc;<a name="line.120"></a>
-<span class="sourceLineNo">121</span><a name="line.121"></a>
-<span class="sourceLineNo">122</span>  public TransitRegionStateProcedure() {<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  }<a name="line.123"></a>
-<span class="sourceLineNo">124</span><a name="line.124"></a>
-<span class="sourceLineNo">125</span>  private void setInitalAndLastState() {<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    switch (type) {<a name="line.126"></a>
-<span class="sourceLineNo">127</span>      case ASSIGN:<a name="line.127"></a>
-<span class="sourceLineNo">128</span>        initialState = RegionStateTransitionState.REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE;<a name="line.128"></a>
-<span class="sourceLineNo">129</span>        lastState = RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_OPENED;<a name="line.129"></a>
-<span class="sourceLineNo">130</span>        break;<a name="line.130"></a>
-<span class="sourceLineNo">131</span>      case UNASSIGN:<a name="line.131"></a>
-<span class="sourceLineNo">132</span>        initialState = RegionStateTransitionState.REGION_STATE_TRANSITION_CLOSE;<a name="line.132"></a>
-<span class="sourceLineNo">133</span>        lastState = RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_CLOSED;<a name="line.133"></a>
-<span class="sourceLineNo">134</span>        break;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      case MOVE:<a name="line.135"></a>
-<span class="sourceLineNo">136</span>      case REOPEN:<a name="line.136"></a>
-<span class="sourceLineNo">137</span>        initialState = RegionStateTransitionState.REGION_STATE_TRANSITION_CLOSE;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>        lastState = RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_OPENED;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>        break;<a name="line.139"></a>
-<span class="sourceLineNo">140</span>      default:<a name="line.140"></a>
-<span class="sourceLineNo">141</span>        throw new IllegalArgumentException("Unknown TransitionType: " + type);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    }<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  }<a name="line.143"></a>
-<span class="sourceLineNo">144</span><a name="line.144"></a>
-<span class="sourceLineNo">145</span>  @VisibleForTesting<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  protected TransitRegionStateProcedure(MasterProcedureEnv env, RegionInfo hri,<a name="line.146"></a>
-<span class="sourceLineNo">147</span>      ServerName assignCandidate, boolean forceNewPlan, TransitionType type) {<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    super(env, hri);<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    this.assignCandidate = assignCandidate;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    this.forceNewPlan = forceNewPlan;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    this.type = type;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    setInitalAndLastState();<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  }<a name="line.153"></a>
-<span class="sourceLineNo">154</span><a name="line.154"></a>
-<span class="sourceLineNo">155</span>  @Override<a name="line.155"></a>
-<span class="sourceLineNo">156</span>  public TableOperationType getTableOperationType() {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    // TODO: maybe we should make another type here, REGION_TRANSITION?<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    return TableOperationType.REGION_EDIT;<a name="line.158"></a>
-<span class="sourceLineNo">159</span>  }<a name="line.159"></a>
-<span class="sourceLineNo">160</span><a name="line.160"></a>
-<span class="sourceLineNo">161</span>  @Override<a name="line.161"></a>
-<span class="sourceLineNo">162</span>  protected boolean waitInitialized(MasterProcedureEnv env) {<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    if (TableName.isMetaTableName(getTableName())) {<a name="line.163"></a>
-<span class="sourceLineNo">164</span>      return false;<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    }<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    // First we need meta to be loaded, and second, if meta is not online then we will likely to<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    // fail when updating meta so we wait until it is assigned.<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    AssignmentManager am = env.getAssignmentManager();<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    return am.waitMetaLoaded(this) || am.waitMetaAssigned(this, getRegion());<a name="line.169"></a>
-<span class="sourceLineNo">170</span>  }<a name="line.170"></a>
-<span class="sourceLineNo">171</span><a name="line.171"></a>
-<span class="sourceLineNo">172</span>  private void queueAssign(MasterProcedureEnv env, RegionStateNode regionNode)<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      throws ProcedureSuspendedException {<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    // Here the assumption is that, the region must be in CLOSED state, so the region location<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    // will be null. And if we fail to open the region and retry here, the forceNewPlan will be<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    // true, and also we will set the region location to null.<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    boolean retain = false;<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    if (!forceNewPlan) {<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      if (assignCandidate != null) {<a name="line.179"></a>
-<span class="sourceLineNo">180</span>        retain = assignCandidate.equals(regionNode.getLastHost());<a name="line.180"></a>
-<span class="sourceLineNo">181</span>        regionNode.setRegionLocation(assignCandidate);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      } else if (regionNode.getLastHost() != null) {<a name="line.182"></a>
-<span class="sourceLineNo">183</span>        retain = true;<a name="line.183"></a>
-<span class="sourceLineNo">184</span>        LOG.info("Setting lastHost as the region location {}", regionNode.getLastHost());<a name="line.184"></a>
-<span class="sourceLineNo">185</span>        regionNode.setRegionLocation(regionNode.getLastHost());<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      }<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    }<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    LOG.info("Starting {}; {}; forceNewPlan={}, retain={}", this, regionNode.toShortString(),<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      forceNewPlan, retain);<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    env.getAssignmentManager().queueAssign(regionNode);<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_OPEN);<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    if (regionNode.getProcedureEvent().suspendIfNotReady(this)) {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      throw new ProcedureSuspendedException();<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    }<a name="line.194"></a>
-<span class="sourceLineNo">195</span>  }<a name="line.195"></a>
-<span class="sourceLineNo">196</span><a name="line.196"></a>
-<span class="sourceLineNo">197</span>  private void openRegion(MasterProcedureEnv env, RegionStateNode regionNode) throws IOException {<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    ServerName loc = regionNode.getRegionLocation();<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    if (loc == null) {<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      LOG.warn("No location specified for {}, jump back to state {} to get one", getRegion(),<a name="line.200"></a>
-<span class="sourceLineNo">201</span>        RegionStateTransitionState.REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE);<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE);<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      return;<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    }<a name="line.204"></a>
-<span class="sourceLineNo">205</span>    env.getAssignmentManager().regionOpening(regionNode);<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    addChildProcedure(new OpenRegionProcedure(this, getRegion(), loc));<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_OPENED);<a name="line.207"></a>
-<span class="sourceLineNo">208</span>  }<a name="line.208"></a>
-<span class="sourceLineNo">209</span><a name="line.209"></a>
-<span class="sourceLineNo">210</span>  private Flow confirmOpened(MasterProcedureEnv env, RegionStateNode regionNode)<a name="line.210"></a>
-<span class="sourceLineNo">211</span>      throws IOException {<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    if (regionNode.isInState(State.OPEN)) {<a name="line.212"></a>
-<span class="sourceLineNo">213</span>      attempt = 0;<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      if (lastState == RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_OPENED) {<a name="line.214"></a>
-<span class="sourceLineNo">215</span>        // we are the last state, finish<a name="line.215"></a>
-<span class="sourceLineNo">216</span>        regionNode.unsetProcedure(this);<a name="line.216"></a>
-<span class="sourceLineNo">217</span>        ServerCrashProcedure.updateProgress(env, getParentProcId());<a name="line.217"></a>
-<span class="sourceLineNo">218</span>        return Flow.NO_MORE_STATE;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      }<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      // It is possible that we arrive here but confirm opened is not the last state, for example,<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      // when merging or splitting a region, we unassign the region from a RS and the RS is crashed,<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      // then there will be recovered edits for this region, we'd better make the region online<a name="line.222"></a>
-<span class="sourceLineNo">223</span>      // again and then unassign it, otherwise we have to fail the merge/split procedure as we may<a name="line.223"></a>
-<span class="sourceLineNo">224</span>      // loss data.<a name="line.224"></a>
-<span class="sourceLineNo">225</span>      setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_CLOSE);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>      return Flow.HAS_MORE_STATE;<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    }<a name="line.227"></a>
-<span class="sourceLineNo">228</span><a name="line.228"></a>
-<span class="sourceLineNo">229</span>    int retries = env.getAssignmentManager().getRegionStates().addToFailedOpen(regionNode)<a name="line.229"></a>
-<span class="sourceLineNo">230</span>        .incrementAndGetRetries();<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    int maxAttempts = env.getAssignmentManager().getAssignMaxAttempts();<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    LOG.info("Retry={} of max={}; {}; {}", retries, maxAttempts, this, regionNode.toShortString());<a name="line.232"></a>
-<span class="sourceLineNo">233</span><a name="line.233"></a>
-<span class="sourceLineNo">234</span>    if (retries &gt;= maxAttempts) {<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      env.getAssignmentManager().regionFailedOpen(regionNode, true);<a name="line.235"></a>
-<span class="sourceLineNo">236</span>      setFailure(getClass().getSimpleName(), new RetriesExhaustedException(<a name="line.236"></a>
-<span class="sourceLineNo">237</span>        "Max attempts " + env.getAssignmentManager().getAssignMaxAttempts() + " exceeded"));<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      regionNode.unsetProcedure(this);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      return Flow.NO_MORE_STATE;<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    }<a name="line.240"></a>
-<span class="sourceLineNo">241</span><a name="line.241"></a>
-<span class="sourceLineNo">242</span>    env.getAssignmentManager().regionFailedOpen(regionNode, false);<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    // we failed to assign the region, force a new plan<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    forceNewPlan = true;<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    regionNode.setRegionLocation(null);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE);<a name="line.246"></a>
-<span class="sourceLineNo">247</span><a name="line.247"></a>
-<span class="sourceLineNo">248</span>    if (retries &gt; env.getAssignmentManager().getAssignRetryImmediatelyMaxAttempts()) {<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      // Throw exception to backoff and retry when failed open too many times<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      throw new HBaseIOException("Failed to open region");<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    } else {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      // Here we do not throw exception because we want to the region to be online ASAP<a name="line.252"></a>
-<span class="sourceLineNo">253</span>      return Flow.HAS_MORE_STATE;<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    }<a name="line.254"></a>
-<span class="sourceLineNo">255</span>  }<a name="line.255"></a>
-<span class="sourceLineNo">256</span><a name="line.256"></a>
-<span class="sourceLineNo">257</span>  private void closeRegion(MasterProcedureEnv env, RegionStateNode regionNode) throws IOException {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    if (regionNode.isInState(State.OPEN, State.CLOSING, State.MERGING, State.SPLITTING)) {<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      // this is the normal case<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      env.getAssignmentManager().regionClosing(regionNode);<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      addChildProcedure(new CloseRegionProcedure(this, getRegion(), regionNode.getRegionLocation(),<a name="line.261"></a>
-<span class="sourceLineNo">262</span>        assignCandidate));<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_CLOSED);<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    } else {<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      forceNewPlan = true;<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      regionNode.setRegionLocation(null);<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE);<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    }<a name="line.268"></a>
-<span class="sourceLineNo">269</span>  }<a name="line.269"></a>
-<span class="sourceLineNo">270</span><a name="line.270"></a>
-<span class="sourceLineNo">271</span>  private Flow confirmClosed(MasterProcedureEnv env, RegionStateNode regionNode)<a name="line.271"></a>
-<span class="sourceLineNo">272</span>      throws IOException {<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    if (regionNode.isInState(State.CLOSED)) {<a name="line.273"></a>
-<span class="sourceLineNo">274</span>      attempt = 0;<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      if (lastState == RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_CLOSED) {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>        // we are the last state, finish<a name="line.276"></a>
-<span class="sourceLineNo">277</span>        regionNode.unsetProcedure(this);<a name="line.277"></a>
-<span class="sourceLineNo">278</span>        return Flow.NO_MORE_STATE;<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      }<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      // This means we need to open the region again, should be a move or reopen<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      return Flow.HAS_MORE_STATE;<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    }<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    if (regionNode.isInState(State.CLOSING)) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      // This is possible, think the target RS crashes and restarts immediately, the close region<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      // operation will return a NotServingRegionException soon, we can only recover after SCP takes<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      // care of this RS. So here we throw an IOException to let upper layer to retry with backoff.<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_CLOSE);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      throw new HBaseIOException("Failed to close region");<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    }<a name="line.290"></a>
-<span class="sourceLineNo">291</span>    // abnormally closed, need to reopen it, no matter what is the last state, see the comment in<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    // confirmOpened for more details that why we need to reopen the region first even if we just<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    // want to close it.<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    // The only exception is for non-default replica, where we do not need to deal with recovered<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    // edits. Notice that the region will remain in ABNORMALLY_CLOSED state, the upper layer need to<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    // deal with this state. For non-default replica, this is usually the same with CLOSED.<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    assert regionNode.isInState(State.ABNORMALLY_CLOSED);<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    if (!RegionReplicaUtil.isDefaultReplica(getRegion()) &amp;&amp;<a name="line.298"></a>
-<span class="sourceLineNo">299</span>      lastState == RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_CLOSED) {<a name="line.299"></a>
-<span class="sourceLineNo">300</span>      regionNode.unsetProcedure(this);<a name="line.300"></a>
-<span class="sourceLineNo">301</span>      return Flow.NO_MORE_STATE;<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    }<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    attempt = 0;<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE);<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    return Flow.HAS_MORE_STATE;<a name="line.305"></a>
-<span class="sourceLineNo">306</span>  }<a name="line.306"></a>
-<span class="sourceLineNo">307</span><a name="line.307"></a>
-<span class="sourceLineNo">308</span>  // Override to lock RegionStateNode<a name="line.308"></a>
-<span class="sourceLineNo">309</span>  @SuppressWarnings("rawtypes")<a name="line.309"></a>
-<span class="sourceLineNo">310</span>  @Override<a name="line.310"></a>
-<span class="sourceLineNo">311</span>  protected Procedure[] execute(MasterProcedureEnv env)<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      throws ProcedureSuspendedException, ProcedureYieldException, InterruptedException {<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    RegionStateNode regionNode =<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      env.getAssignmentManager().getRegionStates().getOrCreateRegionStateNode(getRegion());<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    regionNode.lock();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    try {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>      return super.execute(env);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>    } finally {<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      regionNode.unlock();<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    }<a name="line.320"></a>
-<span class="sourceLineNo">321</span>  }<a name="line.321"></a>
-<span class="sourceLineNo">322</span><a name="line.322"></a>
-<span class="sourceLineNo">323</span>  private RegionStateNode getRegionStateNode(MasterProcedureEnv env) {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    return env.getAssignmentManager().getRegionStates().getOrCreateRegionStateNode(getRegion());<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>  @Override<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  protected Flow executeFromState(MasterProcedureEnv env, RegionStateTransitionState state)<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      throws ProcedureSuspendedException, ProcedureYieldException, InterruptedException {<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    RegionStateNode regionNode = getRegionStateNode(env);<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    try {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      switch (state) {<a name="line.332"></a>
-<span class="sourceLineNo">333</span>        case REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE:<a name="line.333"></a>
-<span class="sourceLineNo">334</span>          queueAssign(env, regionNode);<a name="line.334"></a>
-<span class="sourceLineNo">335</span>          return Flow.HAS_MORE_STATE;<a name="line.335"></a>
-<span class="sourceLineNo">336</span>        case REGION_STATE_TRANSITION_OPEN:<a name="line.336"></a>
-<span class="sourceLineNo">337</span>          openRegion(env, regionNode);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>          return Flow.HAS_MORE_STATE;<a name="line.338"></a>
-<span class="sourceLineNo">339</span>        case REGION_STATE_TRANSITION_CONFIRM_OPENED:<a name="line.339"></a>
-<span class="sourceLineNo">340</span>          return confirmOpened(env, regionNode);<a name="line.340"></a>
-<span class="sourceLineNo">341</span>        case REGION_STATE_TRANSITION_CLOSE:<a name="line.341"></a>
-<span class="sourceLineNo">342</span>          closeRegion(env, regionNode);<a name="line.342"></a>
-<span class="sourceLineNo">343</span>          return Flow.HAS_MORE_STATE;<a name="line.343"></a>
-<span class="sourceLineNo">344</span>        case REGION_STATE_TRANSITION_CONFIRM_CLOSED:<a name="line.344"></a>
-<span class="sourceLineNo">345</span>          return confirmClosed(env, regionNode);<a name="line.345"></a>
-<span class="sourceLineNo">346</span>        default:<a name="line.346"></a>
-<span class="sourceLineNo">347</span>          throw new UnsupportedOperationException("unhandled state=" + state);<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      }<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    } catch (IOException e) {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>      long backoff = ProcedureUtil.getBackoffTimeMs(this.attempt++);<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      LOG.warn(<a name="line.351"></a>
-<span class="sourceLineNo">352</span>        "Failed transition, suspend {}secs {}; {}; waiting on rectified condition fixed " +<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          "by other Procedure or operator intervention",<a name="line.353"></a>
-<span class="sourceLineNo">354</span>        backoff / 1000, this, regionNode.toShortString(), e);<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      setTimeout(Math.toIntExact(backoff));<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      setState(ProcedureProtos.ProcedureState.WAITING_TIMEOUT);<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      skipPersistence();<a name="line.357"></a>
-<span class="sourceLineNo">358</span>      throw new ProcedureSuspendedException();<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><a name="line.361"></a>
-<span class="sourceLineNo">362</span>  /**<a name="line.362"></a>
-<span class="sourceLineNo">363</span>   * At end of timeout, wake ourselves up so we run again.<a name="line.363"></a>
-<span class="sourceLineNo">364</span>   */<a name="line.364"></a>
-<span class="sourceLineNo">365</span>  @Override<a name="line.365"></a>
-<span class="sourceLineNo">366</span>  protected synchronized boolean setTimeoutFailure(MasterProcedureEnv env) {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    setState(ProcedureProtos.ProcedureState.RUNNABLE);<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    env.getProcedureScheduler().addFront(this);<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    return false; // 'false' means that this procedure handled the timeout<a name="line.369"></a>
-<span class="sourceLineNo">370</span>  }<a name="line.370"></a>
-<span class="sourceLineNo">371</span><a name="line.371"></a>
-<span class="sourceLineNo">372</span>  // Should be called with RegionStateNode locked<a name="line.372"></a>
-<span class="sourceLineNo">373</span>  public void reportTransition(MasterProcedureEnv env, RegionStateNode regionNode,<a name="line.373"></a>
-<span class="sourceLineNo">374</span>      ServerName serverName, TransitionCode code, long seqId, long procId) throws IOException {<a name="line.374"></a>
-<span class="sourceLineNo">375</span>    if (remoteProc == null) {<a name="line.375"></a>
-<span class="sourceLineNo">376</span>      LOG.warn(<a name="line.376"></a>
-<span class="sourceLineNo">377</span>        "There is no outstanding remote region procedure for {}, serverName={}, code={}," +<a name="line.377"></a>
-<span class="sourceLineNo">378</span>          " seqId={}, proc={}, should be a retry, ignore",<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        regionNode, serverName, code, seqId, this);<a name="line.379"></a>
-<span class="sourceLineNo">380</span>      return;<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    }<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    // The procId could be -1 if it is from an old region server, we need to deal with it so that we<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    // can do rolling upgraing.<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    if (procId &gt;= 0 &amp;&amp; remoteProc.getProcId() != procId) {<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      LOG.warn(<a name="line.385"></a>
-<span class="sourceLineNo">386</span>        "The pid of remote region procedure for {} is {}, the reported pid={}, serverName={}," +<a name="line.386"></a>
-<span class="sourceLineNo">387</span>          " code={}, seqId={}, proc={}, should be a retry, ignore",<a name="line.387"></a>
-<span class="sourceLineNo">388</span>        regionNode, remoteProc.getProcId(), procId, serverName, code, seqId, this);<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      return;<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    }<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    remoteProc.reportTransition(env, regionNode, serverName, code, seqId);<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>  // Should be called with RegionStateNode locked<a name="line.394"></a>
-<span class="sourceLineNo">395</span>  public void serverCrashed(MasterProcedureEnv env, RegionStateNode regionNode,<a name="line.395"></a>
-<span class="sourceLineNo">396</span>      ServerName serverName) throws IOException {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    if (remoteProc != null) {<a name="line.397"></a>
-<span class="sourceLineNo">398</span>      // this means we are waiting for the sub procedure, so wake it up<a name="line.398"></a>
-<span class="sourceLineNo">399</span>      remoteProc.serverCrashed(env, regionNode, serverName);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    } else {<a name="line.400"></a>
-<span class="sourceLineNo">401</span>      // we are in RUNNING state, just update the region state, and we will process it later.<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      env.getAssignmentManager().regionClosed(regionNode, false);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>  }<a name="line.404"></a>
-<span class="sourceLineNo">405</span><a name="line.405"></a>
-<span class="sourceLineNo">406</span>  void attachRemoteProc(RegionRemoteProcedureBase proc) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    this.remoteProc = proc;<a name="line.407"></a>
+<span class="sourceLineNo">065</span> * &lt;p/&gt;<a name="line.65"></a>
+<span class="sourceLineNo">066</span> * The typical state transition for assigning a region is:<a name="line.66"></a>
+<span class="sourceLineNo">067</span> *<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * &lt;pre&gt;<a name="line.68"></a>
+<span class="sourceLineNo">069</span> * GET_ASSIGN_CANDIDATE ------&gt; OPEN -----&gt; CONFIRM_OPENED<a name="line.69"></a>
+<span class="sourceLineNo">070</span> * &lt;/pre&gt;<a name="line.70"></a>
+<span class="sourceLineNo">071</span> *<a name="line.71"></a>
+<span class="sourceLineNo">072</span> * Notice that, if there are failures we may go back to the {@code GET_ASSIGN_CANDIDATE} state to<a name="line.72"></a>
+<span class="sourceLineNo">073</span> * try again.<a name="line.73"></a>
+<span class="sourceLineNo">074</span> * &lt;p/&gt;<a name="line.74"></a>
+<span class="sourceLineNo">075</span> * The typical state transition for unassigning a region is:<a name="line.75"></a>
+<span class="sourceLineNo">076</span> *<a name="line.76"></a>
+<span class="sourceLineNo">077</span> * &lt;pre&gt;<a name="line.77"></a>
+<span class="sourceLineNo">078</span> * CLOSE -----&gt; CONFIRM_CLOSED<a name="line.78"></a>
+<span class="sourceLineNo">079</span> * &lt;/pre&gt;<a name="line.79"></a>
+<span class="sourceLineNo">080</span> *<a name="line.80"></a>
+<span class="sourceLineNo">081</span> * Here things go a bit different, if there are failures, especially that if there is a server<a name="line.81"></a>
+<span class="sourceLineNo">082</span> * crash, we will go to the {@code GET_ASSIGN_CANDIDATE} state to bring the region online first, and<a name="line.82"></a>
+<span class="sourceLineNo">083</span> * then go through the normal way to unassign it.<a name="line.83"></a>
+<span class="sourceLineNo">084</span> * &lt;p/&gt;<a name="line.84"></a>
+<span class="sourceLineNo">085</span> * The typical state transition for reopening/moving a region is:<a name="line.85"></a>
+<span class="sourceLineNo">086</span> *<a name="line.86"></a>
+<span class="sourceLineNo">087</span> * &lt;pre&gt;<a name="line.87"></a>
+<span class="sourceLineNo">088</span> * CLOSE -----&gt; CONFIRM_CLOSED -----&gt; GET_ASSIGN_CANDIDATE ------&gt; OPEN -----&gt; CONFIRM_OPENED<a name="line.88"></a>
+<span class="sourceLineNo">089</span> * &lt;/pre&gt;<a name="line.89"></a>
+<span class="sourceLineNo">090</span> *<a name="line.90"></a>
+<span class="sourceLineNo">091</span> * The retry logic is the same with the above assign/unassign.<a name="line.91"></a>
+<span class="sourceLineNo">092</span> * &lt;p/&gt;<a name="line.92"></a>
+<span class="sourceLineNo">093</span> * Notice that, although we allow specify a target server, it just acts as a candidate, we do not<a name="line.93"></a>
+<span class="sourceLineNo">094</span> * guarantee that the region will finally be on the target server. If this is important for you, you<a name="line.94"></a>
+<span class="sourceLineNo">095</span> * should check whether the region is on the target server after the procedure is finished.<a name="line.95"></a>
+<span class="sourceLineNo">096</span> * &lt;p/&gt;<a name="line.96"></a>
+<span class="sourceLineNo">097</span> * When you want to schedule a TRSP, please check whether there is still one for this region, and<a name="line.97"></a>
+<span class="sourceLineNo">098</span> * the check should be under the RegionStateNode lock. We will remove the TRSP from a<a name="line.98"></a>
+<span class="sourceLineNo">099</span> * RegionStateNode when we are done, see the code in {@code reportTransition} method below. There<a name="line.99"></a>
+<span class="sourceLineNo">100</span> * could be at most one TRSP for a give region.<a name="line.100"></a>
+<span class="sourceLineNo">101</span> */<a name="line.101"></a>
+<span class="sourceLineNo">102</span>@InterfaceAudience.Private<a name="line.102"></a>
+<span class="sourceLineNo">103</span>public class TransitRegionStateProcedure<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    extends AbstractStateMachineRegionProcedure&lt;RegionStateTransitionState&gt; {<a name="line.104"></a>
+<span class="sourceLineNo">105</span><a name="line.105"></a>
+<span class="sourceLineNo">106</span>  private static final Logger LOG = LoggerFactory.getLogger(TransitRegionStateProcedure.class);<a name="line.106"></a>
+<span class="sourceLineNo">107</span><a name="line.107"></a>
+<span class="sourceLineNo">108</span>  private TransitionType type;<a name="line.108"></a>
+<span class="sourceLineNo">109</span><a name="line.109"></a>
+<span class="sourceLineNo">110</span>  private RegionStateTransitionState initialState;<a name="line.110"></a>
+<span class="sourceLineNo">111</span><a name="line.111"></a>
+<span class="sourceLineNo">112</span>  private RegionStateTransitionState lastState;<a name="line.112"></a>
+<span class="sourceLineNo">113</span><a name="line.113"></a>
+<span class="sourceLineNo">114</span>  // the candidate where we want to assign the region to.<a name="line.114"></a>
+<span class="sourceLineNo">115</span>  private ServerName assignCandidate;<a name="line.115"></a>
+<span class="sourceLineNo">116</span><a name="line.116"></a>
+<span class="sourceLineNo">117</span>  private boolean forceNewPlan;<a name="line.117"></a>
+<span class="sourceLineNo">118</span><a name="line.118"></a>
+<span class="sourceLineNo">119</span>  private RetryCounter retryCounter;<a name="line.119"></a>
+<span class="sourceLineNo">120</span><a name="line.120"></a>
+<span class="sourceLineNo">121</span>  private RegionRemoteProcedureBase remoteProc;<a name="line.121"></a>
+<span class="sourceLineNo">122</span><a name="line.122"></a>
+<span class="sourceLineNo">123</span>  public TransitRegionStateProcedure() {<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  }<a name="line.124"></a>
+<span class="sourceLineNo">125</span><a name="line.125"></a>
+<span class="sourceLineNo">126</span>  private void setInitalAndLastState() {<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    switch (type) {<a name="line.127"></a>
+<span class="sourceLineNo">128</span>      case ASSIGN:<a name="line.128"></a>
+<span class="sourceLineNo">129</span>        initialState = RegionStateTransitionState.REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE;<a name="line.129"></a>
+<span class="sourceLineNo">130</span>        lastState = RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_OPENED;<a name="line.130"></a>
+<span class="sourceLineNo">131</span>        break;<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      case UNASSIGN:<a name="line.132"></a>
+<span class="sourceLineNo">133</span>        initialState = RegionStateTransitionState.REGION_STATE_TRANSITION_CLOSE;<a name="line.133"></a>
+<span class="sourceLineNo">134</span>        lastState = RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_CLOSED;<a name="line.134"></a>
+<span class="sourceLineNo">135</span>        break;<a name="line.135"></a>
+<span class="sourceLineNo">136</span>      case MOVE:<a name="line.136"></a>
+<span class="sourceLineNo">137</span>      case REOPEN:<a name="line.137"></a>
+<span class="sourceLineNo">138</span>        initialState = RegionStateTransitionState.REGION_STATE_TRANSITION_CLOSE;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>        lastState = RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_OPENED;<a name="line.139"></a>
+<span class="sourceLineNo">140</span>        break;<a name="line.140"></a>
+<span class="sourceLineNo">141</span>      default:<a name="line.141"></a>
+<span class="sourceLineNo">142</span>        throw new IllegalArgumentException("Unknown TransitionType: " + type);<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    }<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  }<a name="line.144"></a>
+<span class="sourceLineNo">145</span><a name="line.145"></a>
+<span class="sourceLineNo">146</span>  @VisibleForTesting<a name="line.146"></a>
+<span class="sourceLineNo">147</span>  protected TransitRegionStateProcedure(MasterProcedureEnv env, RegionInfo hri,<a name="line.147"></a>
+<span class="sourceLineNo">148</span>      ServerName assignCandidate, boolean forceNewPlan, TransitionType type) {<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    super(env, hri);<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    this.assignCandidate = assignCandidate;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    this.forceNewPlan = forceNewPlan;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>    this.type = type;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    setInitalAndLastState();<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  }<a name="line.154"></a>
+<span class="sourceLineNo">155</span><a name="line.155"></a>
+<span class="sourceLineNo">156</span>  @Override<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  public TableOperationType getTableOperationType() {<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    // TODO: maybe we should make another type here, REGION_TRANSITION?<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    return TableOperationType.REGION_EDIT;<a name="line.159"></a>
+<span class="sourceLineNo">160</span>  }<a name="line.160"></a>
+<span class="sourceLineNo">161</span><a name="line.161"></a>
+<span class="sourceLineNo">162</span>  @Override<a name="line.162"></a>
+<span class="sourceLineNo">163</span>  protected boolean waitInitialized(MasterProcedureEnv env) {<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    if (TableName.isMetaTableName(getTableName())) {<a name="line.164"></a>
+<span class="sourceLineNo">165</span>      return false;<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    }<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    // First we need meta to be loaded, and second, if meta is not online then we will likely to<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    // fail when updating meta so we wait until it is assigned.<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    AssignmentManager am = env.getAssignmentManager();<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    return am.waitMetaLoaded(this) || am.waitMetaAssigned(this, getRegion());<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  }<a name="line.171"></a>
+<span class="sourceLineNo">172</span><a name="line.172"></a>
+<span class="sourceLineNo">173</span>  private void queueAssign(MasterProcedureEnv env, RegionStateNode regionNode)<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      throws ProcedureSuspendedException {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    // Here the assumption is that, the region must be in CLOSED state, so the region location<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    // will be null. And if we fail to open the region and retry here, the forceNewPlan will be<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    // true, and also we will set the region location to null.<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    boolean retain = false;<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    if (!forceNewPlan) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      if (assignCandidate != null) {<a name="line.180"></a>
+<span class="sourceLineNo">181</span>        retain = assignCandidate.equals(regionNode.getLastHost());<a name="line.181"></a>
+<span class="sourceLineNo">182</span>        regionNode.setRegionLocation(assignCandidate);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      } else if (regionNode.getLastHost() != null) {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>        retain = true;<a name="line.184"></a>
+<span class="sourceLineNo">185</span>        LOG.info("Setting lastHost as the region location {}", regionNode.getLastHost());<a name="line.185"></a>
+<span class="sourceLineNo">186</span>        regionNode.setRegionLocation(regionNode.getLastHost());<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      }<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    }<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    LOG.info("Starting {}; {}; forceNewPlan={}, retain={}", this, regionNode.toShortString(),<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      forceNewPlan, retain);<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    env.getAssignmentManager().queueAssign(regionNode);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_OPEN);<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    if (regionNode.getProcedureEvent().suspendIfNotReady(this)) {<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      throw new ProcedureSuspendedException();<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    }<a name="line.195"></a>
+<span class="sourceLineNo">196</span>  }<a name="line.196"></a>
+<span class="sourceLineNo">197</span><a name="line.197"></a>
+<span class="sourceLineNo">198</span>  private void openRegion(MasterProcedureEnv env, RegionStateNode regionNode) throws IOException {<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    ServerName loc = regionNode.getRegionLocation();<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    if (loc == null) {<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      LOG.warn("No location specified for {}, jump back to state {} to get one", getRegion(),<a name="line.201"></a>
+<span class="sourceLineNo">202</span>        RegionStateTransitionState.REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE);<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE);<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      return;<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    }<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    env.getAssignmentManager().regionOpening(regionNode);<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    addChildProcedure(new OpenRegionProcedure(this, getRegion(), loc));<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_OPENED);<a name="line.208"></a>
+<span class="sourceLineNo">209</span>  }<a name="line.209"></a>
+<span class="sourceLineNo">210</span><a name="line.210"></a>
+<span class="sourceLineNo">211</span>  private Flow confirmOpened(MasterProcedureEnv env, RegionStateNode regionNode)<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      throws IOException {<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    if (regionNode.isInState(State.OPEN)) {<a name="line.213"></a>
+<span class="sourceLineNo">214</span>      retryCounter = null;<a name="line.214"></a>
+<span class="sourceLineNo">215</span>      if (lastState == RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_OPENED) {<a name="line.215"></a>
+<span class="sourceLineNo">216</span>        // we are the last state, finish<a name="line.216"></a>
+<span class="sourceLineNo">217</span>        regionNode.unsetProcedure(this);<a name="line.217"></a>
+<span class="sourceLineNo">218</span>        ServerCrashProcedure.updateProgress(env, getParentProcId());<a name="line.218"></a>
+<span class="sourceLineNo">219</span>        return Flow.NO_MORE_STATE;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      }<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      // It is possible that we arrive here but confirm opened is not the last state, for example,<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      // when merging or splitting a region, we unassign the region from a RS and the RS is crashed,<a name="line.222"></a>
+<span class="sourceLineNo">223</span>      // then there will be recovered edits for this region, we'd better make the region online<a name="line.223"></a>
+<span class="sourceLineNo">224</span>      // again and then unassign it, otherwise we have to fail the merge/split procedure as we may<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      // loss data.<a name="line.225"></a>
+<span class="sourceLineNo">226</span>      setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_CLOSE);<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      return Flow.HAS_MORE_STATE;<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
+<span class="sourceLineNo">229</span><a name="line.229"></a>
+<span class="sourceLineNo">230</span>    int retries = env.getAssignmentManager().getRegionStates().addToFailedOpen(regionNode)<a name="line.230"></a>
+<span class="sourceLineNo">231</span>        .incrementAndGetRetries();<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    int maxAttempts = env.getAssignmentManager().getAssignMaxAttempts();<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    LOG.info("Retry={} of max={}; {}; {}", retries, maxAttempts, this, regionNode.toShortString());<a name="line.233"></a>
+<span class="sourceLineNo">234</span><a name="line.234"></a>
+<span class="sourceLineNo">235</span>    if (retries &gt;= maxAttempts) {<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      env.getAssignmentManager().regionFailedOpen(regionNode, true);<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      setFailure(getClass().getSimpleName(), new RetriesExhaustedException(<a name="line.237"></a>
+<span class="sourceLineNo">238</span>        "Max attempts " + env.getAssignmentManager().getAssignMaxAttempts() + " exceeded"));<a name="line.238"></a>
+<span class="sourceLineNo">239</span>      regionNode.unsetProcedure(this);<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      return Flow.NO_MORE_STATE;<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    }<a name="line.241"></a>
+<span class="sourceLineNo">242</span><a name="line.242"></a>
+<span class="sourceLineNo">243</span>    env.getAssignmentManager().regionFailedOpen(regionNode, false);<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    // we failed to assign the region, force a new plan<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    forceNewPlan = true;<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    regionNode.setRegionLocation(null);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE);<a name="line.247"></a>
+<span class="sourceLineNo">248</span><a name="line.248"></a>
+<span class="sourceLineNo">249</span>    if (retries &gt; env.getAssignmentManager().getAssignRetryImmediatelyMaxAttempts()) {<a name="line.249"></a>
+<span class="sourceLineNo">250</span>      // Throw exception to backoff and retry when failed open too many times<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      throw new HBaseIOException("Failed to open region");<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    } else {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      // Here we do not throw exception because we want to the region to be online ASAP<a name="line.253"></a>
+<span class="sourceLineNo">254</span>      return Flow.HAS_MORE_STATE;<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    }<a name="line.255"></a>
+<span class="sourceLineNo">256</span>  }<a name="line.256"></a>
+<span class="sourceLineNo">257</span><a name="line.257"></a>
+<span class="sourceLineNo">258</span>  private void closeRegion(MasterProcedureEnv env, RegionStateNode regionNode) throws IOException {<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    if (regionNode.isInState(State.OPEN, State.CLOSING, State.MERGING, State.SPLITTING)) {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      // this is the normal case<a name="line.260"></a>
+<span class="sourceLineNo">261</span>      env.getAssignmentManager().regionClosing(regionNode);<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      addChildProcedure(new CloseRegionProcedure(this, getRegion(), regionNode.getRegionLocation(),<a name="line.262"></a>
+<span class="sourceLineNo">263</span>        assignCandidate));<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_CLOSED);<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    } else {<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      forceNewPlan = true;<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      regionNode.setRegionLocation(null);<a name="line.267"></a>
+<span class="sourceLineNo">268</span>      setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE);<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    }<a name="line.269"></a>
+<span class="sourceLineNo">270</span>  }<a name="line.270"></a>
+<span class="sourceLineNo">271</span><a name="line.271"></a>
+<span class="sourceLineNo">272</span>  private Flow confirmClosed(MasterProcedureEnv env, RegionStateNode regionNode)<a name="line.272"></a>
+<span class="sourceLineNo">273</span>      throws IOException {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    if (regionNode.isInState(State.CLOSED)) {<a name="line.274"></a>
+<span class="sourceLineNo">275</span>      retryCounter = null;<a name="line.275"></a>
+<span class="sourceLineNo">276</span>      if (lastState == RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_CLOSED) {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>        // we are the last state, finish<a name="line.277"></a>
+<span class="sourceLineNo">278</span>        regionNode.unsetProcedure(this);<a name="line.278"></a>
+<span class="sourceLineNo">279</span>        return Flow.NO_MORE_STATE;<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      }<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      // This means we need to open the region again, should be a move or reopen<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      return Flow.HAS_MORE_STATE;<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    }<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    if (regionNode.isInState(State.CLOSING)) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      // This is possible, think the target RS crashes and restarts immediately, the close region<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      // operation will return a NotServingRegionException soon, we can only recover after SCP takes<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      // care of this RS. So here we throw an IOException to let upper layer to retry with backoff.<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_CLOSE);<a name="line.289"></a>
+<span class="sourceLineNo">290</span>      throw new HBaseIOException("Failed to close region");<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    }<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    // abnormally closed, need to reopen it, no matter what is the last state, see the comment in<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    // confirmOpened for more details that why we need to reopen the region first even if we just<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    // want to close it.<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    // The only exception is for non-default replica, where we do not need to deal with recovered<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    // edits. Notice that the region will remain in ABNORMALLY_CLOSED state, the upper layer need to<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    // deal with this state. For non-default replica, this is usually the same with CLOSED.<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    assert regionNode.isInState(State.ABNORMALLY_CLOSED);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    if (!RegionReplicaUtil.isDefaultReplica(getRegion()) &amp;&amp;<a name="line.299"></a>
+<span class="sourceLineNo">300</span>      lastState == RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_CLOSED) {<a name="line.300"></a>
+<span class="sourceLineNo">301</span>      regionNode.unsetProcedure(this);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>      return Flow.NO_MORE_STATE;<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    }<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    retryCounter = null;<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    return Flow.HAS_MORE_STATE;<a name="line.306"></a>
+<span class="sourceLineNo">307</span>  }<a name="line.307"></a>
+<span class="sourceLineNo">308</span><a name="line.308"></a>
+<span class="sourceLineNo">309</span>  // Override to lock RegionStateNode<a name="line.309"></a>
+<span class="sourceLineNo">310</span>  @SuppressWarnings("rawtypes")<a name="line.310"></a>
+<span class="sourceLineNo">311</span>  @Override<a name="line.311"></a>
+<span class="sourceLineNo">312</span>  protected Procedure[] execute(MasterProcedureEnv env)<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      throws ProcedureSuspendedException, ProcedureYieldException, InterruptedException {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    RegionStateNode regionNode =<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      env.getAssignmentManager().getRegionStates().getOrCreateRegionStateNode(getRegion());<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    regionNode.lock();<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    try {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>      return super.execute(env);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>    } finally {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>      regionNode.unlock();<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><a name="line.323"></a>
+<span class="sourceLineNo">324</span>  private RegionStateNode getRegionStateNode(MasterProcedureEnv env) {<a name="line.324"></a>
+<span class="sourceLineNo">325</span>    return env.getAssignmentManager().getRegionStates().getOrCreateRegionStateNode(getRegion());<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>  @Override<a name="line.328"></a>
+<span class="sourceLineNo">329</span>  protected Flow executeFromState(MasterProcedureEnv env, RegionStateTransitionState state)<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      throws ProcedureSuspendedException, ProcedureYieldException, InterruptedException {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    RegionStateNode regionNode = getRegionStateNode(env);<a name="line.331"></a>
+<span class="sourceLineNo">332</span>    try {<a name="line.332"></a>
+<span class="sourceLineNo">333</span>      switch (state) {<a name="line.333"></a>
+<span class="sourceLineNo">334</span>        case REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE:<a name="line.334"></a>
+<span class="sourceLineNo">335</span>          queueAssign(env, regionNode);<a name="line.335"></a>
+<span class="sourceLineNo">336</span>          return Flow.HAS_MORE_STATE;<a name="line.336"></a>
+<span class="sourceLineNo">337</span>        case REGION_STATE_TRANSITION_OPEN:<a name="line.337"></a>
+<span class="sourceLineNo">338</span>          openRegion(env, regionNode);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>          return Flow.HAS_MORE_STATE;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>        case REGION_STATE_TRANSITION_CONFIRM_OPENED:<a name="line.340"></a>
+<span class="sourceLineNo">341</span>          return confirmOpened(env, regionNode);<a name="line.341"></a>
+<span class="sourceLineNo">342</span>        case REGION_STATE_TRANSITION_CLOSE:<a name="line.342"></a>
+<span class="sourceLineNo">343</span>          closeRegion(env, regionNode);<a name="line.343"></a>
+<span class="sourceLineNo">344</span>          return Flow.HAS_MORE_STATE;<a name="line.344"></a>
+<span class="sourceLineNo">345</span>        case REGION_STATE_TRANSITION_CONFIRM_CLOSED:<a name="line.345"></a>
+<span class="sourceLineNo">346</span>          return confirmClosed(env, regionNode);<a name="line.346"></a>
+<span class="sourceLineNo">347</span>        default:<a name="line.347"></a>
+<span class="sourceLineNo">348</span>          throw new UnsupportedOperationException("unhandled state=" + state);<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      }<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    } catch (IOException e) {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>      if (retryCounter == null) {<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        retryCounter = ProcedureUtil.createRetryCounter(env.getMasterConfiguration());<a name="line.352"></a>
+<span class="sourceLineNo">353</span>      }<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      long backoff = retryCounter.getBackoffTimeAndIncrementAttempts();<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      LOG.warn(<a name="line.355"></a>
+<span class="sourceLineNo">356</span>        "Failed transition, suspend {}secs {}; {}; waiting on rectified condition fixed " +<a name="line.356"></a>
+<span class="sourceLineNo">357</span>          "by other Procedure or operator intervention",<a name="line.357"></a>
+<span class="sourceLineNo">358</span>        backoff / 1000, this, regionNode.toShortString(), e);<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      setTimeout(Math.toIntExact(backoff));<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      setState(ProcedureProtos.ProcedureState.WAITING_TIMEOUT);<a name="line.360"></a>
+<span class="sourceLineNo">361</span>      skipPersistence();<a name="line.361"></a>
+<span class="sourceLineNo">362</span>      throw new ProcedureSuspendedException();<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><a name="line.365"></a>
+<span class="sourceLineNo">366</span>  /**<a name="line.366"></a>
+<span class="sourceLineNo">367</span>   * At end of timeout, wake ourselves up so we run again.<a name="line.367"></a>
+<span class="sourceLineNo">368</span>   */<a name="line.368"></a>
+<span class="sourceLineNo">369</span>  @Override<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  protected synchronized boolean setTimeoutFailure(MasterProcedureEnv env) {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    setState(ProcedureProtos.ProcedureState.RUNNABLE);<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    env.getProcedureScheduler().addFront(this);<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    return false; // 'false' means that this procedure handled the timeout<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>  // Should be called with RegionStateNode locked<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  public void reportTransition(MasterProcedureEnv env, RegionStateNode regionNode,<a name="line.377"></a>
+<span class="sourceLineNo">378</span>      ServerName serverName, TransitionCode code, long seqId, long procId) throws IOException {<a name="line.378"></a>
+<span class="sourceLineNo">379</span>    if (remoteProc == null) {<a name="line.379"></a>
+<span class="sourceLineNo">380</span>      LOG.warn(<a name="line.380"></a>
+<span class="sourceLineNo">381</span>        "There is no outstanding remote region procedure for {}, serverName={}, code={}," +<a name="line.381"></a>
+<span class="sourceLineNo">382</span>          " seqId={}, proc={}, should be a retry, ignore",<a name="line.382"></a>
+<span class="sourceLineNo">383</span>        regionNode, serverName, code, seqId, this);<a name="line.383"></a>
+<span class="sourceLineNo">384</span>      return;<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    }<a name="line.385"></a>
+<span class="sourceLineNo">386</span>    // The procId could be -1 if it is from an old region server, we need to deal with it so that we<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    // can do rolling upgraing.<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    if (procId &gt;= 0 &amp;&amp; remoteProc.getProcId() != procId) {<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      LOG.warn(<a name="line.389"></a>
+<span class="sourceLineNo">390</span>        "The pid of remote region procedure for {} is {}, the reported pid={}, serverName={}," +<a name="line.390"></a>
+<span class="sourceLineNo">391</span>          " code={}, seqId={}, proc={}, should be a retry, ignore",<a name="line.391"></a>
+<span class="sourceLineNo">392</span>        regionNode, remoteProc.getProcId(), procId, serverName, code, seqId, this);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>      return;<a name="line.393"></a>
+<span class="sourceLineNo">394</span>    }<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    remoteProc.reportTransition(env, regionNode, serverName, code, seqId);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>  }<a name="line.396"></a>
+<span class="sourceLineNo">397</span><a name="line.397"></a>
+<span class="sourceLineNo">398</span>  // Should be called with RegionStateNode locked<a name="line.398"></a>
+<span class="sourceLineNo">399</span>  public void serverCrashed(MasterProcedureEnv env, RegionStateNode regionNode,<a name="line.399"></a>
+<span class="sourceLineNo">400</span>      ServerName serverName) throws IOException {<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    if (remoteProc != null) {<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      // this means we are waiting for the sub procedure, so wake it up<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      remoteProc.serverCrashed(env, regionNode, serverName);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    } else {<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      // we are in RUNNING state, just update the region state, and we will process it later.<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      env.getAssignmentManager().regionClosed(regionNode, false);<a name="line.406"></a>
+<span class="sourceLineNo">407</span>    }<a name="line.407"></a>
 <span class="sourceLineNo">408</span>  }<a name="line.408"></a>
 <span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>  void unattachRemoteProc(RegionRemoteProcedureBase proc) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    assert this.remoteProc == proc;<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    this.remoteProc = null;<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>  @Override<a name="line.415"></a>
-<span class="sourceLineNo">416</span>  protected void rollbackState(MasterProcedureEnv env, RegionStateTransitionState state)<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      throws IOException, InterruptedException {<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    // no rollback<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    throw new UnsupportedOperationException();<a name="line.419"></a>
-<span class="sourceLineNo">420</span>  }<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>  @Override<a name="line.422"></a>
-<span class="sourceLineNo">423</span>  protected RegionStateTransitionState getState(int stateId) {<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    return RegionStateTransitionState.forNumber(stateId);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>  }<a name="line.425"></a>
-<span class="sourceLineNo">426</span><a name="line.426"></a>
-<span class="sourceLineNo">427</span>  @Override<a name="line.427"></a>
-<span class="sourceLineNo">428</span>  protected int getStateId(RegionStateTransitionState state) {<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return state.getNumber();<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>  @Override<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  protected RegionStateTransitionState getInitialState() {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    return initialState;<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  }<a name="line.435"></a>
-<span class="sourceLineNo">436</span><a name="line.436"></a>
-<span class="sourceLineNo">437</span>  private static TransitionType convert(RegionTransitionType type) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    switch (type) {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>      case ASSIGN:<a name="line.439"></a>
-<span class="sourceLineNo">440</span>        return TransitionType.ASSIGN;<a name="line.440"></a>
-<span class="sourceLineNo">441</span>      case UNASSIGN:<a name="line.441"></a>
-<span class="sourceLineNo">442</span>        return TransitionType.UNASSIGN;<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      case MOVE:<a name="line.443"></a>
-<span class="sourceLineNo">444</span>        return TransitionType.MOVE;<a name="line.444"></a>
-<span class="sourceLineNo">445</span>      case REOPEN:<a name="line.445"></a>
-<span class="sourceLineNo">446</span>        return TransitionType.REOPEN;<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      default:<a name="line.447"></a>
-<span class="sourceLineNo">448</span>        throw new IllegalArgumentException("Unknown RegionTransitionType: " + type);<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 static RegionTransitionType convert(TransitionType type) {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    switch (type) {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      case ASSIGN:<a name="line.454"></a>
-<span class="sourceLineNo">455</span>        return RegionTransitionType.ASSIGN;<a name="line.455"></a>
-<span class="sourceLineNo">456</span>      case UNASSIGN:<a name="line.456"></a>
-<span class="sourceLineNo">457</span>        return RegionTransitionType.UNASSIGN;<a name="line.457"></a>
-<span class="sourceLineNo">458</span>      case MOVE:<a name="line.458"></a>
-<span class="sourceLineNo">459</span>        return RegionTransitionType.MOVE;<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      case REOPEN:<a name="line.460"></a>
-<span class="sourceLineNo">461</span>        return RegionTransitionType.REOPEN;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      default:<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        throw new IllegalArgumentException("Unknown TransitionType: " + type);<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><a name="line.466"></a>
-<span class="sourceLineNo">467</span>  @Override<a name="line.467"></a>
-<span class="sourceLineNo">468</span>  protected void serializeStateData(ProcedureStateSerializer serializer) throws IOException {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    super.serializeStateData(serializer);<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    RegionStateTransitionStateData.Builder builder = RegionStateTransitionStateData.newBuilder()<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      .setType(convert(type)).setForceNewPlan(forceNewPlan);<a name="line.471"></a>
-<span class="sourceLineNo">472</span>    if (assignCandidate != null) {<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      builder.setAssignCandidate(ProtobufUtil.toServerName(assignCandidate));<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    serializer.serialize(builder.build());<a name="line.475"></a>
-<span class="sourceLineNo">476</span>  }<a name="line.476"></a>
-<span class="sourceLineNo">477</span><a name="line.477"></a>
-<span class="sourceLineNo">478</span>  @Override<a name="line.478"></a>
-<span class="sourceLineNo">479</span>  protected void deserializeStateData(ProcedureStateSerializer serializer) throws IOException {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    super.deserializeStateData(serializer);<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    RegionStateTransitionStateData data =<a name="line.481"></a>
-<span class="sourceLineNo">482</span>      serializer.deserialize(RegionStateTransitionStateData.class);<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    type = convert(data.getType());<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    setInitalAndLastState();<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    forceNewPlan = data.getForceNewPlan();<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    if (data.hasAssignCandidate()) {<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      assignCandidate = ProtobufUtil.toServerName(data.getAssignCandidate());<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    }<a name="line.488"></a>
-<span class="sourceLineNo">489</span>  }<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>  @Override<a name="line.491"></a>
-<span class="sourceLineNo">492</span>  protected ProcedureMetrics getProcedureMetrics(MasterProcedureEnv env) {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    MetricsAssignmentManager metrics = env.getAssignmentManager().getAssignmentManagerMetrics();<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    switch (type) {<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      case ASSIGN:<a name="line.495"></a>
-<span class="sourceLineNo">496</span>        return metrics.getAssignProcMetrics();<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      case UNASSIGN:<a name="line.497"></a>
-<span class="sourceLineNo">498</span>        return metrics.getUnassignProcMetrics();<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      case MOVE:<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        return metrics.getMoveProcMetrics();<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      case REOPEN:<a name="line.501"></a>
-<span class="sourceLineNo">502</span>        return metrics.getReopenProcMetrics();<a name="line.502"></a>
-<span class="sourceLineNo">503</span>      default:<a name="line.503"></a>
-<span class="sourceLineNo">504</span>        throw new IllegalArgumentException("Unknown transition type: " + type);<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    }<a name="line.505"></a>
-<span class="sourceLineNo">506</span>  }<a name="line.506"></a>
-<span class="sourceLineNo">507</span><a name="line.507"></a>
-<span class="sourceLineNo">508</span>  @Override<a name="line.508"></a>
-<span class="sourceLineNo">509</span>  public void toStringClassDetails(StringBuilder sb) {<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    super.toStringClassDetails(sb);<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    if (initialState == RegionStateTransitionState.REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE) {<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      sb.append(", ASSIGN");<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    } else if (lastState == RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_CLOSED) {<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      sb.append(", UNASSIGN");<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    } else {<a name="line.515"></a>
-<span class="sourceLineNo">516</span>      sb.append(", REOPEN/MOVE");<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    }<a name="line.517"></a>
-<span class="sourceLineNo">518</span>  }<a name="line.518"></a>
-<span class="sourceLineNo">519</span><a name="line.519"></a>
-<span class="sourceLineNo">520</span>  private static TransitRegionStateProcedure setOwner(MasterProcedureEnv env,<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      TransitRegionStateProcedure proc) {<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    proc.setOwner(env.getRequestUser().getShortName());<a name="line.522"></a>
-<span class="sourceLineNo">523</span>    return proc;<a name="line.523"></a>
-<span class="sourceLineNo">524</span>  }<a name="line.524"></a>
-<span class="sourceLineNo">525</span><a name="line.525"></a>
-<span class="sourceLineNo">526</span>  public enum TransitionType {<a name="line.526"></a>
-<span class="sourceLineNo">527</span>    ASSIGN, UNASSIGN, MOVE, REOPEN<a name="line.527"></a>
+<span class="sourceLineNo">410</span>  void attachRemoteProc(RegionRemoteProcedureBase proc) {<a name="line.410"></a>
+<span class="sourceLineNo">411</span>    this.remoteProc = proc;<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>  void unattachRemoteProc(RegionRemoteProcedureBase proc) {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    assert this.remoteProc == proc;<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    this.remoteProc = null;<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>  @Override<a name="line.419"></a>
+<span class="sourceLineNo">420</span>  protected void rollbackState(MasterProcedureEnv env, RegionStateTransitionState state)<a name="line.420"></a>
+<span class="sourceLineNo">421</span>      throws IOException, InterruptedException {<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    // no rollback<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    throw new UnsupportedOperationException();<a name="line.423"></a>
+<span class="sourceLineNo">424</span>  }<a name="line.424"></a>
+<span class="sourceLineNo">425</span><a name="line.425"></a>
+<span class="sourceLineNo">426</span>  @Override<a name="line.426"></a>
+<span class="sourceLineNo">427</span>  protected RegionStateTransitionState getState(int stateId) {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>    return RegionStateTransitionState.forNumber(stateId);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>  }<a name="line.429"></a>
+<span class="sourceLineNo">430</span><a name="line.430"></a>
+<span class="sourceLineNo">431</span>  @Override<a name="line.431"></a>
+<span class="sourceLineNo">432</span>  protected int getStateId(RegionStateTransitionState state) {<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    return state.getNumber();<a name="line.433"></a>
+<span class="sourceLineNo">434</span>  }<a name="line.434"></a>
+<span class="sourceLineNo">435</span><a name="line.435"></a>
+<span class="sourceLineNo">436</span>  @Override<a name="line.436"></a>
+<span class="sourceLineNo">437</span>  protected RegionStateTransitionState getInitialState() {<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    return initialState;<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 static TransitionType convert(RegionTransitionType type) {<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    switch (type) {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>      case ASSIGN:<a name="line.443"></a>
+<span class="sourceLineNo">444</span>        return TransitionType.ASSIGN;<a name="line.444"></a>
+<span class="sourceLineNo">445</span>      case UNASSIGN:<a name="line.445"></a>
+<span class="sourceLineNo">446</span>        return TransitionType.UNASSIGN;<a name="line.446"></a>
+<span class="sourceLineNo">447</span>      case MOVE:<a name="line.447"></a>
+<span class="sourceLineNo">448</span>        return TransitionType.MOVE;<a name="line.448"></a>
+<span class="sourceLineNo">449</span>      case REOPEN:<a name="line.449"></a>
+<span class="sourceLineNo">450</span>        return TransitionType.REOPEN;<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      default:<a name="line.451"></a>
+<span class="sourceLineNo">452</span>        throw new IllegalArgumentException("Unknown RegionTransitionType: " + type);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    }<a name="line.453"></a>
+<span class="sourceLineNo">454</span>  }<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>  private static RegionTransitionType convert(TransitionType type) {<a name="line.456"></a>
+<span class="sourceLineNo">457</span>    switch (type) {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>      case ASSIGN:<a name="line.458"></a>
+<span class="sourceLineNo">459</span>        return RegionTransitionType.ASSIGN;<a name="line.459"></a>
+<span class="sourceLineNo">460</span>      case UNASSIGN:<a name="line.460"></a>
+<span class="sourceLineNo">461</span>        return RegionTransitionType.UNASSIGN;<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      case MOVE:<a name="line.462"></a>
+<span class="sourceLineNo">463</span>        return RegionTransitionType.MOVE;<a name="line.463"></a>
+<span class="sourceLineNo">464</span>      case REOPEN:<a name="line.464"></a>
+<span class="sourceLineNo">465</span>        return RegionTransitionType.REOPEN;<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      default:<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        throw new IllegalArgumentException("Unknown TransitionType: " + type);<a name="line.467"></a>
+<span class="sourceLineNo">468</span>    }<a name="line.468"></a>
+<span class="sourceLineNo">469</span>  }<a name="line.469"></a>
+<span class="sourceLineNo">470</span><a name="line.470"></a>
+<span class="sourceLineNo">471</span>  @Override<a name="line.471"></a>
+<span class="sourceLineNo">472</span>  protected void serializeStateData(ProcedureStateSerializer serializer) throws IOException {<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    super.serializeStateData(serializer);<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    RegionStateTransitionStateData.Builder builder = RegionStateTransitionStateData.newBuilder()<a name="line.474"></a>
+<span class="sourceLineNo">475</span>      .setType(convert(type)).setForceNewPlan(forceNewPlan);<a name="line.475"></a>
+<span class="sourceLineNo">476</span>    if (assignCandidate != null) {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>      builder.setAssignCandidate(ProtobufUtil.toServerName(assignCandidate));<a name="line.477"></a>
+<span class="sourceLineNo">478</span>    }<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    serializer.serialize(builder.build());<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>  @Override<a name="line.482"></a>
+<span class="sourceLineNo">483</span>  protected void deserializeStateData(ProcedureStateSerializer serializer) throws IOException {<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    super.deserializeStateData(serializer);<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    RegionStateTransitionStateData data =<a name="line.485"></a>
+<span class="sourceLineNo">486</span>      serializer.deserialize(RegionStateTransitionStateData.class);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    type = convert(data.getType());<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    setInitalAndLastState();<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    forceNewPlan = data.getForceNewPlan();<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    if (data.hasAssignCandidate()) {<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      assignCandidate = ProtobufUtil.toServerName(data.getAssignCandidate());<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    }<a name="line.492"></a>
+<span class="sourceLineNo">493</span>  }<a name="line.493"></a>
+<span class="sourceLineNo">494</span><a name="line.494"></a>
+<span class="sourceLineNo">495</span>  @Override<a name="line.495"></a>
+<span class="sourceLineNo">496</span>  protected ProcedureMetrics getProcedureMetrics(MasterProcedureEnv env) {<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    MetricsAssignmentManager metrics = env.getAssignmentManager().getAssignmentManagerMetrics();<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    switch (type) {<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      case ASSIGN:<a name="line.499"></a>
+<span class="sourceLineNo">500</span>        return metrics.getAssignProcMetrics();<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      case UNASSIGN:<a name="line.501"></a>
+<span class="sourceLineNo">502</span>        return metrics.getUnassignProcMetrics();<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      case MOVE:<a name="line.503"></a>
+<span class="sourceLineNo">504</span>        return metrics.getMoveProcMetrics();<a name="line.504"></a>
+<span class="sourceLineNo">505</span>      case REOPEN:<a name="line.505"></a>
+<span class="sourceLineNo">506</span>        return metrics.getReopenProcMetrics();<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      default:<a name="line.507"></a>
+<span class="sourceLineNo">508</span>        throw new IllegalArgumentException("Unknown transition type: " + type);<a name="line.508"></a>
+<span class="sourceLineNo">509</span>    }<a name="line.509"></a>
+<span class="sourceLineNo">510</span>  }<a name="line.510"></a>
+<span class="sourceLineNo">511</span><a name="line.511"></a>
+<span class="sourceLineNo">512</span>  @Override<a name="line.512"></a>
+<span class="sourceLineNo">513</span>  public void toStringClassDetails(StringBuilder sb) {<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    super.toStringClassDetails(sb);<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    if (initialState == RegionStateTransitionState.REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE) {<a name="line.515"></a>
+<span class="sourceLineNo">516</span>      sb.append(", ASSIGN");<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    } else if (lastState == RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_CLOSED) {<a name="line.517"></a>
+<span class="sourceLineNo">518</span>      sb.append(", UNASSIGN");<a name="line.518"></a>
+<span class="sourceLineNo">519</span>    } else {<a name="line.519"></a>
+<span class="sourceLineNo">520</span>      sb.append(", REOPEN/MOVE");<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    }<a name="line.521"></a>
+<span class="sourceLineNo">522</span>  }<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>  private static TransitRegionStateProcedure setOwner(MasterProcedureEnv env,<a name="line.524"></a>
+<span class="sourceLineNo">525</span>      TransitRegionStateProcedure proc) {<a name="line.525"></a>
+<span class="sourceLineNo">526</span>    proc.setOwner(env.getRequestUser().getShortName());<a name="line.526"></a>
+<span class="sourceLineNo">527</span>    return proc;<a name="line.527"></a>
 <span class="sourceLineNo">528</span>  }<a name="line.528"></a>
 <span class="sourceLineNo">529</span><a name="line.529"></a>
-<span class="sourceLineNo">530</span>  // Be careful that, when you call these 4 methods below, you need to manually attach the returned<a name="line.530"></a>
-<span class="sourceLineNo">531</span>  // procedure with the RegionStateNode, otherwise the procedure will quit immediately without doing<a name="line.531"></a>
-<span class="sourceLineNo">532</span>  // anything. See the comment in executeFromState to find out why we need this assumption.<a name="line.532"></a>
-<span class="sourceLineNo">533</span>  public static TransitRegionStateProcedure assign(MasterProcedureEnv env, RegionInfo region,<a name="line.533"></a>
-<span class="sourceLineNo">534</span>      @Nullable ServerName targetServer) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>    return setOwner(env,<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      new TransitRegionStateProcedure(env, region, targetServer, false, TransitionType.ASSIGN));<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>  public static TransitRegionStateProcedure unassign(MasterProcedureEnv env, RegionInfo region) {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>    return setOwner(env,<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      new TransitRegionStateProcedure(env, region, null, false, TransitionType.UNASSIGN));<a name="line.541"></a>
-<span class="sourceLineNo">542</span>  }<a name="line.542"></a>
-<span class="sourceLineNo">543</span><a name="line.543"></a>
-<span class="sourceLineNo">544</span>  public static TransitRegionStateProcedure reopen(MasterProcedureEnv env, RegionInfo region) {<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    return setOwner(env,<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      new TransitRegionStateProcedure(env, region, null, false, TransitionType.REOPEN));<a name="line.546"></a>
-<span class="sourceLineNo">547</span>  }<a name="line.547"></a>
-<span class="sourceLineNo">548</span><a name="line.548"></a>
-<span class="sourceLineNo">549</span>  public static TransitRegionStateProcedure move(MasterProcedureEnv env, RegionInfo region,<a name="line.549"></a>
-<span class="sourceLineNo">550</span>      @Nullable ServerName targetServer) {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    return setOwner(env, new TransitRegionStateProcedure(env, region, targetServer,<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      targetServer == null, TransitionType.MOVE));<a name="line.552"></a>
-<span class="sourceLineNo">553</span>  }<a name="line.553"></a>
-<span class="sourceLineNo">554</span>}<a name="line.554"></a>
+<span class="sourceLineNo">530</span>  public enum TransitionType {<a name="line.530"></a>
+<span class="sourceLineNo">531</span>    ASSIGN, UNASSIGN, MOVE, REOPEN<a name="line.531"></a>
+<span class="sourceLineNo">532</span>  }<a name="line.532"></a>
+<span class="sourceLineNo">533</span><a name="line.533"></a>
+<span class="sourceLineNo">534</span>  // Be careful that, when you call these 4 methods below, you need to manually attach the returned<a name="line.534"></a>
+<span class="sourceLineNo">535</span>  // procedure with the RegionStateNode, otherwise the procedure will quit immediately without doing<a name="line.535"></a>
+<span class="sourceLineNo">536</span>  // anything. See the comment in executeFromState to find out why we need this assumption.<a name="line.536"></a>
+<span class="sourceLineNo">537</span>  public static TransitRegionStateProcedure assign(MasterProcedureEnv env, RegionInfo region,<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      @Nullable ServerName targetServer) {<a name="line.538"></a>
+<span class="sourceLineNo">539</span>    return setOwner(env,<a name="line.539"></a>
+<span class="sourceLineNo">540</span>      new TransitRegionStateProcedure(env, region, targetServer, false, TransitionType.ASSIGN));<a name="line.540"></a>
+<span class="sourceLineNo">541</span>  }<a name="line.541"></a>
+<span class="sourceLineNo">542</span><a name="line.542"></a>
+<span class="sourceLineNo">543</span>  public static TransitRegionStateProcedure unassign(MasterProcedureEnv env, RegionInfo region) {<a name="line.543"></a>
+<span class="sourceLineNo">544</span>    return setOwner(env,<a name="line.544"></a>
+<span class="sourceLineNo">545</span>      new TransitRegionStateProcedure(env, region, null, false, TransitionType.UNASSIGN));<a name="line.545"></a>
+<span class="sourceLineNo">546</span>  }<a name="line.546"></a>
+<span class="sourceLineNo">547</span><a name="line.547"></a>
+<span class="sourceLineNo">548</span>  public static TransitRegionStateProcedure reopen(MasterProcedureEnv env, RegionInfo region) {<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    return setOwner(env,<a name="line.549"></a>
+<span class="sourceLineNo">550</span>      new TransitRegionStateProcedure(env, region, null, false, TransitionType.REOPEN));<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>  public static TransitRegionStateProcedure move(MasterProcedureEnv env, RegionInfo region,<a name="line.553"></a>
+<span class="sourceLineNo">554</span>      @Nullable ServerName targetServer) {<a name="line.554"></a>
+<span class="sourceLineNo">555</span>    return setOwner(env, new TransitRegionStateProcedure(env, region, targetServer,<a name="line.555"></a>
+<span class="sourceLineNo">556</span>      targetServer == null, TransitionType.MOVE));<a name="line.556"></a>
+<span class="sourceLineNo">557</span>  }<a name="line.557"></a>
+<span class="sourceLineNo">558</span>}<a name="line.558"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/InitMetaProcedure.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/InitMetaProcedure.html
index 4cef626..e1c8374 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/InitMetaProcedure.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/InitMetaProcedure.html
@@ -40,135 +40,139 @@
 <span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.procedure2.ProcedureSuspendedException;<a name="line.32"></a>
 <span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.procedure2.ProcedureUtil;<a name="line.33"></a>
 <span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.procedure2.ProcedureYieldException;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.slf4j.Logger;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.slf4j.LoggerFactory;<a name="line.37"></a>
-<span class="sourceLineNo">038</span><a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.InitMetaState;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.InitMetaStateData;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos;<a name="line.41"></a>
-<span class="sourceLineNo">042</span><a name="line.42"></a>
-<span class="sourceLineNo">043</span>/**<a name="line.43"></a>
-<span class="sourceLineNo">044</span> * This procedure is used to initialize meta table for a new hbase deploy. It will just schedule an<a name="line.44"></a>
-<span class="sourceLineNo">045</span> * {@link TransitRegionStateProcedure} to assign meta.<a name="line.45"></a>
-<span class="sourceLineNo">046</span> */<a name="line.46"></a>
-<span class="sourceLineNo">047</span>@InterfaceAudience.Private<a name="line.47"></a>
-<span class="sourceLineNo">048</span>public class InitMetaProcedure extends AbstractStateMachineTableProcedure&lt;InitMetaState&gt; {<a name="line.48"></a>
-<span class="sourceLineNo">049</span><a name="line.49"></a>
-<span class="sourceLineNo">050</span>  private static final Logger LOG = LoggerFactory.getLogger(InitMetaProcedure.class);<a name="line.50"></a>
-<span class="sourceLineNo">051</span><a name="line.51"></a>
-<span class="sourceLineNo">052</span>  private CountDownLatch latch = new CountDownLatch(1);<a name="line.52"></a>
-<span class="sourceLineNo">053</span><a name="line.53"></a>
-<span class="sourceLineNo">054</span>  private int attempts;<a name="line.54"></a>
-<span class="sourceLineNo">055</span><a name="line.55"></a>
-<span class="sourceLineNo">056</span>  @Override<a name="line.56"></a>
-<span class="sourceLineNo">057</span>  public TableName getTableName() {<a name="line.57"></a>
-<span class="sourceLineNo">058</span>    return TableName.META_TABLE_NAME;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>  }<a name="line.59"></a>
-<span class="sourceLineNo">060</span><a name="line.60"></a>
-<span class="sourceLineNo">061</span>  @Override<a name="line.61"></a>
-<span class="sourceLineNo">062</span>  public TableOperationType getTableOperationType() {<a name="line.62"></a>
-<span class="sourceLineNo">063</span>    return TableOperationType.CREATE;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>  }<a name="line.64"></a>
-<span class="sourceLineNo">065</span><a name="line.65"></a>
-<span class="sourceLineNo">066</span>  @Override<a name="line.66"></a>
-<span class="sourceLineNo">067</span>  protected Flow executeFromState(MasterProcedureEnv env, InitMetaState state)<a name="line.67"></a>
-<span class="sourceLineNo">068</span>      throws ProcedureSuspendedException, ProcedureYieldException, InterruptedException {<a name="line.68"></a>
-<span class="sourceLineNo">069</span>    LOG.debug("Execute {}", this);<a name="line.69"></a>
-<span class="sourceLineNo">070</span>    switch (state) {<a name="line.70"></a>
-<span class="sourceLineNo">071</span>      case INIT_META_ASSIGN_META:<a name="line.71"></a>
-<span class="sourceLineNo">072</span>        LOG.info("Going to assign meta");<a name="line.72"></a>
-<span class="sourceLineNo">073</span>        addChildProcedure(env.getAssignmentManager()<a name="line.73"></a>
-<span class="sourceLineNo">074</span>          .createAssignProcedures(Arrays.asList(RegionInfoBuilder.FIRST_META_REGIONINFO)));<a name="line.74"></a>
-<span class="sourceLineNo">075</span>        setNextState(InitMetaState.INIT_META_CREATE_NAMESPACES);<a name="line.75"></a>
-<span class="sourceLineNo">076</span>        return Flow.HAS_MORE_STATE;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>      case INIT_META_CREATE_NAMESPACES:<a name="line.77"></a>
-<span class="sourceLineNo">078</span>        LOG.info("Going to create {} and {} namespaces", DEFAULT_NAMESPACE, SYSTEM_NAMESPACE);<a name="line.78"></a>
-<span class="sourceLineNo">079</span>        try {<a name="line.79"></a>
-<span class="sourceLineNo">080</span>          createDirectory(env, DEFAULT_NAMESPACE);<a name="line.80"></a>
-<span class="sourceLineNo">081</span>          createDirectory(env, SYSTEM_NAMESPACE);<a name="line.81"></a>
-<span class="sourceLineNo">082</span>          // here the TableNamespaceManager has not been initialized yet, so we have to insert the<a name="line.82"></a>
-<span class="sourceLineNo">083</span>          // record directly into meta table, later the TableNamespaceManager will load these two<a name="line.83"></a>
-<span class="sourceLineNo">084</span>          // namespaces when starting.<a name="line.84"></a>
-<span class="sourceLineNo">085</span>          insertNamespaceToMeta(env.getMasterServices().getConnection(), DEFAULT_NAMESPACE);<a name="line.85"></a>
-<span class="sourceLineNo">086</span>          insertNamespaceToMeta(env.getMasterServices().getConnection(), SYSTEM_NAMESPACE);<a name="line.86"></a>
-<span class="sourceLineNo">087</span>        } catch (IOException e) {<a name="line.87"></a>
-<span class="sourceLineNo">088</span>          long backoff = ProcedureUtil.getBackoffTimeMs(this.attempts++);<a name="line.88"></a>
-<span class="sourceLineNo">089</span>          LOG.warn("Failed to init default and system namespaces, suspend {}secs", backoff, e);<a name="line.89"></a>
-<span class="sourceLineNo">090</span>          setTimeout(Math.toIntExact(backoff));<a name="line.90"></a>
-<span class="sourceLineNo">091</span>          setState(ProcedureProtos.ProcedureState.WAITING_TIMEOUT);<a name="line.91"></a>
-<span class="sourceLineNo">092</span>          skipPersistence();<a name="line.92"></a>
-<span class="sourceLineNo">093</span>          throw new ProcedureSuspendedException();<a name="line.93"></a>
-<span class="sourceLineNo">094</span>        }<a name="line.94"></a>
-<span class="sourceLineNo">095</span>        return Flow.NO_MORE_STATE;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>      default:<a name="line.96"></a>
-<span class="sourceLineNo">097</span>        throw new UnsupportedOperationException("unhandled state=" + state);<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    }<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  }<a name="line.99"></a>
-<span class="sourceLineNo">100</span><a name="line.100"></a>
-<span class="sourceLineNo">101</span>  @Override<a name="line.101"></a>
-<span class="sourceLineNo">102</span>  protected boolean waitInitialized(MasterProcedureEnv env) {<a name="line.102"></a>
-<span class="sourceLineNo">103</span>    // we do not need to wait for master initialized, we are part of the initialization.<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    return false;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>  }<a name="line.105"></a>
-<span class="sourceLineNo">106</span><a name="line.106"></a>
-<span class="sourceLineNo">107</span>  @Override<a name="line.107"></a>
-<span class="sourceLineNo">108</span>  protected synchronized boolean setTimeoutFailure(MasterProcedureEnv env) {<a name="line.108"></a>
-<span class="sourceLineNo">109</span>    setState(ProcedureProtos.ProcedureState.RUNNABLE);<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    env.getProcedureScheduler().addFront(this);<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    return false;<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  }<a name="line.112"></a>
-<span class="sourceLineNo">113</span><a name="line.113"></a>
-<span class="sourceLineNo">114</span>  @Override<a name="line.114"></a>
-<span class="sourceLineNo">115</span>  protected LockState acquireLock(MasterProcedureEnv env) {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    if (env.getProcedureScheduler().waitTableExclusiveLock(this, getTableName())) {<a name="line.116"></a>
-<span class="sourceLineNo">117</span>      return LockState.LOCK_EVENT_WAIT;<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    }<a name="line.118"></a>
-<span class="sourceLineNo">119</span>    return LockState.LOCK_ACQUIRED;<a name="line.119"></a>
-<span class="sourceLineNo">120</span>  }<a name="line.120"></a>
-<span class="sourceLineNo">121</span><a name="line.121"></a>
-<span class="sourceLineNo">122</span>  @Override<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  protected void rollbackState(MasterProcedureEnv env, InitMetaState state)<a name="line.123"></a>
-<span class="sourceLineNo">124</span>      throws IOException, InterruptedException {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    throw new UnsupportedOperationException();<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  }<a name="line.126"></a>
-<span class="sourceLineNo">127</span><a name="line.127"></a>
-<span class="sourceLineNo">128</span>  @Override<a name="line.128"></a>
-<span class="sourceLineNo">129</span>  protected InitMetaState getState(int stateId) {<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    return InitMetaState.forNumber(stateId);<a name="line.130"></a>
-<span class="sourceLineNo">131</span>  }<a name="line.131"></a>
-<span class="sourceLineNo">132</span><a name="line.132"></a>
-<span class="sourceLineNo">133</span>  @Override<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  protected int getStateId(InitMetaState state) {<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    return state.getNumber();<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  }<a name="line.136"></a>
-<span class="sourceLineNo">137</span><a name="line.137"></a>
-<span class="sourceLineNo">138</span>  @Override<a name="line.138"></a>
-<span class="sourceLineNo">139</span>  protected InitMetaState getInitialState() {<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    return InitMetaState.INIT_META_ASSIGN_META;<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  }<a name="line.141"></a>
-<span class="sourceLineNo">142</span><a name="line.142"></a>
-<span class="sourceLineNo">143</span>  @Override<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  protected void serializeStateData(ProcedureStateSerializer serializer) throws IOException {<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    super.serializeStateData(serializer);<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    serializer.serialize(InitMetaStateData.getDefaultInstance());<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  }<a name="line.147"></a>
-<span class="sourceLineNo">148</span><a name="line.148"></a>
-<span class="sourceLineNo">149</span>  @Override<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  protected void deserializeStateData(ProcedureStateSerializer serializer) throws IOException {<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    super.deserializeStateData(serializer);<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    serializer.deserialize(InitMetaStateData.class);<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  }<a name="line.153"></a>
-<span class="sourceLineNo">154</span><a name="line.154"></a>
-<span class="sourceLineNo">155</span>  @Override<a name="line.155"></a>
-<span class="sourceLineNo">156</span>  protected void completionCleanup(MasterProcedureEnv env) {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    latch.countDown();<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  }<a name="line.158"></a>
-<span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>  public void await() throws InterruptedException {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    latch.await();<a name="line.161"></a>
+<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.util.RetryCounter;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.slf4j.Logger;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.slf4j.LoggerFactory;<a name="line.38"></a>
+<span class="sourceLineNo">039</span><a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.InitMetaState;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.InitMetaStateData;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos;<a name="line.42"></a>
+<span class="sourceLineNo">043</span><a name="line.43"></a>
+<span class="sourceLineNo">044</span>/**<a name="line.44"></a>
+<span class="sourceLineNo">045</span> * This procedure is used to initialize meta table for a new hbase deploy. It will just schedule an<a name="line.45"></a>
+<span class="sourceLineNo">046</span> * {@link TransitRegionStateProcedure} to assign meta.<a name="line.46"></a>
+<span class="sourceLineNo">047</span> */<a name="line.47"></a>
+<span class="sourceLineNo">048</span>@InterfaceAudience.Private<a name="line.48"></a>
+<span class="sourceLineNo">049</span>public class InitMetaProcedure extends AbstractStateMachineTableProcedure&lt;InitMetaState&gt; {<a name="line.49"></a>
+<span class="sourceLineNo">050</span><a name="line.50"></a>
+<span class="sourceLineNo">051</span>  private static final Logger LOG = LoggerFactory.getLogger(InitMetaProcedure.class);<a name="line.51"></a>
+<span class="sourceLineNo">052</span><a name="line.52"></a>
+<span class="sourceLineNo">053</span>  private CountDownLatch latch = new CountDownLatch(1);<a name="line.53"></a>
+<span class="sourceLineNo">054</span><a name="line.54"></a>
+<span class="sourceLineNo">055</span>  private RetryCounter retryCounter;<a name="line.55"></a>
+<span class="sourceLineNo">056</span><a name="line.56"></a>
+<span class="sourceLineNo">057</span>  @Override<a name="line.57"></a>
+<span class="sourceLineNo">058</span>  public TableName getTableName() {<a name="line.58"></a>
+<span class="sourceLineNo">059</span>    return TableName.META_TABLE_NAME;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>  }<a name="line.60"></a>
+<span class="sourceLineNo">061</span><a name="line.61"></a>
+<span class="sourceLineNo">062</span>  @Override<a name="line.62"></a>
+<span class="sourceLineNo">063</span>  public TableOperationType getTableOperationType() {<a name="line.63"></a>
+<span class="sourceLineNo">064</span>    return TableOperationType.CREATE;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>  }<a name="line.65"></a>
+<span class="sourceLineNo">066</span><a name="line.66"></a>
+<span class="sourceLineNo">067</span>  @Override<a name="line.67"></a>
+<span class="sourceLineNo">068</span>  protected Flow executeFromState(MasterProcedureEnv env, InitMetaState state)<a name="line.68"></a>
+<span class="sourceLineNo">069</span>      throws ProcedureSuspendedException, ProcedureYieldException, InterruptedException {<a name="line.69"></a>
+<span class="sourceLineNo">070</span>    LOG.debug("Execute {}", this);<a name="line.70"></a>
+<span class="sourceLineNo">071</span>    switch (state) {<a name="line.71"></a>
+<span class="sourceLineNo">072</span>      case INIT_META_ASSIGN_META:<a name="line.72"></a>
+<span class="sourceLineNo">073</span>        LOG.info("Going to assign meta");<a name="line.73"></a>
+<span class="sourceLineNo">074</span>        addChildProcedure(env.getAssignmentManager()<a name="line.74"></a>
+<span class="sourceLineNo">075</span>          .createAssignProcedures(Arrays.asList(RegionInfoBuilder.FIRST_META_REGIONINFO)));<a name="line.75"></a>
+<span class="sourceLineNo">076</span>        setNextState(InitMetaState.INIT_META_CREATE_NAMESPACES);<a name="line.76"></a>
+<span class="sourceLineNo">077</span>        return Flow.HAS_MORE_STATE;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>      case INIT_META_CREATE_NAMESPACES:<a name="line.78"></a>
+<span class="sourceLineNo">079</span>        LOG.info("Going to create {} and {} namespaces", DEFAULT_NAMESPACE, SYSTEM_NAMESPACE);<a name="line.79"></a>
+<span class="sourceLineNo">080</span>        try {<a name="line.80"></a>
+<span class="sourceLineNo">081</span>          createDirectory(env, DEFAULT_NAMESPACE);<a name="line.81"></a>
+<span class="sourceLineNo">082</span>          createDirectory(env, SYSTEM_NAMESPACE);<a name="line.82"></a>
+<span class="sourceLineNo">083</span>          // here the TableNamespaceManager has not been initialized yet, so we have to insert the<a name="line.83"></a>
+<span class="sourceLineNo">084</span>          // record directly into meta table, later the TableNamespaceManager will load these two<a name="line.84"></a>
+<span class="sourceLineNo">085</span>          // namespaces when starting.<a name="line.85"></a>
+<span class="sourceLineNo">086</span>          insertNamespaceToMeta(env.getMasterServices().getConnection(), DEFAULT_NAMESPACE);<a name="line.86"></a>
+<span class="sourceLineNo">087</span>          insertNamespaceToMeta(env.getMasterServices().getConnection(), SYSTEM_NAMESPACE);<a name="line.87"></a>
+<span class="sourceLineNo">088</span>        } catch (IOException e) {<a name="line.88"></a>
+<span class="sourceLineNo">089</span>          if (retryCounter == null) {<a name="line.89"></a>
+<span class="sourceLineNo">090</span>            retryCounter = ProcedureUtil.createRetryCounter(env.getMasterConfiguration());<a name="line.90"></a>
+<span class="sourceLineNo">091</span>          }<a name="line.91"></a>
+<span class="sourceLineNo">092</span>          long backoff = retryCounter.getBackoffTimeAndIncrementAttempts();<a name="line.92"></a>
+<span class="sourceLineNo">093</span>          LOG.warn("Failed to init default and system namespaces, suspend {}secs", backoff, e);<a name="line.93"></a>
+<span class="sourceLineNo">094</span>          setTimeout(Math.toIntExact(backoff));<a name="line.94"></a>
+<span class="sourceLineNo">095</span>          setState(ProcedureProtos.ProcedureState.WAITING_TIMEOUT);<a name="line.95"></a>
+<span class="sourceLineNo">096</span>          skipPersistence();<a name="line.96"></a>
+<span class="sourceLineNo">097</span>          throw new ProcedureSuspendedException();<a name="line.97"></a>
+<span class="sourceLineNo">098</span>        }<a name="line.98"></a>
+<span class="sourceLineNo">099</span>        return Flow.NO_MORE_STATE;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>      default:<a name="line.100"></a>
+<span class="sourceLineNo">101</span>        throw new UnsupportedOperationException("unhandled state=" + state);<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    }<a name="line.102"></a>
+<span class="sourceLineNo">103</span>  }<a name="line.103"></a>
+<span class="sourceLineNo">104</span><a name="line.104"></a>
+<span class="sourceLineNo">105</span>  @Override<a name="line.105"></a>
+<span class="sourceLineNo">106</span>  protected boolean waitInitialized(MasterProcedureEnv env) {<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    // we do not need to wait for master initialized, we are part of the initialization.<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    return false;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>  }<a name="line.109"></a>
+<span class="sourceLineNo">110</span><a name="line.110"></a>
+<span class="sourceLineNo">111</span>  @Override<a name="line.111"></a>
+<span class="sourceLineNo">112</span>  protected synchronized boolean setTimeoutFailure(MasterProcedureEnv env) {<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    setState(ProcedureProtos.ProcedureState.RUNNABLE);<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    env.getProcedureScheduler().addFront(this);<a name="line.114"></a>
+<span class="sourceLineNo">115</span>    return false;<a name="line.115"></a>
+<span class="sourceLineNo">116</span>  }<a name="line.116"></a>
+<span class="sourceLineNo">117</span><a name="line.117"></a>
+<span class="sourceLineNo">118</span>  @Override<a name="line.118"></a>
+<span class="sourceLineNo">119</span>  protected LockState acquireLock(MasterProcedureEnv env) {<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    if (env.getProcedureScheduler().waitTableExclusiveLock(this, getTableName())) {<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      return LockState.LOCK_EVENT_WAIT;<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    }<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    return LockState.LOCK_ACQUIRED;<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  }<a name="line.124"></a>
+<span class="sourceLineNo">125</span><a name="line.125"></a>
+<span class="sourceLineNo">126</span>  @Override<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  protected void rollbackState(MasterProcedureEnv env, InitMetaState state)<a name="line.127"></a>
+<span class="sourceLineNo">128</span>      throws IOException, InterruptedException {<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    throw new UnsupportedOperationException();<a name="line.129"></a>
+<span class="sourceLineNo">130</span>  }<a name="line.130"></a>
+<span class="sourceLineNo">131</span><a name="line.131"></a>
+<span class="sourceLineNo">132</span>  @Override<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  protected InitMetaState getState(int stateId) {<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    return InitMetaState.forNumber(stateId);<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  }<a name="line.135"></a>
+<span class="sourceLineNo">136</span><a name="line.136"></a>
+<span class="sourceLineNo">137</span>  @Override<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  protected int getStateId(InitMetaState state) {<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    return state.getNumber();<a name="line.139"></a>
+<span class="sourceLineNo">140</span>  }<a name="line.140"></a>
+<span class="sourceLineNo">141</span><a name="line.141"></a>
+<span class="sourceLineNo">142</span>  @Override<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  protected InitMetaState getInitialState() {<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    return InitMetaState.INIT_META_ASSIGN_META;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  }<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  @Override<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  protected void serializeStateData(ProcedureStateSerializer serializer) throws IOException {<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    super.serializeStateData(serializer);<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    serializer.serialize(InitMetaStateData.getDefaultInstance());<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  }<a name="line.151"></a>
+<span class="sourceLineNo">152</span><a name="line.152"></a>
+<span class="sourceLineNo">153</span>  @Override<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  protected void deserializeStateData(ProcedureStateSerializer serializer) throws IOException {<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    super.deserializeStateData(serializer);<a name="line.155"></a>
+<span class="sourceLineNo">156</span>    serializer.deserialize(InitMetaStateData.class);<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  }<a name="line.157"></a>
+<span class="sourceLineNo">158</span><a name="line.158"></a>
+<span class="sourceLineNo">159</span>  @Override<a name="line.159"></a>
+<span class="sourceLineNo">160</span>  protected void completionCleanup(MasterProcedureEnv env) {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    latch.countDown();<a name="line.161"></a>
 <span class="sourceLineNo">162</span>  }<a name="line.162"></a>
-<span class="sourceLineNo">163</span>}<a name="line.163"></a>
+<span class="sourceLineNo">163</span><a name="line.163"></a>
+<span class="sourceLineNo">164</span>  public void await() throws InterruptedException {<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    latch.await();<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  }<a name="line.166"></a>
+<span class="sourceLineNo">167</span>}<a name="line.167"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html
index 3d17e10..77c7e55 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html
@@ -37,171 +37,175 @@
 <span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.procedure2.ProcedureSuspendedException;<a name="line.29"></a>
 <span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.procedure2.ProcedureUtil;<a name="line.30"></a>
 <span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.procedure2.ProcedureYieldException;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.slf4j.Logger;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.slf4j.LoggerFactory;<a name="line.34"></a>
-<span class="sourceLineNo">035</span><a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.ReopenTableRegionsState;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.ReopenTableRegionsStateData;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos;<a name="line.39"></a>
-<span class="sourceLineNo">040</span><a name="line.40"></a>
-<span class="sourceLineNo">041</span>/**<a name="line.41"></a>
-<span class="sourceLineNo">042</span> * Used for reopening the regions for a table.<a name="line.42"></a>
-<span class="sourceLineNo">043</span> */<a name="line.43"></a>
-<span class="sourceLineNo">044</span>@InterfaceAudience.Private<a name="line.44"></a>
-<span class="sourceLineNo">045</span>public class ReopenTableRegionsProcedure<a name="line.45"></a>
-<span class="sourceLineNo">046</span>    extends AbstractStateMachineTableProcedure&lt;ReopenTableRegionsState&gt; {<a name="line.46"></a>
-<span class="sourceLineNo">047</span><a name="line.47"></a>
-<span class="sourceLineNo">048</span>  private static final Logger LOG = LoggerFactory.getLogger(ReopenTableRegionsProcedure.class);<a name="line.48"></a>
-<span class="sourceLineNo">049</span><a name="line.49"></a>
-<span class="sourceLineNo">050</span>  private TableName tableName;<a name="line.50"></a>
-<span class="sourceLineNo">051</span><a name="line.51"></a>
-<span class="sourceLineNo">052</span>  private List&lt;HRegionLocation&gt; regions = Collections.emptyList();<a name="line.52"></a>
-<span class="sourceLineNo">053</span><a name="line.53"></a>
-<span class="sourceLineNo">054</span>  private int attempt;<a name="line.54"></a>
-<span class="sourceLineNo">055</span><a name="line.55"></a>
-<span class="sourceLineNo">056</span>  public ReopenTableRegionsProcedure() {<a name="line.56"></a>
-<span class="sourceLineNo">057</span>  }<a name="line.57"></a>
-<span class="sourceLineNo">058</span><a name="line.58"></a>
-<span class="sourceLineNo">059</span>  public ReopenTableRegionsProcedure(TableName tableName) {<a name="line.59"></a>
-<span class="sourceLineNo">060</span>    this.tableName = tableName;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>  }<a name="line.61"></a>
-<span class="sourceLineNo">062</span><a name="line.62"></a>
-<span class="sourceLineNo">063</span>  @Override<a name="line.63"></a>
-<span class="sourceLineNo">064</span>  public TableName getTableName() {<a name="line.64"></a>
-<span class="sourceLineNo">065</span>    return tableName;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>  }<a name="line.66"></a>
-<span class="sourceLineNo">067</span><a name="line.67"></a>
-<span class="sourceLineNo">068</span>  @Override<a name="line.68"></a>
-<span class="sourceLineNo">069</span>  public TableOperationType getTableOperationType() {<a name="line.69"></a>
-<span class="sourceLineNo">070</span>    return TableOperationType.REGION_EDIT;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>  }<a name="line.71"></a>
-<span class="sourceLineNo">072</span><a name="line.72"></a>
-<span class="sourceLineNo">073</span>  private boolean canSchedule(MasterProcedureEnv env, HRegionLocation loc) {<a name="line.73"></a>
-<span class="sourceLineNo">074</span>    if (loc.getSeqNum() &lt; 0) {<a name="line.74"></a>
-<span class="sourceLineNo">075</span>      return false;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>    }<a name="line.76"></a>
-<span class="sourceLineNo">077</span>    RegionStateNode regionNode =<a name="line.77"></a>
-<span class="sourceLineNo">078</span>      env.getAssignmentManager().getRegionStates().getRegionStateNode(loc.getRegion());<a name="line.78"></a>
-<span class="sourceLineNo">079</span>    // If the region node is null, then at least in the next round we can remove this region to make<a name="line.79"></a>
-<span class="sourceLineNo">080</span>    // progress. And the second condition is a normal one, if there are no TRSP with it then we can<a name="line.80"></a>
-<span class="sourceLineNo">081</span>    // schedule one to make progress.<a name="line.81"></a>
-<span class="sourceLineNo">082</span>    return regionNode == null || !regionNode.isInTransition();<a name="line.82"></a>
-<span class="sourceLineNo">083</span>  }<a name="line.83"></a>
-<span class="sourceLineNo">084</span><a name="line.84"></a>
-<span class="sourceLineNo">085</span>  @Override<a name="line.85"></a>
-<span class="sourceLineNo">086</span>  protected Flow executeFromState(MasterProcedureEnv env, ReopenTableRegionsState state)<a name="line.86"></a>
-<span class="sourceLineNo">087</span>      throws ProcedureSuspendedException, ProcedureYieldException, InterruptedException {<a name="line.87"></a>
-<span class="sourceLineNo">088</span>    switch (state) {<a name="line.88"></a>
-<span class="sourceLineNo">089</span>      case REOPEN_TABLE_REGIONS_GET_REGIONS:<a name="line.89"></a>
-<span class="sourceLineNo">090</span>        if (!env.getAssignmentManager().isTableEnabled(tableName)) {<a name="line.90"></a>
-<span class="sourceLineNo">091</span>          LOG.info("Table {} is disabled, give up reopening its regions", tableName);<a name="line.91"></a>
-<span class="sourceLineNo">092</span>          return Flow.NO_MORE_STATE;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>        }<a name="line.93"></a>
-<span class="sourceLineNo">094</span>        regions =<a name="line.94"></a>
-<span class="sourceLineNo">095</span>          env.getAssignmentManager().getRegionStates().getRegionsOfTableForReopen(tableName);<a name="line.95"></a>
-<span class="sourceLineNo">096</span>        setNextState(ReopenTableRegionsState.REOPEN_TABLE_REGIONS_REOPEN_REGIONS);<a name="line.96"></a>
-<span class="sourceLineNo">097</span>        return Flow.HAS_MORE_STATE;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>      case REOPEN_TABLE_REGIONS_REOPEN_REGIONS:<a name="line.98"></a>
-<span class="sourceLineNo">099</span>        for (HRegionLocation loc : regions) {<a name="line.99"></a>
-<span class="sourceLineNo">100</span>          RegionStateNode regionNode =<a name="line.100"></a>
-<span class="sourceLineNo">101</span>            env.getAssignmentManager().getRegionStates().getRegionStateNode(loc.getRegion());<a name="line.101"></a>
-<span class="sourceLineNo">102</span>          // this possible, maybe the region has already been merged or split, see HBASE-20921<a name="line.102"></a>
-<span class="sourceLineNo">103</span>          if (regionNode == null) {<a name="line.103"></a>
-<span class="sourceLineNo">104</span>            continue;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>          }<a name="line.105"></a>
-<span class="sourceLineNo">106</span>          TransitRegionStateProcedure proc;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>          regionNode.lock();<a name="line.107"></a>
-<span class="sourceLineNo">108</span>          try {<a name="line.108"></a>
-<span class="sourceLineNo">109</span>            if (regionNode.getProcedure() != null) {<a name="line.109"></a>
-<span class="sourceLineNo">110</span>              continue;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>            }<a name="line.111"></a>
-<span class="sourceLineNo">112</span>            proc = TransitRegionStateProcedure.reopen(env, regionNode.getRegionInfo());<a name="line.112"></a>
-<span class="sourceLineNo">113</span>            regionNode.setProcedure(proc);<a name="line.113"></a>
-<span class="sourceLineNo">114</span>          } finally {<a name="line.114"></a>
-<span class="sourceLineNo">115</span>            regionNode.unlock();<a name="line.115"></a>
-<span class="sourceLineNo">116</span>          }<a name="line.116"></a>
-<span class="sourceLineNo">117</span>          addChildProcedure(proc);<a name="line.117"></a>
-<span class="sourceLineNo">118</span>        }<a name="line.118"></a>
-<span class="sourceLineNo">119</span>        setNextState(ReopenTableRegionsState.REOPEN_TABLE_REGIONS_CONFIRM_REOPENED);<a name="line.119"></a>
-<span class="sourceLineNo">120</span>        return Flow.HAS_MORE_STATE;<a name="line.120"></a>
-<span class="sourceLineNo">121</span>      case REOPEN_TABLE_REGIONS_CONFIRM_REOPENED:<a name="line.121"></a>
-<span class="sourceLineNo">122</span>        regions = regions.stream().map(env.getAssignmentManager().getRegionStates()::checkReopened)<a name="line.122"></a>
-<span class="sourceLineNo">123</span>          .filter(l -&gt; l != null).collect(Collectors.toList());<a name="line.123"></a>
-<span class="sourceLineNo">124</span>        if (regions.isEmpty()) {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>          return Flow.NO_MORE_STATE;<a name="line.125"></a>
-<span class="sourceLineNo">126</span>        }<a name="line.126"></a>
-<span class="sourceLineNo">127</span>        if (regions.stream().anyMatch(loc -&gt; canSchedule(env, loc))) {<a name="line.127"></a>
-<span class="sourceLineNo">128</span>          attempt = 0;<a name="line.128"></a>
-<span class="sourceLineNo">129</span>          setNextState(ReopenTableRegionsState.REOPEN_TABLE_REGIONS_REOPEN_REGIONS);<a name="line.129"></a>
-<span class="sourceLineNo">130</span>          return Flow.HAS_MORE_STATE;<a name="line.130"></a>
-<span class="sourceLineNo">131</span>        }<a name="line.131"></a>
-<span class="sourceLineNo">132</span>        // We can not schedule TRSP for all the regions need to reopen, wait for a while and retry<a name="line.132"></a>
-<span class="sourceLineNo">133</span>        // again.<a name="line.133"></a>
-<span class="sourceLineNo">134</span>        long backoff = ProcedureUtil.getBackoffTimeMs(this.attempt++);<a name="line.134"></a>
-<span class="sourceLineNo">135</span>        LOG.info(<a name="line.135"></a>
-<span class="sourceLineNo">136</span>          "There are still {} region(s) which need to be reopened for table {} are in " +<a name="line.136"></a>
-<span class="sourceLineNo">137</span>            "OPENING state, suspend {}secs and try again later",<a name="line.137"></a>
-<span class="sourceLineNo">138</span>          regions.size(), tableName, backoff / 1000);<a name="line.138"></a>
-<span class="sourceLineNo">139</span>        setTimeout(Math.toIntExact(backoff));<a name="line.139"></a>
-<span class="sourceLineNo">140</span>        setState(ProcedureProtos.ProcedureState.WAITING_TIMEOUT);<a name="line.140"></a>
-<span class="sourceLineNo">141</span>        skipPersistence();<a name="line.141"></a>
-<span class="sourceLineNo">142</span>        throw new ProcedureSuspendedException();<a name="line.142"></a>
-<span class="sourceLineNo">143</span>      default:<a name="line.143"></a>
-<span class="sourceLineNo">144</span>        throw new UnsupportedOperationException("unhandled state=" + state);<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    }<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  }<a name="line.146"></a>
-<span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>  /**<a name="line.148"></a>
-<span class="sourceLineNo">149</span>   * At end of timeout, wake ourselves up so we run again.<a name="line.149"></a>
-<span class="sourceLineNo">150</span>   */<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  @Override<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  protected synchronized boolean setTimeoutFailure(MasterProcedureEnv env) {<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    setState(ProcedureProtos.ProcedureState.RUNNABLE);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>    env.getProcedureScheduler().addFront(this);<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    return false; // 'false' means that this procedure handled the timeout<a name="line.155"></a>
-<span class="sourceLineNo">156</span>  }<a name="line.156"></a>
-<span class="sourceLineNo">157</span><a name="line.157"></a>
-<span class="sourceLineNo">158</span>  @Override<a name="line.158"></a>
-<span class="sourceLineNo">159</span>  protected void rollbackState(MasterProcedureEnv env, ReopenTableRegionsState state)<a name="line.159"></a>
-<span class="sourceLineNo">160</span>      throws IOException, InterruptedException {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    throw new UnsupportedOperationException("unhandled state=" + state);<a name="line.161"></a>
-<span class="sourceLineNo">162</span>  }<a name="line.162"></a>
-<span class="sourceLineNo">163</span><a name="line.163"></a>
-<span class="sourceLineNo">164</span>  @Override<a name="line.164"></a>
-<span class="sourceLineNo">165</span>  protected ReopenTableRegionsState getState(int stateId) {<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    return ReopenTableRegionsState.forNumber(stateId);<a name="line.166"></a>
-<span class="sourceLineNo">167</span>  }<a name="line.167"></a>
-<span class="sourceLineNo">168</span><a name="line.168"></a>
-<span class="sourceLineNo">169</span>  @Override<a name="line.169"></a>
-<span class="sourceLineNo">170</span>  protected int getStateId(ReopenTableRegionsState state) {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    return state.getNumber();<a name="line.171"></a>
-<span class="sourceLineNo">172</span>  }<a name="line.172"></a>
-<span class="sourceLineNo">173</span><a name="line.173"></a>
-<span class="sourceLineNo">174</span>  @Override<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  protected ReopenTableRegionsState getInitialState() {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    return ReopenTableRegionsState.REOPEN_TABLE_REGIONS_GET_REGIONS;<a name="line.176"></a>
-<span class="sourceLineNo">177</span>  }<a name="line.177"></a>
-<span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>  @Override<a name="line.179"></a>
-<span class="sourceLineNo">180</span>  protected void serializeStateData(ProcedureStateSerializer serializer) throws IOException {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    super.serializeStateData(serializer);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    ReopenTableRegionsStateData.Builder builder = ReopenTableRegionsStateData.newBuilder()<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      .setTableName(ProtobufUtil.toProtoTableName(tableName));<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    regions.stream().map(ProtobufUtil::toRegionLocation).forEachOrdered(builder::addRegion);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    serializer.serialize(builder.build());<a name="line.185"></a>
-<span class="sourceLineNo">186</span>  }<a name="line.186"></a>
-<span class="sourceLineNo">187</span><a name="line.187"></a>
-<span class="sourceLineNo">188</span>  @Override<a name="line.188"></a>
-<span class="sourceLineNo">189</span>  protected void deserializeStateData(ProcedureStateSerializer serializer) throws IOException {<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    super.deserializeStateData(serializer);<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    ReopenTableRegionsStateData data = serializer.deserialize(ReopenTableRegionsStateData.class);<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    tableName = ProtobufUtil.toTableName(data.getTableName());<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    regions = data.getRegionList().stream().map(ProtobufUtil::toRegionLocation)<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      .collect(Collectors.toList());<a name="line.194"></a>
-<span class="sourceLineNo">195</span>  }<a name="line.195"></a>
-<span class="sourceLineNo">196</span>}<a name="line.196"></a>
+<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.util.RetryCounter;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.slf4j.Logger;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.slf4j.LoggerFactory;<a name="line.35"></a>
+<span class="sourceLineNo">036</span><a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.ReopenTableRegionsState;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.ReopenTableRegionsStateData;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos;<a name="line.40"></a>
+<span class="sourceLineNo">041</span><a name="line.41"></a>
+<span class="sourceLineNo">042</span>/**<a name="line.42"></a>
+<span class="sourceLineNo">043</span> * Used for reopening the regions for a table.<a name="line.43"></a>
+<span class="sourceLineNo">044</span> */<a name="line.44"></a>
+<span class="sourceLineNo">045</span>@InterfaceAudience.Private<a name="line.45"></a>
+<span class="sourceLineNo">046</span>public class ReopenTableRegionsProcedure<a name="line.46"></a>
+<span class="sourceLineNo">047</span>    extends AbstractStateMachineTableProcedure&lt;ReopenTableRegionsState&gt; {<a name="line.47"></a>
+<span class="sourceLineNo">048</span><a name="line.48"></a>
+<span class="sourceLineNo">049</span>  private static final Logger LOG = LoggerFactory.getLogger(ReopenTableRegionsProcedure.class);<a name="line.49"></a>
+<span class="sourceLineNo">050</span><a name="line.50"></a>
+<span class="sourceLineNo">051</span>  private TableName tableName;<a name="line.51"></a>
+<span class="sourceLineNo">052</span><a name="line.52"></a>
+<span class="sourceLineNo">053</span>  private List&lt;HRegionLocation&gt; regions = Collections.emptyList();<a name="line.53"></a>
+<span class="sourceLineNo">054</span><a name="line.54"></a>
+<span class="sourceLineNo">055</span>  private RetryCounter retryCounter;<a name="line.55"></a>
+<span class="sourceLineNo">056</span><a name="line.56"></a>
+<span class="sourceLineNo">057</span>  public ReopenTableRegionsProcedure() {<a name="line.57"></a>
+<span class="sourceLineNo">058</span>  }<a name="line.58"></a>
+<span class="sourceLineNo">059</span><a name="line.59"></a>
+<span class="sourceLineNo">060</span>  public ReopenTableRegionsProcedure(TableName tableName) {<a name="line.60"></a>
+<span class="sourceLineNo">061</span>    this.tableName = tableName;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>  }<a name="line.62"></a>
+<span class="sourceLineNo">063</span><a name="line.63"></a>
+<span class="sourceLineNo">064</span>  @Override<a name="line.64"></a>
+<span class="sourceLineNo">065</span>  public TableName getTableName() {<a name="line.65"></a>
+<span class="sourceLineNo">066</span>    return tableName;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>  }<a name="line.67"></a>
+<span class="sourceLineNo">068</span><a name="line.68"></a>
+<span class="sourceLineNo">069</span>  @Override<a name="line.69"></a>
+<span class="sourceLineNo">070</span>  public TableOperationType getTableOperationType() {<a name="line.70"></a>
+<span class="sourceLineNo">071</span>    return TableOperationType.REGION_EDIT;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>  }<a name="line.72"></a>
+<span class="sourceLineNo">073</span><a name="line.73"></a>
+<span class="sourceLineNo">074</span>  private boolean canSchedule(MasterProcedureEnv env, HRegionLocation loc) {<a name="line.74"></a>
+<span class="sourceLineNo">075</span>    if (loc.getSeqNum() &lt; 0) {<a name="line.75"></a>
+<span class="sourceLineNo">076</span>      return false;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>    }<a name="line.77"></a>
+<span class="sourceLineNo">078</span>    RegionStateNode regionNode =<a name="line.78"></a>
+<span class="sourceLineNo">079</span>      env.getAssignmentManager().getRegionStates().getRegionStateNode(loc.getRegion());<a name="line.79"></a>
+<span class="sourceLineNo">080</span>    // If the region node is null, then at least in the next round we can remove this region to make<a name="line.80"></a>
+<span class="sourceLineNo">081</span>    // progress. And the second condition is a normal one, if there are no TRSP with it then we can<a name="line.81"></a>
+<span class="sourceLineNo">082</span>    // schedule one to make progress.<a name="line.82"></a>
+<span class="sourceLineNo">083</span>    return regionNode == null || !regionNode.isInTransition();<a name="line.83"></a>
+<span class="sourceLineNo">084</span>  }<a name="line.84"></a>
+<span class="sourceLineNo">085</span><a name="line.85"></a>
+<span class="sourceLineNo">086</span>  @Override<a name="line.86"></a>
+<span class="sourceLineNo">087</span>  protected Flow executeFromState(MasterProcedureEnv env, ReopenTableRegionsState state)<a name="line.87"></a>
+<span class="sourceLineNo">088</span>      throws ProcedureSuspendedException, ProcedureYieldException, InterruptedException {<a name="line.88"></a>
+<span class="sourceLineNo">089</span>    switch (state) {<a name="line.89"></a>
+<span class="sourceLineNo">090</span>      case REOPEN_TABLE_REGIONS_GET_REGIONS:<a name="line.90"></a>
+<span class="sourceLineNo">091</span>        if (!env.getAssignmentManager().isTableEnabled(tableName)) {<a name="line.91"></a>
+<span class="sourceLineNo">092</span>          LOG.info("Table {} is disabled, give up reopening its regions", tableName);<a name="line.92"></a>
+<span class="sourceLineNo">093</span>          return Flow.NO_MORE_STATE;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>        }<a name="line.94"></a>
+<span class="sourceLineNo">095</span>        regions =<a name="line.95"></a>
+<span class="sourceLineNo">096</span>          env.getAssignmentManager().getRegionStates().getRegionsOfTableForReopen(tableName);<a name="line.96"></a>
+<span class="sourceLineNo">097</span>        setNextState(ReopenTableRegionsState.REOPEN_TABLE_REGIONS_REOPEN_REGIONS);<a name="line.97"></a>
+<span class="sourceLineNo">098</span>        return Flow.HAS_MORE_STATE;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>      case REOPEN_TABLE_REGIONS_REOPEN_REGIONS:<a name="line.99"></a>
+<span class="sourceLineNo">100</span>        for (HRegionLocation loc : regions) {<a name="line.100"></a>
+<span class="sourceLineNo">101</span>          RegionStateNode regionNode =<a name="line.101"></a>
+<span class="sourceLineNo">102</span>            env.getAssignmentManager().getRegionStates().getRegionStateNode(loc.getRegion());<a name="line.102"></a>
+<span class="sourceLineNo">103</span>          // this possible, maybe the region has already been merged or split, see HBASE-20921<a name="line.103"></a>
+<span class="sourceLineNo">104</span>          if (regionNode == null) {<a name="line.104"></a>
+<span class="sourceLineNo">105</span>            continue;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>          }<a name="line.106"></a>
+<span class="sourceLineNo">107</span>          TransitRegionStateProcedure proc;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>          regionNode.lock();<a name="line.108"></a>
+<span class="sourceLineNo">109</span>          try {<a name="line.109"></a>
+<span class="sourceLineNo">110</span>            if (regionNode.getProcedure() != null) {<a name="line.110"></a>
+<span class="sourceLineNo">111</span>              continue;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>            }<a name="line.112"></a>
+<span class="sourceLineNo">113</span>            proc = TransitRegionStateProcedure.reopen(env, regionNode.getRegionInfo());<a name="line.113"></a>
+<span class="sourceLineNo">114</span>            regionNode.setProcedure(proc);<a name="line.114"></a>
+<span class="sourceLineNo">115</span>          } finally {<a name="line.115"></a>
+<span class="sourceLineNo">116</span>            regionNode.unlock();<a name="line.116"></a>
+<span class="sourceLineNo">117</span>          }<a name="line.117"></a>
+<span class="sourceLineNo">118</span>          addChildProcedure(proc);<a name="line.118"></a>
+<span class="sourceLineNo">119</span>        }<a name="line.119"></a>
+<span class="sourceLineNo">120</span>        setNextState(ReopenTableRegionsState.REOPEN_TABLE_REGIONS_CONFIRM_REOPENED);<a name="line.120"></a>
+<span class="sourceLineNo">121</span>        return Flow.HAS_MORE_STATE;<a name="line.121"></a>
+<span class="sourceLineNo">122</span>      case REOPEN_TABLE_REGIONS_CONFIRM_REOPENED:<a name="line.122"></a>
+<span class="sourceLineNo">123</span>        regions = regions.stream().map(env.getAssignmentManager().getRegionStates()::checkReopened)<a name="line.123"></a>
+<span class="sourceLineNo">124</span>          .filter(l -&gt; l != null).collect(Collectors.toList());<a name="line.124"></a>
+<span class="sourceLineNo">125</span>        if (regions.isEmpty()) {<a name="line.125"></a>
+<span class="sourceLineNo">126</span>          return Flow.NO_MORE_STATE;<a name="line.126"></a>
+<span class="sourceLineNo">127</span>        }<a name="line.127"></a>
+<span class="sourceLineNo">128</span>        if (regions.stream().anyMatch(loc -&gt; canSchedule(env, loc))) {<a name="line.128"></a>
+<span class="sourceLineNo">129</span>          retryCounter = null;<a name="line.129"></a>
+<span class="sourceLineNo">130</span>          setNextState(ReopenTableRegionsState.REOPEN_TABLE_REGIONS_REOPEN_REGIONS);<a name="line.130"></a>
+<span class="sourceLineNo">131</span>          return Flow.HAS_MORE_STATE;<a name="line.131"></a>
+<span class="sourceLineNo">132</span>        }<a name="line.132"></a>
+<span class="sourceLineNo">133</span>        // We can not schedule TRSP for all the regions need to reopen, wait for a while and retry<a name="line.133"></a>
+<span class="sourceLineNo">134</span>        // again.<a name="line.134"></a>
+<span class="sourceLineNo">135</span>        if (retryCounter == null) {<a name="line.135"></a>
+<span class="sourceLineNo">136</span>          retryCounter = ProcedureUtil.createRetryCounter(env.getMasterConfiguration());<a name="line.136"></a>
+<span class="sourceLineNo">137</span>        }<a name="line.137"></a>
+<span class="sourceLineNo">138</span>        long backoff = retryCounter.getBackoffTimeAndIncrementAttempts();<a name="line.138"></a>
+<span class="sourceLineNo">139</span>        LOG.info(<a name="line.139"></a>
+<span class="sourceLineNo">140</span>          "There are still {} region(s) which need to be reopened for table {} are in " +<a name="line.140"></a>
+<span class="sourceLineNo">141</span>            "OPENING state, suspend {}secs and try again later",<a name="line.141"></a>
+<span class="sourceLineNo">142</span>          regions.size(), tableName, backoff / 1000);<a name="line.142"></a>
+<span class="sourceLineNo">143</span>        setTimeout(Math.toIntExact(backoff));<a name="line.143"></a>
+<span class="sourceLineNo">144</span>        setState(ProcedureProtos.ProcedureState.WAITING_TIMEOUT);<a name="line.144"></a>
+<span class="sourceLineNo">145</span>        skipPersistence();<a name="line.145"></a>
+<span class="sourceLineNo">146</span>        throw new ProcedureSuspendedException();<a name="line.146"></a>
+<span class="sourceLineNo">147</span>      default:<a name="line.147"></a>
+<span class="sourceLineNo">148</span>        throw new UnsupportedOperationException("unhandled state=" + state);<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    }<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  }<a name="line.150"></a>
+<span class="sourceLineNo">151</span><a name="line.151"></a>
+<span class="sourceLineNo">152</span>  /**<a name="line.152"></a>
+<span class="sourceLineNo">153</span>   * At end of timeout, wake ourselves up so we run again.<a name="line.153"></a>
+<span class="sourceLineNo">154</span>   */<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  @Override<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  protected synchronized boolean setTimeoutFailure(MasterProcedureEnv env) {<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    setState(ProcedureProtos.ProcedureState.RUNNABLE);<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    env.getProcedureScheduler().addFront(this);<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    return false; // 'false' means that this procedure handled the timeout<a name="line.159"></a>
+<span class="sourceLineNo">160</span>  }<a name="line.160"></a>
+<span class="sourceLineNo">161</span><a name="line.161"></a>
+<span class="sourceLineNo">162</span>  @Override<a name="line.162"></a>
+<span class="sourceLineNo">163</span>  protected void rollbackState(MasterProcedureEnv env, ReopenTableRegionsState state)<a name="line.163"></a>
+<span class="sourceLineNo">164</span>      throws IOException, InterruptedException {<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    throw new UnsupportedOperationException("unhandled state=" + state);<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  }<a name="line.166"></a>
+<span class="sourceLineNo">167</span><a name="line.167"></a>
+<span class="sourceLineNo">168</span>  @Override<a name="line.168"></a>
+<span class="sourceLineNo">169</span>  protected ReopenTableRegionsState getState(int stateId) {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    return ReopenTableRegionsState.forNumber(stateId);<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  }<a name="line.171"></a>
+<span class="sourceLineNo">172</span><a name="line.172"></a>
+<span class="sourceLineNo">173</span>  @Override<a name="line.173"></a>
+<span class="sourceLineNo">174</span>  protected int getStateId(ReopenTableRegionsState state) {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    return state.getNumber();<a name="line.175"></a>
+<span class="sourceLineNo">176</span>  }<a name="line.176"></a>
+<span class="sourceLineNo">177</span><a name="line.177"></a>
+<span class="sourceLineNo">178</span>  @Override<a name="line.178"></a>
+<span class="sourceLineNo">179</span>  protected ReopenTableRegionsState getInitialState() {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    return ReopenTableRegionsState.REOPEN_TABLE_REGIONS_GET_REGIONS;<a name="line.180"></a>
+<span class="sourceLineNo">181</span>  }<a name="line.181"></a>
+<span class="sourceLineNo">182</span><a name="line.182"></a>
+<span class="sourceLineNo">183</span>  @Override<a name="line.183"></a>
+<span class="sourceLineNo">184</span>  protected void serializeStateData(ProcedureStateSerializer serializer) throws IOException {<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    super.serializeStateData(serializer);<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    ReopenTableRegionsStateData.Builder builder = ReopenTableRegionsStateData.newBuilder()<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      .setTableName(ProtobufUtil.toProtoTableName(tableName));<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    regions.stream().map(ProtobufUtil::toRegionLocation).forEachOrdered(builder::addRegion);<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    serializer.serialize(builder.build());<a name="line.189"></a>
+<span class="sourceLineNo">190</span>  }<a name="line.190"></a>
+<span class="sourceLineNo">191</span><a name="line.191"></a>
+<span class="sourceLineNo">192</span>  @Override<a name="line.192"></a>
+<span class="sourceLineNo">193</span>  protected void deserializeStateData(ProcedureStateSerializer serializer) throws IOException {<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    super.deserializeStateData(serializer);<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    ReopenTableRegionsStateData data = serializer.deserialize(ReopenTableRegionsStateData.class);<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    tableName = ProtobufUtil.toTableName(data.getTableName());<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    regions = data.getRegionList().stream().map(ProtobufUtil::toRegionLocation)<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      .collect(Collectors.toList());<a name="line.198"></a>
+<span class="sourceLineNo">199</span>  }<a name="line.199"></a>
+<span class="sourceLineNo">200</span>}<a name="line.200"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html
index b3d020a..a82ec99 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.html
@@ -36,176 +36,173 @@
 <span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.procedure2.ProcedureUtil;<a name="line.28"></a>
 <span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.procedure2.ProcedureYieldException;<a name="line.29"></a>
 <span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.procedure2.StateMachineProcedure;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.wal.AbstractFSWALProvider;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.slf4j.Logger;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.slf4j.LoggerFactory;<a name="line.34"></a>
-<span class="sourceLineNo">035</span><a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos;<a name="line.39"></a>
-<span class="sourceLineNo">040</span><a name="line.40"></a>
-<span class="sourceLineNo">041</span>/**<a name="line.41"></a>
-<span class="sourceLineNo">042</span> * The procedure is to split a WAL. It will get an available region server and<a name="line.42"></a>
-<span class="sourceLineNo">043</span> * schedule a {@link SplitWALRemoteProcedure} to actually send the request to region<a name="line.43"></a>
-<span class="sourceLineNo">044</span> * server to split this WAL.<a name="line.44"></a>
-<span class="sourceLineNo">045</span> * It also check if the split wal task really succeed. If the WAL still exists, it will<a name="line.45"></a>
-<span class="sourceLineNo">046</span> * schedule another region server to split this WAL.<a name="line.46"></a>
-<span class="sourceLineNo">047</span> */<a name="line.47"></a>
-<span class="sourceLineNo">048</span>@InterfaceAudience.Private<a name="line.48"></a>
-<span class="sourceLineNo">049</span>public class SplitWALProcedure<a name="line.49"></a>
-<span class="sourceLineNo">050</span>    extends StateMachineProcedure&lt;MasterProcedureEnv, MasterProcedureProtos.SplitWALState&gt;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>    implements ServerProcedureInterface {<a name="line.51"></a>
-<span class="sourceLineNo">052</span>  private static final Logger LOG = LoggerFactory.getLogger(SplitWALProcedure.class);<a name="line.52"></a>
-<span class="sourceLineNo">053</span>  private String walPath;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>  private ServerName worker;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>  private ServerName crashedServer;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>  private int attempts = 0;<a name="line.56"></a>
-<span class="sourceLineNo">057</span><a name="line.57"></a>
-<span class="sourceLineNo">058</span>  public SplitWALProcedure() {<a name="line.58"></a>
-<span class="sourceLineNo">059</span>  }<a name="line.59"></a>
-<span class="sourceLineNo">060</span><a name="line.60"></a>
-<span class="sourceLineNo">061</span>  public SplitWALProcedure(String walPath, ServerName crashedServer) {<a name="line.61"></a>
-<span class="sourceLineNo">062</span>    this.walPath = walPath;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>    this.crashedServer = crashedServer;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>  }<a name="line.64"></a>
-<span class="sourceLineNo">065</span><a name="line.65"></a>
-<span class="sourceLineNo">066</span>  @Override<a name="line.66"></a>
-<span class="sourceLineNo">067</span>  protected Flow executeFromState(MasterProcedureEnv env, MasterProcedureProtos.SplitWALState state)<a name="line.67"></a>
-<span class="sourceLineNo">068</span>      throws ProcedureSuspendedException, ProcedureYieldException, InterruptedException {<a name="line.68"></a>
-<span class="sourceLineNo">069</span>    SplitWALManager splitWALManager = env.getMasterServices().getSplitWALManager();<a name="line.69"></a>
-<span class="sourceLineNo">070</span>    switch (state) {<a name="line.70"></a>
-<span class="sourceLineNo">071</span>      case ACQUIRE_SPLIT_WAL_WORKER:<a name="line.71"></a>
-<span class="sourceLineNo">072</span>        worker = splitWALManager.acquireSplitWALWorker(this);<a name="line.72"></a>
-<span class="sourceLineNo">073</span>        setNextState(MasterProcedureProtos.SplitWALState.DISPATCH_WAL_TO_WORKER);<a name="line.73"></a>
-<span class="sourceLineNo">074</span>        return Flow.HAS_MORE_STATE;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>      case DISPATCH_WAL_TO_WORKER:<a name="line.75"></a>
-<span class="sourceLineNo">076</span>        assert worker != null;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>        addChildProcedure(new SplitWALRemoteProcedure(worker, crashedServer, walPath));<a name="line.77"></a>
-<span class="sourceLineNo">078</span>        setNextState(MasterProcedureProtos.SplitWALState.RELEASE_SPLIT_WORKER);<a name="line.78"></a>
-<span class="sourceLineNo">079</span>        return Flow.HAS_MORE_STATE;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>      case RELEASE_SPLIT_WORKER:<a name="line.80"></a>
-<span class="sourceLineNo">081</span>        boolean finished;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>        try {<a name="line.82"></a>
-<span class="sourceLineNo">083</span>          finished = splitWALManager.isSplitWALFinished(walPath);<a name="line.83"></a>
-<span class="sourceLineNo">084</span>        } catch (IOException ioe) {<a name="line.84"></a>
-<span class="sourceLineNo">085</span>          long backoff = ProcedureUtil.getBackoffTimeMs(attempts++);<a name="line.85"></a>
-<span class="sourceLineNo">086</span>          LOG.warn(<a name="line.86"></a>
-<span class="sourceLineNo">087</span>            "Failed to check whether splitting wal {} success, wait {} seconds to retry",<a name="line.87"></a>
-<span class="sourceLineNo">088</span>            walPath, backoff / 1000, ioe);<a name="line.88"></a>
-<span class="sourceLineNo">089</span>          throw suspend(backoff);<a name="line.89"></a>
-<span class="sourceLineNo">090</span>        }<a name="line.90"></a>
-<span class="sourceLineNo">091</span>        splitWALManager.releaseSplitWALWorker(worker, env.getProcedureScheduler());<a name="line.91"></a>
-<span class="sourceLineNo">092</span>        if (!finished) {<a name="line.92"></a>
-<span class="sourceLineNo">093</span>          LOG.warn("Failed to split wal {} by server {}, retry...", walPath, worker);<a name="line.93"></a>
-<span class="sourceLineNo">094</span>          setNextState(MasterProcedureProtos.SplitWALState.ACQUIRE_SPLIT_WAL_WORKER);<a name="line.94"></a>
-<span class="sourceLineNo">095</span>          return Flow.HAS_MORE_STATE;<a name="line.95"></a>
+<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.util.RetryCounter;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.wal.AbstractFSWALProvider;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.slf4j.Logger;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.slf4j.LoggerFactory;<a name="line.35"></a>
+<span class="sourceLineNo">036</span><a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos;<a name="line.40"></a>
+<span class="sourceLineNo">041</span><a name="line.41"></a>
+<span class="sourceLineNo">042</span>/**<a name="line.42"></a>
+<span class="sourceLineNo">043</span> * The procedure is to split a WAL. It will get an available region server and<a name="line.43"></a>
+<span class="sourceLineNo">044</span> * schedule a {@link SplitWALRemoteProcedure} to actually send the request to region<a name="line.44"></a>
+<span class="sourceLineNo">045</span> * server to split this WAL.<a name="line.45"></a>
+<span class="sourceLineNo">046</span> * It also check if the split wal task really succeed. If the WAL still exists, it will<a name="line.46"></a>
+<span class="sourceLineNo">047</span> * schedule another region server to split this WAL.<a name="line.47"></a>
+<span class="sourceLineNo">048</span> */<a name="line.48"></a>
+<span class="sourceLineNo">049</span>@InterfaceAudience.Private<a name="line.49"></a>
+<span class="sourceLineNo">050</span>public class SplitWALProcedure<a name="line.50"></a>
+<span class="sourceLineNo">051</span>    extends StateMachineProcedure&lt;MasterProcedureEnv, MasterProcedureProtos.SplitWALState&gt;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>    implements ServerProcedureInterface {<a name="line.52"></a>
+<span class="sourceLineNo">053</span>  private static final Logger LOG = LoggerFactory.getLogger(SplitWALProcedure.class);<a name="line.53"></a>
+<span class="sourceLineNo">054</span>  private String walPath;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>  private ServerName worker;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>  private ServerName crashedServer;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>  private RetryCounter retryCounter;<a name="line.57"></a>
+<span class="sourceLineNo">058</span><a name="line.58"></a>
+<span class="sourceLineNo">059</span>  public SplitWALProcedure() {<a name="line.59"></a>
+<span class="sourceLineNo">060</span>  }<a name="line.60"></a>
+<span class="sourceLineNo">061</span><a name="line.61"></a>
+<span class="sourceLineNo">062</span>  public SplitWALProcedure(String walPath, ServerName crashedServer) {<a name="line.62"></a>
+<span class="sourceLineNo">063</span>    this.walPath = walPath;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>    this.crashedServer = crashedServer;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>  }<a name="line.65"></a>
+<span class="sourceLineNo">066</span><a name="line.66"></a>
+<span class="sourceLineNo">067</span>  @Override<a name="line.67"></a>
+<span class="sourceLineNo">068</span>  protected Flow executeFromState(MasterProcedureEnv env, MasterProcedureProtos.SplitWALState state)<a name="line.68"></a>
+<span class="sourceLineNo">069</span>      throws ProcedureSuspendedException, ProcedureYieldException, InterruptedException {<a name="line.69"></a>
+<span class="sourceLineNo">070</span>    SplitWALManager splitWALManager = env.getMasterServices().getSplitWALManager();<a name="line.70"></a>
+<span class="sourceLineNo">071</span>    switch (state) {<a name="line.71"></a>
+<span class="sourceLineNo">072</span>      case ACQUIRE_SPLIT_WAL_WORKER:<a name="line.72"></a>
+<span class="sourceLineNo">073</span>        worker = splitWALManager.acquireSplitWALWorker(this);<a name="line.73"></a>
+<span class="sourceLineNo">074</span>        setNextState(MasterProcedureProtos.SplitWALState.DISPATCH_WAL_TO_WORKER);<a name="line.74"></a>
+<span class="sourceLineNo">075</span>        return Flow.HAS_MORE_STATE;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>      case DISPATCH_WAL_TO_WORKER:<a name="line.76"></a>
+<span class="sourceLineNo">077</span>        assert worker != null;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>        addChildProcedure(new SplitWALRemoteProcedure(worker, crashedServer, walPath));<a name="line.78"></a>
+<span class="sourceLineNo">079</span>        setNextState(MasterProcedureProtos.SplitWALState.RELEASE_SPLIT_WORKER);<a name="line.79"></a>
+<span class="sourceLineNo">080</span>        return Flow.HAS_MORE_STATE;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>      case RELEASE_SPLIT_WORKER:<a name="line.81"></a>
+<span class="sourceLineNo">082</span>        boolean finished;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>        try {<a name="line.83"></a>
+<span class="sourceLineNo">084</span>          finished = splitWALManager.isSplitWALFinished(walPath);<a name="line.84"></a>
+<span class="sourceLineNo">085</span>        } catch (IOException ioe) {<a name="line.85"></a>
+<span class="sourceLineNo">086</span>          if (retryCounter == null) {<a name="line.86"></a>
+<span class="sourceLineNo">087</span>            retryCounter = ProcedureUtil.createRetryCounter(env.getMasterConfiguration());<a name="line.87"></a>
+<span class="sourceLineNo">088</span>          }<a name="line.88"></a>
+<span class="sourceLineNo">089</span>          long backoff = retryCounter.getBackoffTimeAndIncrementAttempts();<a name="line.89"></a>
+<span class="sourceLineNo">090</span>          LOG.warn("Failed to check whether splitting wal {} success, wait {} seconds to retry",<a name="line.90"></a>
+<span class="sourceLineNo">091</span>            walPath, backoff / 1000, ioe);<a name="line.91"></a>
+<span class="sourceLineNo">092</span>          setTimeout(Math.toIntExact(backoff));<a name="line.92"></a>
+<span class="sourceLineNo">093</span>          setState(ProcedureProtos.ProcedureState.WAITING_TIMEOUT);<a name="line.93"></a>
+<span class="sourceLineNo">094</span>          skipPersistence();<a name="line.94"></a>
+<span class="sourceLineNo">095</span>          throw new ProcedureSuspendedException();<a name="line.95"></a>
 <span class="sourceLineNo">096</span>        }<a name="line.96"></a>
-<span class="sourceLineNo">097</span>        ServerCrashProcedure.updateProgress(env, getParentProcId());<a name="line.97"></a>
-<span class="sourceLineNo">098</span>        return Flow.NO_MORE_STATE;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>      default:<a name="line.99"></a>
-<span class="sourceLineNo">100</span>        throw new UnsupportedOperationException("unhandled state=" + state);<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    }<a name="line.101"></a>
-<span class="sourceLineNo">102</span>  }<a name="line.102"></a>
-<span class="sourceLineNo">103</span><a name="line.103"></a>
-<span class="sourceLineNo">104</span>  @Override<a name="line.104"></a>
-<span class="sourceLineNo">105</span>  protected void rollbackState(MasterProcedureEnv env,<a name="line.105"></a>
-<span class="sourceLineNo">106</span>      MasterProcedureProtos.SplitWALState splitOneWalState)<a name="line.106"></a>
-<span class="sourceLineNo">107</span>      throws IOException, InterruptedException {<a name="line.107"></a>
-<span class="sourceLineNo">108</span>    if (splitOneWalState == getInitialState()) {<a name="line.108"></a>
-<span class="sourceLineNo">109</span>      return;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    }<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    throw new UnsupportedOperationException();<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  }<a name="line.112"></a>
-<span class="sourceLineNo">113</span><a name="line.113"></a>
-<span class="sourceLineNo">114</span>  @Override<a name="line.114"></a>
-<span class="sourceLineNo">115</span>  protected MasterProcedureProtos.SplitWALState getState(int stateId) {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    return MasterProcedureProtos.SplitWALState.forNumber(stateId);<a name="line.116"></a>
-<span class="sourceLineNo">117</span>  }<a name="line.117"></a>
-<span class="sourceLineNo">118</span><a name="line.118"></a>
-<span class="sourceLineNo">119</span>  @Override<a name="line.119"></a>
-<span class="sourceLineNo">120</span>  protected int getStateId(MasterProcedureProtos.SplitWALState state) {<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    return state.getNumber();<a name="line.121"></a>
-<span class="sourceLineNo">122</span>  }<a name="line.122"></a>
-<span class="sourceLineNo">123</span><a name="line.123"></a>
-<span class="sourceLineNo">124</span>  @Override<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  protected MasterProcedureProtos.SplitWALState getInitialState() {<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    return MasterProcedureProtos.SplitWALState.ACQUIRE_SPLIT_WAL_WORKER;<a name="line.126"></a>
-<span class="sourceLineNo">127</span>  }<a name="line.127"></a>
-<span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span>  @Override<a name="line.129"></a>
-<span class="sourceLineNo">130</span>  protected void serializeStateData(ProcedureStateSerializer serializer) throws IOException {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    super.serializeStateData(serializer);<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    MasterProcedureProtos.SplitWALData.Builder builder =<a name="line.132"></a>
-<span class="sourceLineNo">133</span>        MasterProcedureProtos.SplitWALData.newBuilder();<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    builder.setWalPath(walPath).setCrashedServer(ProtobufUtil.toServerName(crashedServer));<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    if (worker != null) {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>      builder.setWorker(ProtobufUtil.toServerName(worker));<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    }<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    serializer.serialize(builder.build());<a name="line.138"></a>
-<span class="sourceLineNo">139</span>  }<a name="line.139"></a>
-<span class="sourceLineNo">140</span><a name="line.140"></a>
-<span class="sourceLineNo">141</span>  @Override<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  protected void deserializeStateData(ProcedureStateSerializer serializer) throws IOException {<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    super.deserializeStateData(serializer);<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    MasterProcedureProtos.SplitWALData data =<a name="line.144"></a>
-<span class="sourceLineNo">145</span>        serializer.deserialize(MasterProcedureProtos.SplitWALData.class);<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    walPath = data.getWalPath();<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    crashedServer = ProtobufUtil.toServerName(data.getCrashedServer());<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    if (data.hasWorker()) {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>      worker = ProtobufUtil.toServerName(data.getWorker());<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    }<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  }<a name="line.151"></a>
-<span class="sourceLineNo">152</span><a name="line.152"></a>
-<span class="sourceLineNo">153</span>  @Override<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  protected synchronized boolean setTimeoutFailure(MasterProcedureEnv env) {<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    setState(ProcedureProtos.ProcedureState.RUNNABLE);<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    env.getProcedureScheduler().addFront(this);<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    return false;<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  }<a name="line.158"></a>
-<span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>  protected final ProcedureSuspendedException suspend(long backoff)<a name="line.160"></a>
-<span class="sourceLineNo">161</span>      throws ProcedureSuspendedException {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    attempts++;<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    setTimeout(Math.toIntExact(backoff));<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    setState(ProcedureProtos.ProcedureState.WAITING_TIMEOUT);<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    skipPersistence();<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    throw new ProcedureSuspendedException();<a name="line.166"></a>
-<span class="sourceLineNo">167</span>  }<a name="line.167"></a>
-<span class="sourceLineNo">168</span><a name="line.168"></a>
-<span class="sourceLineNo">169</span>  public String getWAL() {<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    return walPath;<a name="line.170"></a>
-<span class="sourceLineNo">171</span>  }<a name="line.171"></a>
-<span class="sourceLineNo">172</span><a name="line.172"></a>
-<span class="sourceLineNo">173</span>  @VisibleForTesting<a name="line.173"></a>
-<span class="sourceLineNo">174</span>  public ServerName getWorker(){<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    return worker;<a name="line.175"></a>
-<span class="sourceLineNo">176</span>  }<a name="line.176"></a>
-<span class="sourceLineNo">177</span><a name="line.177"></a>
-<span class="sourceLineNo">178</span>  @Override<a name="line.178"></a>
-<span class="sourceLineNo">179</span>  public ServerName getServerName() {<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    return this.crashedServer;<a name="line.180"></a>
-<span class="sourceLineNo">181</span>  }<a name="line.181"></a>
-<span class="sourceLineNo">182</span><a name="line.182"></a>
-<span class="sourceLineNo">183</span>  @Override<a name="line.183"></a>
-<span class="sourceLineNo">184</span>  public boolean hasMetaTableRegion() {<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    return AbstractFSWALProvider.isMetaFile(new Path(walPath));<a name="line.185"></a>
-<span class="sourceLineNo">186</span>  }<a name="line.186"></a>
-<span class="sourceLineNo">187</span><a name="line.187"></a>
-<span class="sourceLineNo">188</span>  @Override<a name="line.188"></a>
-<span class="sourceLineNo">189</span>  public ServerOperationType getServerOperationType() {<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    return ServerOperationType.SPLIT_WAL;<a name="line.190"></a>
-<span class="sourceLineNo">191</span>  }<a name="line.191"></a>
-<span class="sourceLineNo">192</span><a name="line.192"></a>
-<span class="sourceLineNo">193</span>  @Override<a name="line.193"></a>
-<span class="sourceLineNo">194</span>  protected void afterReplay(MasterProcedureEnv env){<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    if(worker != null){<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      env.getMasterServices().getSplitWALManager().addUsedSplitWALWorker(worker);<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    }<a name="line.197"></a>
-<span class="sourceLineNo">198</span><a name="line.198"></a>
-<span class="sourceLineNo">199</span>  }<a name="line.199"></a>
-<span class="sourceLineNo">200</span>}<a name="line.200"></a>
+<span class="sourceLineNo">097</span>        splitWALManager.releaseSplitWALWorker(worker, env.getProcedureScheduler());<a name="line.97"></a>
+<span class="sourceLineNo">098</span>        if (!finished) {<a name="line.98"></a>
+<span class="sourceLineNo">099</span>          LOG.warn("Failed to split wal {} by server {}, retry...", walPath, worker);<a name="line.99"></a>
+<span class="sourceLineNo">100</span>          setNextState(MasterProcedureProtos.SplitWALState.ACQUIRE_SPLIT_WAL_WORKER);<a name="line.100"></a>
+<span class="sourceLineNo">101</span>          return Flow.HAS_MORE_STATE;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>        }<a name="line.102"></a>
+<span class="sourceLineNo">103</span>        ServerCrashProcedure.updateProgress(env, getParentProcId());<a name="line.103"></a>
+<span class="sourceLineNo">104</span>        return Flow.NO_MORE_STATE;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>      default:<a name="line.105"></a>
+<span class="sourceLineNo">106</span>        throw new UnsupportedOperationException("unhandled state=" + state);<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    }<a name="line.107"></a>
+<span class="sourceLineNo">108</span>  }<a name="line.108"></a>
+<span class="sourceLineNo">109</span><a name="line.109"></a>
+<span class="sourceLineNo">110</span>  @Override<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  protected void rollbackState(MasterProcedureEnv env,<a name="line.111"></a>
+<span class="sourceLineNo">112</span>      MasterProcedureProtos.SplitWALState splitOneWalState)<a name="line.112"></a>
+<span class="sourceLineNo">113</span>      throws IOException, InterruptedException {<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    if (splitOneWalState == getInitialState()) {<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      return;<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    }<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    throw new UnsupportedOperationException();<a name="line.117"></a>
+<span class="sourceLineNo">118</span>  }<a name="line.118"></a>
+<span class="sourceLineNo">119</span><a name="line.119"></a>
+<span class="sourceLineNo">120</span>  @Override<a name="line.120"></a>
+<span class="sourceLineNo">121</span>  protected MasterProcedureProtos.SplitWALState getState(int stateId) {<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    return MasterProcedureProtos.SplitWALState.forNumber(stateId);<a name="line.122"></a>
+<span class="sourceLineNo">123</span>  }<a name="line.123"></a>
+<span class="sourceLineNo">124</span><a name="line.124"></a>
+<span class="sourceLineNo">125</span>  @Override<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  protected int getStateId(MasterProcedureProtos.SplitWALState state) {<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    return state.getNumber();<a name="line.127"></a>
+<span class="sourceLineNo">128</span>  }<a name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span>  @Override<a name="line.130"></a>
+<span class="sourceLineNo">131</span>  protected MasterProcedureProtos.SplitWALState getInitialState() {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    return MasterProcedureProtos.SplitWALState.ACQUIRE_SPLIT_WAL_WORKER;<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  }<a name="line.133"></a>
+<span class="sourceLineNo">134</span><a name="line.134"></a>
+<span class="sourceLineNo">135</span>  @Override<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  protected void serializeStateData(ProcedureStateSerializer serializer) throws IOException {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    super.serializeStateData(serializer);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    MasterProcedureProtos.SplitWALData.Builder builder =<a name="line.138"></a>
+<span class="sourceLineNo">139</span>        MasterProcedureProtos.SplitWALData.newBuilder();<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    builder.setWalPath(walPath).setCrashedServer(ProtobufUtil.toServerName(crashedServer));<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    if (worker != null) {<a name="line.141"></a>
+<span class="sourceLineNo">142</span>      builder.setWorker(ProtobufUtil.toServerName(worker));<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    }<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    serializer.serialize(builder.build());<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  }<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  @Override<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  protected void deserializeStateData(ProcedureStateSerializer serializer) throws IOException {<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    super.deserializeStateData(serializer);<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    MasterProcedureProtos.SplitWALData data =<a name="line.150"></a>
+<span class="sourceLineNo">151</span>        serializer.deserialize(MasterProcedureProtos.SplitWALData.class);<a name="line.151"></a>
+<span class="sourceLineNo">152</span>    walPath = data.getWalPath();<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    crashedServer = ProtobufUtil.toServerName(data.getCrashedServer());<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    if (data.hasWorker()) {<a name="line.154"></a>
+<span class="sourceLineNo">155</span>      worker = ProtobufUtil.toServerName(data.getWorker());<a name="line.155"></a>
+<span class="sourceLineNo">156</span>    }<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  }<a name="line.157"></a>
+<span class="sourceLineNo">158</span><a name="line.158"></a>
+<span class="sourceLineNo">159</span>  @Override<a name="line.159"></a>
+<span class="sourceLineNo">160</span>  protected synchronized boolean setTimeoutFailure(MasterProcedureEnv env) {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    setState(ProcedureProtos.ProcedureState.RUNNABLE);<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    env.getProcedureScheduler().addFront(this);<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    return false;<a name="line.163"></a>
+<span class="sourceLineNo">164</span>  }<a name="line.164"></a>
+<span class="sourceLineNo">165</span><a name="line.165"></a>
+<span class="sourceLineNo">166</span>  public String getWAL() {<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    return walPath;<a name="line.167"></a>
+<span class="sourceLineNo">168</span>  }<a name="line.168"></a>
+<span class="sourceLineNo">169</span><a name="line.169"></a>
+<span class="sourceLineNo">170</span>  @VisibleForTesting<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  public ServerName getWorker(){<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    return worker;<a name="line.172"></a>
+<span class="sourceLineNo">173</span>  }<a name="line.173"></a>
+<span class="sourceLineNo">174</span><a name="line.174"></a>
+<span class="sourceLineNo">175</span>  @Override<a name="line.175"></a>
+<span class="sourceLineNo">176</span>  public ServerName getServerName() {<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    return this.crashedServer;<a name="line.177"></a>
+<span class="sourceLineNo">178</span>  }<a name="line.178"></a>
+<span class="sourceLineNo">179</span><a name="line.179"></a>
+<span class="sourceLineNo">180</span>  @Override<a name="line.180"></a>
+<span class="sourceLineNo">181</span>  public boolean hasMetaTableRegion() {<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    return AbstractFSWALProvider.isMetaFile(new Path(walPath));<a name="line.182"></a>
+<span class="sourceLineNo">183</span>  }<a name="line.183"></a>
+<span class="sourceLineNo">184</span><a name="line.184"></a>
+<span class="sourceLineNo">185</span>  @Override<a name="line.185"></a>
+<span class="sourceLineNo">186</span>  public ServerOperationType getServerOperationType() {<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    return ServerOperationType.SPLIT_WAL;<a name="line.187"></a>
+<span class="sourceLineNo">188</span>  }<a name="line.188"></a>
+<span class="sourceLineNo">189</span><a name="line.189"></a>
+<span class="sourceLineNo">190</span>  @Override<a name="line.190"></a>
+<span class="sourceLineNo">191</span>  protected void afterReplay(MasterProcedureEnv env){<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    if(worker != null){<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      env.getMasterServices().getSplitWALManager().addUsedSplitWALWorker(worker);<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    }<a name="line.194"></a>
+<span class="sourceLineNo">195</span><a name="line.195"></a>
+<span class="sourceLineNo">196</span>  }<a name="line.196"></a>
+<span class="sourceLineNo">197</span>}<a name="line.197"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html
index cca4273..9d79ced 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/SwitchRpcThrottleProcedure.html
@@ -33,143 +33,147 @@
 <span class="sourceLineNo">025</span>import org.apache.hadoop.hbase.procedure2.ProcedureYieldException;<a name="line.25"></a>
 <span class="sourceLineNo">026</span>import org.apache.hadoop.hbase.procedure2.StateMachineProcedure;<a name="line.26"></a>
 <span class="sourceLineNo">027</span>import org.apache.hadoop.hbase.quotas.RpcThrottleStorage;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import org.slf4j.Logger;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import org.slf4j.LoggerFactory;<a name="line.30"></a>
-<span class="sourceLineNo">031</span><a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.SwitchRpcThrottleState;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.SwitchRpcThrottleStateData;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos;<a name="line.34"></a>
-<span class="sourceLineNo">035</span><a name="line.35"></a>
-<span class="sourceLineNo">036</span>/**<a name="line.36"></a>
-<span class="sourceLineNo">037</span> * The procedure to switch rpc throttle<a name="line.37"></a>
-<span class="sourceLineNo">038</span> */<a name="line.38"></a>
-<span class="sourceLineNo">039</span>@InterfaceAudience.Private<a name="line.39"></a>
-<span class="sourceLineNo">040</span>public class SwitchRpcThrottleProcedure<a name="line.40"></a>
-<span class="sourceLineNo">041</span>    extends StateMachineProcedure&lt;MasterProcedureEnv, SwitchRpcThrottleState&gt;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>    implements ServerProcedureInterface {<a name="line.42"></a>
-<span class="sourceLineNo">043</span><a name="line.43"></a>
-<span class="sourceLineNo">044</span>  private static Logger LOG = LoggerFactory.getLogger(SwitchRpcThrottleProcedure.class);<a name="line.44"></a>
-<span class="sourceLineNo">045</span><a name="line.45"></a>
-<span class="sourceLineNo">046</span>  RpcThrottleStorage rpcThrottleStorage;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>  boolean rpcThrottleEnabled;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>  ProcedurePrepareLatch syncLatch;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>  ServerName serverName;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>  int attempts;<a name="line.50"></a>
-<span class="sourceLineNo">051</span><a name="line.51"></a>
-<span class="sourceLineNo">052</span>  public SwitchRpcThrottleProcedure() {<a name="line.52"></a>
-<span class="sourceLineNo">053</span>  }<a name="line.53"></a>
-<span class="sourceLineNo">054</span><a name="line.54"></a>
-<span class="sourceLineNo">055</span>  public SwitchRpcThrottleProcedure(RpcThrottleStorage rpcThrottleStorage,<a name="line.55"></a>
-<span class="sourceLineNo">056</span>      boolean rpcThrottleEnabled, ServerName serverName, final ProcedurePrepareLatch syncLatch) {<a name="line.56"></a>
-<span class="sourceLineNo">057</span>    this.rpcThrottleStorage = rpcThrottleStorage;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>    this.syncLatch = syncLatch;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>    this.rpcThrottleEnabled = rpcThrottleEnabled;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>    this.serverName = serverName;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>  }<a name="line.61"></a>
-<span class="sourceLineNo">062</span><a name="line.62"></a>
-<span class="sourceLineNo">063</span>  @Override<a name="line.63"></a>
-<span class="sourceLineNo">064</span>  protected Flow executeFromState(MasterProcedureEnv env, SwitchRpcThrottleState state)<a name="line.64"></a>
-<span class="sourceLineNo">065</span>      throws ProcedureSuspendedException, ProcedureYieldException, InterruptedException {<a name="line.65"></a>
-<span class="sourceLineNo">066</span>    switch (state) {<a name="line.66"></a>
-<span class="sourceLineNo">067</span>      case UPDATE_SWITCH_RPC_THROTTLE_STORAGE:<a name="line.67"></a>
-<span class="sourceLineNo">068</span>        try {<a name="line.68"></a>
-<span class="sourceLineNo">069</span>          switchThrottleState(env, rpcThrottleEnabled);<a name="line.69"></a>
-<span class="sourceLineNo">070</span>        } catch (IOException e) {<a name="line.70"></a>
-<span class="sourceLineNo">071</span>          long backoff = ProcedureUtil.getBackoffTimeMs(this.attempts++);<a name="line.71"></a>
-<span class="sourceLineNo">072</span>          LOG.warn("Failed to store rpc throttle value {}, sleep {} secs and retry",<a name="line.72"></a>
-<span class="sourceLineNo">073</span>            rpcThrottleEnabled, backoff / 1000, e);<a name="line.73"></a>
-<span class="sourceLineNo">074</span>          setTimeout(Math.toIntExact(backoff));<a name="line.74"></a>
-<span class="sourceLineNo">075</span>          setState(ProcedureProtos.ProcedureState.WAITING_TIMEOUT);<a name="line.75"></a>
-<span class="sourceLineNo">076</span>          skipPersistence();<a name="line.76"></a>
-<span class="sourceLineNo">077</span>          throw new ProcedureSuspendedException();<a name="line.77"></a>
-<span class="sourceLineNo">078</span>        }<a name="line.78"></a>
-<span class="sourceLineNo">079</span>        setNextState(SwitchRpcThrottleState.SWITCH_RPC_THROTTLE_ON_RS);<a name="line.79"></a>
-<span class="sourceLineNo">080</span>        return Flow.HAS_MORE_STATE;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>      case SWITCH_RPC_THROTTLE_ON_RS:<a name="line.81"></a>
-<span class="sourceLineNo">082</span>        SwitchRpcThrottleRemoteProcedure[] subProcedures =<a name="line.82"></a>
-<span class="sourceLineNo">083</span>            env.getMasterServices().getServerManager().getOnlineServersList().stream()<a name="line.83"></a>
-<span class="sourceLineNo">084</span>                .map(sn -&gt; new SwitchRpcThrottleRemoteProcedure(sn, rpcThrottleEnabled))<a name="line.84"></a>
-<span class="sourceLineNo">085</span>                .toArray(SwitchRpcThrottleRemoteProcedure[]::new);<a name="line.85"></a>
-<span class="sourceLineNo">086</span>        addChildProcedure(subProcedures);<a name="line.86"></a>
-<span class="sourceLineNo">087</span>        setNextState(SwitchRpcThrottleState.POST_SWITCH_RPC_THROTTLE);<a name="line.87"></a>
-<span class="sourceLineNo">088</span>        return Flow.HAS_MORE_STATE;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>      case POST_SWITCH_RPC_THROTTLE:<a name="line.89"></a>
-<span class="sourceLineNo">090</span>        ProcedurePrepareLatch.releaseLatch(syncLatch, this);<a name="line.90"></a>
-<span class="sourceLineNo">091</span>        return Flow.NO_MORE_STATE;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>      default:<a name="line.92"></a>
-<span class="sourceLineNo">093</span>        throw new UnsupportedOperationException("unhandled state=" + state);<a name="line.93"></a>
-<span class="sourceLineNo">094</span>    }<a name="line.94"></a>
-<span class="sourceLineNo">095</span>  }<a name="line.95"></a>
-<span class="sourceLineNo">096</span><a name="line.96"></a>
-<span class="sourceLineNo">097</span>  @Override<a name="line.97"></a>
-<span class="sourceLineNo">098</span>  protected void rollbackState(MasterProcedureEnv env, SwitchRpcThrottleState state)<a name="line.98"></a>
-<span class="sourceLineNo">099</span>      throws IOException, InterruptedException {<a name="line.99"></a>
-<span class="sourceLineNo">100</span>  }<a name="line.100"></a>
-<span class="sourceLineNo">101</span><a name="line.101"></a>
-<span class="sourceLineNo">102</span>  @Override<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  protected SwitchRpcThrottleState getState(int stateId) {<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    return SwitchRpcThrottleState.forNumber(stateId);<a name="line.104"></a>
-<span class="sourceLineNo">105</span>  }<a name="line.105"></a>
-<span class="sourceLineNo">106</span><a name="line.106"></a>
-<span class="sourceLineNo">107</span>  @Override<a name="line.107"></a>
-<span class="sourceLineNo">108</span>  protected int getStateId(SwitchRpcThrottleState throttleState) {<a name="line.108"></a>
-<span class="sourceLineNo">109</span>    return throttleState.getNumber();<a name="line.109"></a>
-<span class="sourceLineNo">110</span>  }<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>  @Override<a name="line.112"></a>
-<span class="sourceLineNo">113</span>  protected SwitchRpcThrottleState getInitialState() {<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    return SwitchRpcThrottleState.UPDATE_SWITCH_RPC_THROTTLE_STORAGE;<a name="line.114"></a>
-<span class="sourceLineNo">115</span>  }<a name="line.115"></a>
-<span class="sourceLineNo">116</span><a name="line.116"></a>
-<span class="sourceLineNo">117</span>  @Override<a name="line.117"></a>
-<span class="sourceLineNo">118</span>  protected SwitchRpcThrottleState getCurrentState() {<a name="line.118"></a>
-<span class="sourceLineNo">119</span>    return super.getCurrentState();<a name="line.119"></a>
-<span class="sourceLineNo">120</span>  }<a name="line.120"></a>
-<span class="sourceLineNo">121</span><a name="line.121"></a>
-<span class="sourceLineNo">122</span>  @Override<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  protected void serializeStateData(ProcedureStateSerializer serializer) throws IOException {<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    super.serializeStateData(serializer);<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    serializer.serialize(<a name="line.125"></a>
-<span class="sourceLineNo">126</span>      SwitchRpcThrottleStateData.newBuilder().setRpcThrottleEnabled(rpcThrottleEnabled).build());<a name="line.126"></a>
-<span class="sourceLineNo">127</span>  }<a name="line.127"></a>
-<span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span>  @Override<a name="line.129"></a>
-<span class="sourceLineNo">130</span>  protected void deserializeStateData(ProcedureStateSerializer serializer) throws IOException {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    super.deserializeStateData(serializer);<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    SwitchRpcThrottleStateData data = serializer.deserialize(SwitchRpcThrottleStateData.class);<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    rpcThrottleEnabled = data.getRpcThrottleEnabled();<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  }<a name="line.134"></a>
-<span class="sourceLineNo">135</span><a name="line.135"></a>
-<span class="sourceLineNo">136</span>  @Override<a name="line.136"></a>
-<span class="sourceLineNo">137</span>  public ServerName getServerName() {<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    return serverName;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>  }<a name="line.139"></a>
-<span class="sourceLineNo">140</span><a name="line.140"></a>
-<span class="sourceLineNo">141</span>  @Override<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public boolean hasMetaTableRegion() {<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    return false;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  }<a name="line.144"></a>
-<span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>  @Override<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  public ServerOperationType getServerOperationType() {<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    return ServerOperationType.SWITCH_RPC_THROTTLE;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  }<a name="line.149"></a>
-<span class="sourceLineNo">150</span><a name="line.150"></a>
-<span class="sourceLineNo">151</span>  public void switchThrottleState(MasterProcedureEnv env, boolean rpcThrottleEnabled)<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      throws IOException {<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    rpcThrottleStorage.switchRpcThrottle(rpcThrottleEnabled);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  }<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>  @Override<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  public void toStringClassDetails(StringBuilder sb) {<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    sb.append(getClass().getSimpleName());<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    sb.append(" server=");<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    sb.append(serverName);<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    sb.append(", rpcThrottleEnabled=");<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    sb.append(rpcThrottleEnabled);<a name="line.162"></a>
-<span class="sourceLineNo">163</span>  }<a name="line.163"></a>
-<span class="sourceLineNo">164</span>}<a name="line.164"></a>
+<span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.util.RetryCounter;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import org.slf4j.Logger;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import org.slf4j.LoggerFactory;<a name="line.31"></a>
+<span class="sourceLineNo">032</span><a name="line.32"></a>
+<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.SwitchRpcThrottleState;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.SwitchRpcThrottleStateData;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos;<a name="line.35"></a>
+<span class="sourceLineNo">036</span><a name="line.36"></a>
+<span class="sourceLineNo">037</span>/**<a name="line.37"></a>
+<span class="sourceLineNo">038</span> * The procedure to switch rpc throttle<a name="line.38"></a>
+<span class="sourceLineNo">039</span> */<a name="line.39"></a>
+<span class="sourceLineNo">040</span>@InterfaceAudience.Private<a name="line.40"></a>
+<span class="sourceLineNo">041</span>public class SwitchRpcThrottleProcedure<a name="line.41"></a>
+<span class="sourceLineNo">042</span>    extends StateMachineProcedure&lt;MasterProcedureEnv, SwitchRpcThrottleState&gt;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>    implements ServerProcedureInterface {<a name="line.43"></a>
+<span class="sourceLineNo">044</span><a name="line.44"></a>
+<span class="sourceLineNo">045</span>  private static Logger LOG = LoggerFactory.getLogger(SwitchRpcThrottleProcedure.class);<a name="line.45"></a>
+<span class="sourceLineNo">046</span><a name="line.46"></a>
+<span class="sourceLineNo">047</span>  private RpcThrottleStorage rpcThrottleStorage;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>  private boolean rpcThrottleEnabled;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>  private ProcedurePrepareLatch syncLatch;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>  private ServerName serverName;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>  private RetryCounter retryCounter;<a name="line.51"></a>
+<span class="sourceLineNo">052</span><a name="line.52"></a>
+<span class="sourceLineNo">053</span>  public SwitchRpcThrottleProcedure() {<a name="line.53"></a>
+<span class="sourceLineNo">054</span>  }<a name="line.54"></a>
+<span class="sourceLineNo">055</span><a name="line.55"></a>
+<span class="sourceLineNo">056</span>  public SwitchRpcThrottleProcedure(RpcThrottleStorage rpcThrottleStorage,<a name="line.56"></a>
+<span class="sourceLineNo">057</span>      boolean rpcThrottleEnabled, ServerName serverName, final ProcedurePrepareLatch syncLatch) {<a name="line.57"></a>
+<span class="sourceLineNo">058</span>    this.rpcThrottleStorage = rpcThrottleStorage;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>    this.syncLatch = syncLatch;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>    this.rpcThrottleEnabled = rpcThrottleEnabled;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>    this.serverName = serverName;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>  }<a name="line.62"></a>
+<span class="sourceLineNo">063</span><a name="line.63"></a>
+<span class="sourceLineNo">064</span>  @Override<a name="line.64"></a>
+<span class="sourceLineNo">065</span>  protected Flow executeFromState(MasterProcedureEnv env, SwitchRpcThrottleState state)<a name="line.65"></a>
+<span class="sourceLineNo">066</span>      throws ProcedureSuspendedException, ProcedureYieldException, InterruptedException {<a name="line.66"></a>
+<span class="sourceLineNo">067</span>    switch (state) {<a name="line.67"></a>
+<span class="sourceLineNo">068</span>      case UPDATE_SWITCH_RPC_THROTTLE_STORAGE:<a name="line.68"></a>
+<span class="sourceLineNo">069</span>        try {<a name="line.69"></a>
+<span class="sourceLineNo">070</span>          switchThrottleState(env, rpcThrottleEnabled);<a name="line.70"></a>
+<span class="sourceLineNo">071</span>        } catch (IOException e) {<a name="line.71"></a>
+<span class="sourceLineNo">072</span>          if (retryCounter == null) {<a name="line.72"></a>
+<span class="sourceLineNo">073</span>            retryCounter = ProcedureUtil.createRetryCounter(env.getMasterConfiguration());<a name="line.73"></a>
+<span class="sourceLineNo">074</span>          }<a name="line.74"></a>
+<span class="sourceLineNo">075</span>          long backoff = retryCounter.getBackoffTimeAndIncrementAttempts();<a name="line.75"></a>
+<span class="sourceLineNo">076</span>          LOG.warn("Failed to store rpc throttle value {}, sleep {} secs and retry",<a name="line.76"></a>
+<span class="sourceLineNo">077</span>            rpcThrottleEnabled, backoff / 1000, e);<a name="line.77"></a>
+<span class="sourceLineNo">078</span>          setTimeout(Math.toIntExact(backoff));<a name="line.78"></a>
+<span class="sourceLineNo">079</span>          setState(ProcedureProtos.ProcedureState.WAITING_TIMEOUT);<a name="line.79"></a>
+<span class="sourceLineNo">080</span>          skipPersistence();<a name="line.80"></a>
+<span class="sourceLineNo">081</span>          throw new ProcedureSuspendedException();<a name="line.81"></a>
+<span class="sourceLineNo">082</span>        }<a name="line.82"></a>
+<span class="sourceLineNo">083</span>        setNextState(SwitchRpcThrottleState.SWITCH_RPC_THROTTLE_ON_RS);<a name="line.83"></a>
+<span class="sourceLineNo">084</span>        return Flow.HAS_MORE_STATE;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>      case SWITCH_RPC_THROTTLE_ON_RS:<a name="line.85"></a>
+<span class="sourceLineNo">086</span>        SwitchRpcThrottleRemoteProcedure[] subProcedures =<a name="line.86"></a>
+<span class="sourceLineNo">087</span>            env.getMasterServices().getServerManager().getOnlineServersList().stream()<a name="line.87"></a>
+<span class="sourceLineNo">088</span>                .map(sn -&gt; new SwitchRpcThrottleRemoteProcedure(sn, rpcThrottleEnabled))<a name="line.88"></a>
+<span class="sourceLineNo">089</span>                .toArray(SwitchRpcThrottleRemoteProcedure[]::new);<a name="line.89"></a>
+<span class="sourceLineNo">090</span>        addChildProcedure(subProcedures);<a name="line.90"></a>
+<span class="sourceLineNo">091</span>        setNextState(SwitchRpcThrottleState.POST_SWITCH_RPC_THROTTLE);<a name="line.91"></a>
+<span class="sourceLineNo">092</span>        return Flow.HAS_MORE_STATE;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>      case POST_SWITCH_RPC_THROTTLE:<a name="line.93"></a>
+<span class="sourceLineNo">094</span>        ProcedurePrepareLatch.releaseLatch(syncLatch, this);<a name="line.94"></a>
+<span class="sourceLineNo">095</span>        return Flow.NO_MORE_STATE;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>      default:<a name="line.96"></a>
+<span class="sourceLineNo">097</span>        throw new UnsupportedOperationException("unhandled state=" + state);<a name="line.97"></a>
+<span class="sourceLineNo">098</span>    }<a name="line.98"></a>
+<span class="sourceLineNo">099</span>  }<a name="line.99"></a>
+<span class="sourceLineNo">100</span><a name="line.100"></a>
+<span class="sourceLineNo">101</span>  @Override<a name="line.101"></a>
+<span class="sourceLineNo">102</span>  protected void rollbackState(MasterProcedureEnv env, SwitchRpcThrottleState state)<a name="line.102"></a>
+<span class="sourceLineNo">103</span>      throws IOException, InterruptedException {<a name="line.103"></a>
+<span class="sourceLineNo">104</span>  }<a name="line.104"></a>
+<span class="sourceLineNo">105</span><a name="line.105"></a>
+<span class="sourceLineNo">106</span>  @Override<a name="line.106"></a>
+<span class="sourceLineNo">107</span>  protected SwitchRpcThrottleState getState(int stateId) {<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    return SwitchRpcThrottleState.forNumber(stateId);<a name="line.108"></a>
+<span class="sourceLineNo">109</span>  }<a name="line.109"></a>
+<span class="sourceLineNo">110</span><a name="line.110"></a>
+<span class="sourceLineNo">111</span>  @Override<a name="line.111"></a>
+<span class="sourceLineNo">112</span>  protected int getStateId(SwitchRpcThrottleState throttleState) {<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    return throttleState.getNumber();<a name="line.113"></a>
+<span class="sourceLineNo">114</span>  }<a name="line.114"></a>
+<span class="sourceLineNo">115</span><a name="line.115"></a>
+<span class="sourceLineNo">116</span>  @Override<a name="line.116"></a>
+<span class="sourceLineNo">117</span>  protected SwitchRpcThrottleState getInitialState() {<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    return SwitchRpcThrottleState.UPDATE_SWITCH_RPC_THROTTLE_STORAGE;<a name="line.118"></a>
+<span class="sourceLineNo">119</span>  }<a name="line.119"></a>
+<span class="sourceLineNo">120</span><a name="line.120"></a>
+<span class="sourceLineNo">121</span>  @Override<a name="line.121"></a>
+<span class="sourceLineNo">122</span>  protected SwitchRpcThrottleState getCurrentState() {<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    return super.getCurrentState();<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  }<a name="line.124"></a>
+<span class="sourceLineNo">125</span><a name="line.125"></a>
+<span class="sourceLineNo">126</span>  @Override<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  protected void serializeStateData(ProcedureStateSerializer serializer) throws IOException {<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    super.serializeStateData(serializer);<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    serializer.serialize(<a name="line.129"></a>
+<span class="sourceLineNo">130</span>      SwitchRpcThrottleStateData.newBuilder().setRpcThrottleEnabled(rpcThrottleEnabled).build());<a name="line.130"></a>
+<span class="sourceLineNo">131</span>  }<a name="line.131"></a>
+<span class="sourceLineNo">132</span><a name="line.132"></a>
+<span class="sourceLineNo">133</span>  @Override<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  protected void deserializeStateData(ProcedureStateSerializer serializer) throws IOException {<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    super.deserializeStateData(serializer);<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    SwitchRpcThrottleStateData data = serializer.deserialize(SwitchRpcThrottleStateData.class);<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    rpcThrottleEnabled = data.getRpcThrottleEnabled();<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
+<span class="sourceLineNo">139</span><a name="line.139"></a>
+<span class="sourceLineNo">140</span>  @Override<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public ServerName getServerName() {<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    return serverName;<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  }<a name="line.143"></a>
+<span class="sourceLineNo">144</span><a name="line.144"></a>
+<span class="sourceLineNo">145</span>  @Override<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  public boolean hasMetaTableRegion() {<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    return false;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  }<a name="line.148"></a>
+<span class="sourceLineNo">149</span><a name="line.149"></a>
+<span class="sourceLineNo">150</span>  @Override<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  public ServerOperationType getServerOperationType() {<a name="line.151"></a>
+<span class="sourceLineNo">152</span>    return ServerOperationType.SWITCH_RPC_THROTTLE;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  }<a name="line.153"></a>
+<span class="sourceLineNo">154</span><a name="line.154"></a>
+<span class="sourceLineNo">155</span>  public void switchThrottleState(MasterProcedureEnv env, boolean rpcThrottleEnabled)<a name="line.155"></a>
+<span class="sourceLineNo">156</span>      throws IOException {<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    rpcThrottleStorage.switchRpcThrottle(rpcThrottleEnabled);<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  }<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  @Override<a name="line.160"></a>
+<span class="sourceLineNo">161</span>  public void toStringClassDetails(StringBuilder sb) {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    sb.append(getClass().getSimpleName());<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    sb.append(" server=");<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    sb.append(serverName);<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    sb.append(", rpcThrottleEnabled=");<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    sb.append(rpcThrottleEnabled);<a name="line.166"></a>
+<span class="sourceLineNo">167</span>  }<a name="line.167"></a>
+<span class="sourceLineNo">168</span>}<a name="line.168"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html
index eac3e9d..8d75a9f 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/replication/AbstractPeerNoLockProcedure.html
@@ -26,84 +26,96 @@
 <span class="sourceLineNo">018</span>package org.apache.hadoop.hbase.master.replication;<a name="line.18"></a>
 <span class="sourceLineNo">019</span><a name="line.19"></a>
 <span class="sourceLineNo">020</span>import java.io.IOException;<a name="line.20"></a>
-<span class="sourceLineNo">021</span>import org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv;<a name="line.21"></a>
-<span class="sourceLineNo">022</span>import org.apache.hadoop.hbase.master.procedure.PeerProcedureInterface;<a name="line.22"></a>
-<span class="sourceLineNo">023</span>import org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer;<a name="line.23"></a>
-<span class="sourceLineNo">024</span>import org.apache.hadoop.hbase.procedure2.ProcedureSuspendedException;<a name="line.24"></a>
-<span class="sourceLineNo">025</span>import org.apache.hadoop.hbase.procedure2.StateMachineProcedure;<a name="line.25"></a>
-<span class="sourceLineNo">026</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.26"></a>
-<span class="sourceLineNo">027</span><a name="line.27"></a>
-<span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.PeerProcedureStateData;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos;<a name="line.29"></a>
-<span class="sourceLineNo">030</span><a name="line.30"></a>
-<span class="sourceLineNo">031</span>/**<a name="line.31"></a>
-<span class="sourceLineNo">032</span> * Base class for replication peer related procedures which do not need to hold locks(for most of<a name="line.32"></a>
-<span class="sourceLineNo">033</span> * the sub procedures).<a name="line.33"></a>
-<span class="sourceLineNo">034</span> */<a name="line.34"></a>
-<span class="sourceLineNo">035</span>@InterfaceAudience.Private<a name="line.35"></a>
-<span class="sourceLineNo">036</span>public abstract class AbstractPeerNoLockProcedure&lt;TState&gt;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>    extends StateMachineProcedure&lt;MasterProcedureEnv, TState&gt; implements PeerProcedureInterface {<a name="line.37"></a>
-<span class="sourceLineNo">038</span><a name="line.38"></a>
-<span class="sourceLineNo">039</span>  protected String peerId;<a name="line.39"></a>
-<span class="sourceLineNo">040</span><a name="line.40"></a>
-<span class="sourceLineNo">041</span>  protected int attempts;<a name="line.41"></a>
+<span class="sourceLineNo">021</span>import java.util.function.LongConsumer;<a name="line.21"></a>
+<span class="sourceLineNo">022</span>import org.apache.hadoop.conf.Configuration;<a name="line.22"></a>
+<span class="sourceLineNo">023</span>import org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv;<a name="line.23"></a>
+<span class="sourceLineNo">024</span>import org.apache.hadoop.hbase.master.procedure.PeerProcedureInterface;<a name="line.24"></a>
+<span class="sourceLineNo">025</span>import org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer;<a name="line.25"></a>
+<span class="sourceLineNo">026</span>import org.apache.hadoop.hbase.procedure2.ProcedureSuspendedException;<a name="line.26"></a>
+<span class="sourceLineNo">027</span>import org.apache.hadoop.hbase.procedure2.ProcedureUtil;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.procedure2.StateMachineProcedure;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.util.RetryCounter;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.30"></a>
+<span class="sourceLineNo">031</span><a name="line.31"></a>
+<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.PeerProcedureStateData;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos;<a name="line.33"></a>
+<span class="sourceLineNo">034</span><a name="line.34"></a>
+<span class="sourceLineNo">035</span>/**<a name="line.35"></a>
+<span class="sourceLineNo">036</span> * Base class for replication peer related procedures which do not need to hold locks(for most of<a name="line.36"></a>
+<span class="sourceLineNo">037</span> * the sub procedures).<a name="line.37"></a>
+<span class="sourceLineNo">038</span> */<a name="line.38"></a>
+<span class="sourceLineNo">039</span>@InterfaceAudience.Private<a name="line.39"></a>
+<span class="sourceLineNo">040</span>public abstract class AbstractPeerNoLockProcedure&lt;TState&gt;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>    extends StateMachineProcedure&lt;MasterProcedureEnv, TState&gt; implements PeerProcedureInterface {<a name="line.41"></a>
 <span class="sourceLineNo">042</span><a name="line.42"></a>
-<span class="sourceLineNo">043</span>  protected AbstractPeerNoLockProcedure() {<a name="line.43"></a>
-<span class="sourceLineNo">044</span>  }<a name="line.44"></a>
-<span class="sourceLineNo">045</span><a name="line.45"></a>
-<span class="sourceLineNo">046</span>  protected AbstractPeerNoLockProcedure(String peerId) {<a name="line.46"></a>
-<span class="sourceLineNo">047</span>    this.peerId = peerId;<a name="line.47"></a>
+<span class="sourceLineNo">043</span>  protected String peerId;<a name="line.43"></a>
+<span class="sourceLineNo">044</span><a name="line.44"></a>
+<span class="sourceLineNo">045</span>  private RetryCounter retryCounter;<a name="line.45"></a>
+<span class="sourceLineNo">046</span><a name="line.46"></a>
+<span class="sourceLineNo">047</span>  protected AbstractPeerNoLockProcedure() {<a name="line.47"></a>
 <span class="sourceLineNo">048</span>  }<a name="line.48"></a>
 <span class="sourceLineNo">049</span><a name="line.49"></a>
-<span class="sourceLineNo">050</span>  @Override<a name="line.50"></a>
-<span class="sourceLineNo">051</span>  public String getPeerId() {<a name="line.51"></a>
-<span class="sourceLineNo">052</span>    return peerId;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>  }<a name="line.53"></a>
-<span class="sourceLineNo">054</span><a name="line.54"></a>
-<span class="sourceLineNo">055</span>  @Override<a name="line.55"></a>
-<span class="sourceLineNo">056</span>  protected boolean waitInitialized(MasterProcedureEnv env) {<a name="line.56"></a>
-<span class="sourceLineNo">057</span>    return env.waitInitialized(this);<a name="line.57"></a>
-<span class="sourceLineNo">058</span>  }<a name="line.58"></a>
-<span class="sourceLineNo">059</span><a name="line.59"></a>
-<span class="sourceLineNo">060</span>  @Override<a name="line.60"></a>
-<span class="sourceLineNo">061</span>  protected void rollbackState(MasterProcedureEnv env, TState state)<a name="line.61"></a>
-<span class="sourceLineNo">062</span>      throws IOException, InterruptedException {<a name="line.62"></a>
-<span class="sourceLineNo">063</span>    if (state == getInitialState()) {<a name="line.63"></a>
-<span class="sourceLineNo">064</span>      // actually the peer related operations has no rollback, but if we haven't done any<a name="line.64"></a>
-<span class="sourceLineNo">065</span>      // modifications on the peer storage yet, we can just return.<a name="line.65"></a>
-<span class="sourceLineNo">066</span>      return;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>    }<a name="line.67"></a>
-<span class="sourceLineNo">068</span>    throw new UnsupportedOperationException();<a name="line.68"></a>
-<span class="sourceLineNo">069</span>  }<a name="line.69"></a>
-<span class="sourceLineNo">070</span><a name="line.70"></a>
-<span class="sourceLineNo">071</span>  @Override<a name="line.71"></a>
-<span class="sourceLineNo">072</span>  protected void serializeStateData(ProcedureStateSerializer serializer) throws IOException {<a name="line.72"></a>
-<span class="sourceLineNo">073</span>    super.serializeStateData(serializer);<a name="line.73"></a>
-<span class="sourceLineNo">074</span>    serializer.serialize(PeerProcedureStateData.newBuilder().setPeerId(peerId).build());<a name="line.74"></a>
-<span class="sourceLineNo">075</span>  }<a name="line.75"></a>
-<span class="sourceLineNo">076</span><a name="line.76"></a>
-<span class="sourceLineNo">077</span>  @Override<a name="line.77"></a>
-<span class="sourceLineNo">078</span>  protected void deserializeStateData(ProcedureStateSerializer serializer) throws IOException {<a name="line.78"></a>
-<span class="sourceLineNo">079</span>    super.deserializeStateData(serializer);<a name="line.79"></a>
-<span class="sourceLineNo">080</span>    peerId = serializer.deserialize(PeerProcedureStateData.class).getPeerId();<a name="line.80"></a>
-<span class="sourceLineNo">081</span>  }<a name="line.81"></a>
-<span class="sourceLineNo">082</span><a name="line.82"></a>
-<span class="sourceLineNo">083</span>  @Override<a name="line.83"></a>
-<span class="sourceLineNo">084</span>  protected synchronized boolean setTimeoutFailure(MasterProcedureEnv env) {<a name="line.84"></a>
-<span class="sourceLineNo">085</span>    setState(ProcedureProtos.ProcedureState.RUNNABLE);<a name="line.85"></a>
-<span class="sourceLineNo">086</span>    env.getProcedureScheduler().addFront(this);<a name="line.86"></a>
-<span class="sourceLineNo">087</span>    return false;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>  }<a name="line.88"></a>
-<span class="sourceLineNo">089</span><a name="line.89"></a>
-<span class="sourceLineNo">090</span>  protected final ProcedureSuspendedException suspend(long backoff)<a name="line.90"></a>
-<span class="sourceLineNo">091</span>      throws ProcedureSuspendedException {<a name="line.91"></a>
-<span class="sourceLineNo">092</span>    attempts++;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>    setTimeout(Math.toIntExact(backoff));<a name="line.93"></a>
-<span class="sourceLineNo">094</span>    setState(ProcedureProtos.ProcedureState.WAITING_TIMEOUT);<a name="line.94"></a>
-<span class="sourceLineNo">095</span>    skipPersistence();<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    throw new ProcedureSuspendedException();<a name="line.96"></a>
-<span class="sourceLineNo">097</span>  }<a name="line.97"></a>
-<span class="sourceLineNo">098</span>}<a name="line.98"></a>
+<span class="sourceLineNo">050</span>  protected AbstractPeerNoLockProcedure(String peerId) {<a name="line.50"></a>
+<span class="sourceLineNo">051</span>    this.peerId = peerId;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>  }<a name="line.52"></a>
+<span class="sourceLineNo">053</span><a name="line.53"></a>
+<span class="sourceLineNo">054</span>  @Override<a name="line.54"></a>
+<span class="sourceLineNo">055</span>  public String getPeerId() {<a name="line.55"></a>
+<span class="sourceLineNo">056</span>    return peerId;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>  }<a name="line.57"></a>
+<span class="sourceLineNo">058</span><a name="line.58"></a>
+<span class="sourceLineNo">059</span>  @Override<a name="line.59"></a>
+<span class="sourceLineNo">060</span>  protected boolean waitInitialized(MasterProcedureEnv env) {<a name="line.60"></a>
+<span class="sourceLineNo">061</span>    return env.waitInitialized(this);<a name="line.61"></a>
+<span class="sourceLineNo">062</span>  }<a name="line.62"></a>
+<span class="sourceLineNo">063</span><a name="line.63"></a>
+<span class="sourceLineNo">064</span>  @Override<a name="line.64"></a>
+<span class="sourceLineNo">065</span>  protected void rollbackState(MasterProcedureEnv env, TState state)<a name="line.65"></a>
+<span class="sourceLineNo">066</span>      throws IOException, InterruptedException {<a name="line.66"></a>
+<span class="sourceLineNo">067</span>    if (state == getInitialState()) {<a name="line.67"></a>
+<span class="sourceLineNo">068</span>      // actually the peer related operations has no rollback, but if we haven't done any<a name="line.68"></a>
+<span class="sourceLineNo">069</span>      // modifications on the peer storage yet, we can just return.<a name="line.69"></a>
+<span class="sourceLineNo">070</span>      return;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>    }<a name="line.71"></a>
+<span class="sourceLineNo">072</span>    throw new UnsupportedOperationException();<a name="line.72"></a>
+<span class="sourceLineNo">073</span>  }<a name="line.73"></a>
+<span class="sourceLineNo">074</span><a name="line.74"></a>
+<span class="sourceLineNo">075</span>  @Override<a name="line.75"></a>
+<span class="sourceLineNo">076</span>  protected void serializeStateData(ProcedureStateSerializer serializer) throws IOException {<a name="line.76"></a>
+<span class="sourceLineNo">077</span>    super.serializeStateData(serializer);<a name="line.77"></a>
+<span class="sourceLineNo">078</span>    serializer.serialize(PeerProcedureStateData.newBuilder().setPeerId(peerId).build());<a name="line.78"></a>
+<span class="sourceLineNo">079</span>  }<a name="line.79"></a>
+<span class="sourceLineNo">080</span><a name="line.80"></a>
+<span class="sourceLineNo">081</span>  @Override<a name="line.81"></a>
+<span class="sourceLineNo">082</span>  protected void deserializeStateData(ProcedureStateSerializer serializer) throws IOException {<a name="line.82"></a>
+<span class="sourceLineNo">083</span>    super.deserializeStateData(serializer);<a name="line.83"></a>
+<span class="sourceLineNo">084</span>    peerId = serializer.deserialize(PeerProcedureStateData.class).getPeerId();<a name="line.84"></a>
+<span class="sourceLineNo">085</span>  }<a name="line.85"></a>
+<span class="sourceLineNo">086</span><a name="line.86"></a>
+<span class="sourceLineNo">087</span>  @Override<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  protected synchronized boolean setTimeoutFailure(MasterProcedureEnv env) {<a name="line.88"></a>
+<span class="sourceLineNo">089</span>    setState(ProcedureProtos.ProcedureState.RUNNABLE);<a name="line.89"></a>
+<span class="sourceLineNo">090</span>    env.getProcedureScheduler().addFront(this);<a name="line.90"></a>
+<span class="sourceLineNo">091</span>    return false;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>  }<a name="line.92"></a>
+<span class="sourceLineNo">093</span><a name="line.93"></a>
+<span class="sourceLineNo">094</span>  protected final ProcedureSuspendedException suspend(Configuration conf,<a name="line.94"></a>
+<span class="sourceLineNo">095</span>      LongConsumer backoffConsumer) throws ProcedureSuspendedException {<a name="line.95"></a>
+<span class="sourceLineNo">096</span>    if (retryCounter == null) {<a name="line.96"></a>
+<span class="sourceLineNo">097</span>      retryCounter = ProcedureUtil.createRetryCounter(conf);<a name="line.97"></a>
+<span class="sourceLineNo">098</span>    }<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    long backoff = retryCounter.getBackoffTimeAndIncrementAttempts();<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    backoffConsumer.accept(backoff);<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    setTimeout(Math.toIntExact(backoff));<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    setState(ProcedureProtos.ProcedureState.WAITING_TIMEOUT);<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    skipPersistence();<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    throw new ProcedureSuspendedException();<a name="line.104"></a>
+<span class="sourceLineNo">105</span>  }<a name="line.105"></a>
+<span class="sourceLineNo">106</span><a name="line.106"></a>
+<span class="sourceLineNo">107</span>  protected final void resetRetry() {<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    retryCounter = null;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>  }<a name="line.109"></a>
+<span class="sourceLineNo">110</span>}<a name="line.110"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/replication/ModifyPeerProcedure.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/replication/ModifyPeerProcedure.html
index 2b52e1c..924031e 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/replication/ModifyPeerProcedure.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/replication/ModifyPeerProcedure.html
@@ -36,249 +36,243 @@
 <span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.master.procedure.ProcedurePrepareLatch;<a name="line.28"></a>
 <span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.master.procedure.ReopenTableRegionsProcedure;<a name="line.29"></a>
 <span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.procedure2.ProcedureSuspendedException;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.procedure2.ProcedureUtil;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.replication.ReplicationException;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.replication.ReplicationPeerConfig;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.replication.ReplicationUtils;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.slf4j.Logger;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.slf4j.LoggerFactory;<a name="line.37"></a>
-<span class="sourceLineNo">038</span><a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.39"></a>
-<span class="sourceLineNo">040</span><a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.PeerModificationState;<a name="line.41"></a>
-<span class="sourceLineNo">042</span><a name="line.42"></a>
-<span class="sourceLineNo">043</span>/**<a name="line.43"></a>
-<span class="sourceLineNo">044</span> * The base class for all replication peer related procedure except sync replication state<a name="line.44"></a>
-<span class="sourceLineNo">045</span> * transition.<a name="line.45"></a>
-<span class="sourceLineNo">046</span> */<a name="line.46"></a>
-<span class="sourceLineNo">047</span>@InterfaceAudience.Private<a name="line.47"></a>
-<span class="sourceLineNo">048</span>public abstract class ModifyPeerProcedure extends AbstractPeerProcedure&lt;PeerModificationState&gt; {<a name="line.48"></a>
-<span class="sourceLineNo">049</span><a name="line.49"></a>
-<span class="sourceLineNo">050</span>  private static final Logger LOG = LoggerFactory.getLogger(ModifyPeerProcedure.class);<a name="line.50"></a>
-<span class="sourceLineNo">051</span><a name="line.51"></a>
-<span class="sourceLineNo">052</span>  protected ModifyPeerProcedure() {<a name="line.52"></a>
-<span class="sourceLineNo">053</span>  }<a name="line.53"></a>
-<span class="sourceLineNo">054</span><a name="line.54"></a>
-<span class="sourceLineNo">055</span>  protected ModifyPeerProcedure(String peerId) {<a name="line.55"></a>
-<span class="sourceLineNo">056</span>    super(peerId);<a name="line.56"></a>
-<span class="sourceLineNo">057</span>  }<a name="line.57"></a>
-<span class="sourceLineNo">058</span><a name="line.58"></a>
-<span class="sourceLineNo">059</span>  /**<a name="line.59"></a>
-<span class="sourceLineNo">060</span>   * Called before we start the actual processing. The implementation should call the pre CP hook,<a name="line.60"></a>
-<span class="sourceLineNo">061</span>   * and also the pre-check for the peer modification.<a name="line.61"></a>
-<span class="sourceLineNo">062</span>   * &lt;p&gt;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>   * If an IOException is thrown then we will give up and mark the procedure as failed directly. If<a name="line.63"></a>
-<span class="sourceLineNo">064</span>   * all checks passes then the procedure can not be rolled back any more.<a name="line.64"></a>
-<span class="sourceLineNo">065</span>   */<a name="line.65"></a>
-<span class="sourceLineNo">066</span>  protected abstract void prePeerModification(MasterProcedureEnv env)<a name="line.66"></a>
-<span class="sourceLineNo">067</span>      throws IOException, ReplicationException, InterruptedException;<a name="line.67"></a>
-<span class="sourceLineNo">068</span><a name="line.68"></a>
-<span class="sourceLineNo">069</span>  protected abstract void updatePeerStorage(MasterProcedureEnv env) throws ReplicationException;<a name="line.69"></a>
-<span class="sourceLineNo">070</span><a name="line.70"></a>
-<span class="sourceLineNo">071</span>  /**<a name="line.71"></a>
-<span class="sourceLineNo">072</span>   * Called before we finish the procedure. The implementation can do some logging work, and also<a name="line.72"></a>
-<span class="sourceLineNo">073</span>   * call the coprocessor hook if any.<a name="line.73"></a>
-<span class="sourceLineNo">074</span>   * &lt;p&gt;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>   * Notice that, since we have already done the actual work, throwing {@code IOException} here will<a name="line.75"></a>
-<span class="sourceLineNo">076</span>   * not fail this procedure, we will just ignore it and finish the procedure as suceeded. If<a name="line.76"></a>
-<span class="sourceLineNo">077</span>   * {@code ReplicationException} is thrown we will retry since this usually means we fails to<a name="line.77"></a>
-<span class="sourceLineNo">078</span>   * update the peer storage.<a name="line.78"></a>
-<span class="sourceLineNo">079</span>   */<a name="line.79"></a>
-<span class="sourceLineNo">080</span>  protected abstract void postPeerModification(MasterProcedureEnv env)<a name="line.80"></a>
-<span class="sourceLineNo">081</span>      throws IOException, ReplicationException;<a name="line.81"></a>
-<span class="sourceLineNo">082</span><a name="line.82"></a>
-<span class="sourceLineNo">083</span>  protected void releaseLatch(MasterProcedureEnv env) {<a name="line.83"></a>
-<span class="sourceLineNo">084</span>    ProcedurePrepareLatch.releaseLatch(latch, this);<a name="line.84"></a>
-<span class="sourceLineNo">085</span>  }<a name="line.85"></a>
-<span class="sourceLineNo">086</span><a name="line.86"></a>
-<span class="sourceLineNo">087</span>  /**<a name="line.87"></a>
-<span class="sourceLineNo">088</span>   * Implementation class can override this method. By default we will jump to<a name="line.88"></a>
-<span class="sourceLineNo">089</span>   * POST_PEER_MODIFICATION and finish the procedure.<a name="line.89"></a>
-<span class="sourceLineNo">090</span>   */<a name="line.90"></a>
-<span class="sourceLineNo">091</span>  protected PeerModificationState nextStateAfterRefresh() {<a name="line.91"></a>
-<span class="sourceLineNo">092</span>    return PeerModificationState.POST_PEER_MODIFICATION;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>  }<a name="line.93"></a>
-<span class="sourceLineNo">094</span><a name="line.94"></a>
-<span class="sourceLineNo">095</span>  /**<a name="line.95"></a>
-<span class="sourceLineNo">096</span>   * The implementation class should override this method if the procedure may enter the serial<a name="line.96"></a>
-<span class="sourceLineNo">097</span>   * related states.<a name="line.97"></a>
-<span class="sourceLineNo">098</span>   */<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  protected boolean enablePeerBeforeFinish() {<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    throw new UnsupportedOperationException();<a name="line.100"></a>
-<span class="sourceLineNo">101</span>  }<a name="line.101"></a>
-<span class="sourceLineNo">102</span><a name="line.102"></a>
-<span class="sourceLineNo">103</span>  protected ReplicationPeerConfig getOldPeerConfig() {<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    return null;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>  }<a name="line.105"></a>
-<span class="sourceLineNo">106</span><a name="line.106"></a>
-<span class="sourceLineNo">107</span>  protected ReplicationPeerConfig getNewPeerConfig() {<a name="line.107"></a>
-<span class="sourceLineNo">108</span>    throw new UnsupportedOperationException();<a name="line.108"></a>
-<span class="sourceLineNo">109</span>  }<a name="line.109"></a>
-<span class="sourceLineNo">110</span><a name="line.110"></a>
-<span class="sourceLineNo">111</span>  protected void updateLastPushedSequenceIdForSerialPeer(MasterProcedureEnv env)<a name="line.111"></a>
-<span class="sourceLineNo">112</span>      throws IOException, ReplicationException {<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    throw new UnsupportedOperationException();<a name="line.113"></a>
-<span class="sourceLineNo">114</span>  }<a name="line.114"></a>
-<span class="sourceLineNo">115</span><a name="line.115"></a>
-<span class="sourceLineNo">116</span>  // If the table is in enabling state, we need to wait until it is enabled and then reopen all its<a name="line.116"></a>
-<span class="sourceLineNo">117</span>  // regions.<a name="line.117"></a>
-<span class="sourceLineNo">118</span>  private boolean needReopen(TableStateManager tsm, TableName tn) throws IOException {<a name="line.118"></a>
-<span class="sourceLineNo">119</span>    for (;;) {<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      try {<a name="line.120"></a>
-<span class="sourceLineNo">121</span>        TableState state = tsm.getTableState(tn);<a name="line.121"></a>
-<span class="sourceLineNo">122</span>        if (state.isEnabled()) {<a name="line.122"></a>
-<span class="sourceLineNo">123</span>          return true;<a name="line.123"></a>
-<span class="sourceLineNo">124</span>        }<a name="line.124"></a>
-<span class="sourceLineNo">125</span>        if (!state.isEnabling()) {<a name="line.125"></a>
-<span class="sourceLineNo">126</span>          return false;<a name="line.126"></a>
-<span class="sourceLineNo">127</span>        }<a name="line.127"></a>
-<span class="sourceLineNo">128</span>        Thread.sleep(SLEEP_INTERVAL_MS);<a name="line.128"></a>
-<span class="sourceLineNo">129</span>      } catch (TableStateNotFoundException e) {<a name="line.129"></a>
-<span class="sourceLineNo">130</span>        return false;<a name="line.130"></a>
-<span class="sourceLineNo">131</span>      } catch (InterruptedException e) {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>        throw (IOException) new InterruptedIOException(e.getMessage()).initCause(e);<a name="line.132"></a>
-<span class="sourceLineNo">133</span>      }<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    }<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  }<a name="line.135"></a>
-<span class="sourceLineNo">136</span><a name="line.136"></a>
-<span class="sourceLineNo">137</span>  // will be override in test to simulate error<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  @VisibleForTesting<a name="line.138"></a>
-<span class="sourceLineNo">139</span>  protected void reopenRegions(MasterProcedureEnv env) throws IOException {<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    ReplicationPeerConfig peerConfig = getNewPeerConfig();<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    ReplicationPeerConfig oldPeerConfig = getOldPeerConfig();<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    TableStateManager tsm = env.getMasterServices().getTableStateManager();<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    for (TableDescriptor td : env.getMasterServices().getTableDescriptors().getAll().values()) {<a name="line.143"></a>
-<span class="sourceLineNo">144</span>      if (!td.hasGlobalReplicationScope()) {<a name="line.144"></a>
-<span class="sourceLineNo">145</span>        continue;<a name="line.145"></a>
-<span class="sourceLineNo">146</span>      }<a name="line.146"></a>
-<span class="sourceLineNo">147</span>      TableName tn = td.getTableName();<a name="line.147"></a>
-<span class="sourceLineNo">148</span>      if (!ReplicationUtils.contains(peerConfig, tn)) {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>        continue;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>      }<a name="line.150"></a>
-<span class="sourceLineNo">151</span>      if (oldPeerConfig != null &amp;&amp; oldPeerConfig.isSerial() &amp;&amp;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>        ReplicationUtils.contains(oldPeerConfig, tn)) {<a name="line.152"></a>
-<span class="sourceLineNo">153</span>        continue;<a name="line.153"></a>
-<span class="sourceLineNo">154</span>      }<a name="line.154"></a>
-<span class="sourceLineNo">155</span>      if (needReopen(tsm, tn)) {<a name="line.155"></a>
-<span class="sourceLineNo">156</span>        addChildProcedure(new ReopenTableRegionsProcedure(tn));<a name="line.156"></a>
-<span class="sourceLineNo">157</span>      }<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    }<a name="line.158"></a>
-<span class="sourceLineNo">159</span>  }<a name="line.159"></a>
-<span class="sourceLineNo">160</span><a name="line.160"></a>
-<span class="sourceLineNo">161</span>  @Override<a name="line.161"></a>
-<span class="sourceLineNo">162</span>  protected Flow executeFromState(MasterProcedureEnv env, PeerModificationState state)<a name="line.162"></a>
-<span class="sourceLineNo">163</span>      throws ProcedureSuspendedException, InterruptedException {<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    switch (state) {<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      case PRE_PEER_MODIFICATION:<a name="line.165"></a>
-<span class="sourceLineNo">166</span>        try {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>          prePeerModification(env);<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        } catch (IOException e) {<a name="line.168"></a>
-<span class="sourceLineNo">169</span>          LOG.warn("{} failed to call pre CP hook or the pre check is failed for peer {}, " +<a name="line.169"></a>
-<span class="sourceLineNo">170</span>            "mark the procedure as failure and give up", getClass().getName(), peerId, e);<a name="line.170"></a>
-<span class="sourceLineNo">171</span>          setFailure("master-" + getPeerOperationType().name().toLowerCase() + "-peer", e);<a name="line.171"></a>
-<span class="sourceLineNo">172</span>          releaseLatch(env);<a name="line.172"></a>
-<span class="sourceLineNo">173</span>          return Flow.NO_MORE_STATE;<a name="line.173"></a>
-<span class="sourceLineNo">174</span>        } catch (ReplicationException e) {<a name="line.174"></a>
-<span class="sourceLineNo">175</span>          long backoff = ProcedureUtil.getBackoffTimeMs(attempts);<a name="line.175"></a>
-<span class="sourceLineNo">176</span>          LOG.warn("{} failed to call prePeerModification for peer {}, sleep {} secs",<a name="line.176"></a>
-<span class="sourceLineNo">177</span>            getClass().getName(), peerId, backoff / 1000, e);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>          throw suspend(backoff);<a name="line.178"></a>
-<span class="sourceLineNo">179</span>        }<a name="line.179"></a>
-<span class="sourceLineNo">180</span>        attempts = 0;<a name="line.180"></a>
-<span class="sourceLineNo">181</span>        setNextState(PeerModificationState.UPDATE_PEER_STORAGE);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>        return Flow.HAS_MORE_STATE;<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      case UPDATE_PEER_STORAGE:<a name="line.183"></a>
-<span class="sourceLineNo">184</span>        try {<a name="line.184"></a>
-<span class="sourceLineNo">185</span>          updatePeerStorage(env);<a name="line.185"></a>
-<span class="sourceLineNo">186</span>        } catch (ReplicationException e) {<a name="line.186"></a>
-<span class="sourceLineNo">187</span>          long backoff = ProcedureUtil.getBackoffTimeMs(attempts);<a name="line.187"></a>
-<span class="sourceLineNo">188</span>          LOG.warn("{} update peer storage for peer {} failed, sleep {} secs", getClass().getName(),<a name="line.188"></a>
-<span class="sourceLineNo">189</span>            peerId, backoff / 1000, e);<a name="line.189"></a>
-<span class="sourceLineNo">190</span>          throw suspend(backoff);<a name="line.190"></a>
-<span class="sourceLineNo">191</span>        }<a name="line.191"></a>
-<span class="sourceLineNo">192</span>        attempts = 0;<a name="line.192"></a>
-<span class="sourceLineNo">193</span>        setNextState(PeerModificationState.REFRESH_PEER_ON_RS);<a name="line.193"></a>
-<span class="sourceLineNo">194</span>        return Flow.HAS_MORE_STATE;<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      case REFRESH_PEER_ON_RS:<a name="line.195"></a>
-<span class="sourceLineNo">196</span>        refreshPeer(env, getPeerOperationType());<a name="line.196"></a>
-<span class="sourceLineNo">197</span>        setNextState(nextStateAfterRefresh());<a name="line.197"></a>
-<span class="sourceLineNo">198</span>        return Flow.HAS_MORE_STATE;<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      case SERIAL_PEER_REOPEN_REGIONS:<a name="line.199"></a>
-<span class="sourceLineNo">200</span>        try {<a name="line.200"></a>
-<span class="sourceLineNo">201</span>          reopenRegions(env);<a name="line.201"></a>
-<span class="sourceLineNo">202</span>        } catch (Exception e) {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>          long backoff = ProcedureUtil.getBackoffTimeMs(attempts);<a name="line.203"></a>
-<span class="sourceLineNo">204</span>          LOG.warn("{} reopen regions for peer {} failed,  sleep {} secs", getClass().getName(),<a name="line.204"></a>
-<span class="sourceLineNo">205</span>            peerId, backoff / 1000, e);<a name="line.205"></a>
-<span class="sourceLineNo">206</span>          throw suspend(backoff);<a name="line.206"></a>
-<span class="sourceLineNo">207</span>        }<a name="line.207"></a>
-<span class="sourceLineNo">208</span>        attempts = 0;<a name="line.208"></a>
-<span class="sourceLineNo">209</span>        setNextState(PeerModificationState.SERIAL_PEER_UPDATE_LAST_PUSHED_SEQ_ID);<a name="line.209"></a>
-<span class="sourceLineNo">210</span>        return Flow.HAS_MORE_STATE;<a name="line.210"></a>
-<span class="sourceLineNo">211</span>      case SERIAL_PEER_UPDATE_LAST_PUSHED_SEQ_ID:<a name="line.211"></a>
-<span class="sourceLineNo">212</span>        try {<a name="line.212"></a>
-<span class="sourceLineNo">213</span>          updateLastPushedSequenceIdForSerialPeer(env);<a name="line.213"></a>
-<span class="sourceLineNo">214</span>        } catch (Exception e) {<a name="line.214"></a>
-<span class="sourceLineNo">215</span>          long backoff = ProcedureUtil.getBackoffTimeMs(attempts);<a name="line.215"></a>
-<span class="sourceLineNo">216</span>          LOG.warn("{} set last sequence id for peer {} failed,  sleep {} secs",<a name="line.216"></a>
-<span class="sourceLineNo">217</span>            getClass().getName(), peerId, backoff / 1000, e);<a name="line.217"></a>
-<span class="sourceLineNo">218</span>          throw suspend(backoff);<a name="line.218"></a>
-<span class="sourceLineNo">219</span>        }<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        attempts = 0;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>        setNextState(enablePeerBeforeFinish() ? PeerModificationState.SERIAL_PEER_SET_PEER_ENABLED<a name="line.221"></a>
-<span class="sourceLineNo">222</span>          : PeerModificationState.POST_PEER_MODIFICATION);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>        return Flow.HAS_MORE_STATE;<a name="line.223"></a>
-<span class="sourceLineNo">224</span>      case SERIAL_PEER_SET_PEER_ENABLED:<a name="line.224"></a>
-<span class="sourceLineNo">225</span>        try {<a name="line.225"></a>
-<span class="sourceLineNo">226</span>          enablePeer(env);<a name="line.226"></a>
-<span class="sourceLineNo">227</span>        } catch (ReplicationException e) {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>          long backoff = ProcedureUtil.getBackoffTimeMs(attempts);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>          LOG.warn("{} enable peer before finish for peer {} failed,  sleep {} secs",<a name="line.229"></a>
-<span class="sourceLineNo">230</span>            getClass().getName(), peerId, backoff / 1000, e);<a name="line.230"></a>
-<span class="sourceLineNo">231</span>          throw suspend(backoff);<a name="line.231"></a>
-<span class="sourceLineNo">232</span>        }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>        attempts = 0;<a name="line.233"></a>
-<span class="sourceLineNo">234</span>        setNextState(PeerModificationState.SERIAL_PEER_ENABLE_PEER_REFRESH_PEER_ON_RS);<a name="line.234"></a>
-<span class="sourceLineNo">235</span>        return Flow.HAS_MORE_STATE;<a name="line.235"></a>
-<span class="sourceLineNo">236</span>      case SERIAL_PEER_ENABLE_PEER_REFRESH_PEER_ON_RS:<a name="line.236"></a>
-<span class="sourceLineNo">237</span>        refreshPeer(env, PeerOperationType.ENABLE);<a name="line.237"></a>
-<span class="sourceLineNo">238</span>        setNextState(PeerModificationState.POST_PEER_MODIFICATION);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>        return Flow.HAS_MORE_STATE;<a name="line.239"></a>
-<span class="sourceLineNo">240</span>      case POST_PEER_MODIFICATION:<a name="line.240"></a>
-<span class="sourceLineNo">241</span>        try {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>          postPeerModification(env);<a name="line.242"></a>
-<span class="sourceLineNo">243</span>        } catch (ReplicationException e) {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>          long backoff = ProcedureUtil.getBackoffTimeMs(attempts);<a name="line.244"></a>
-<span class="sourceLineNo">245</span>          LOG.warn("{} failed to call postPeerModification for peer {},  sleep {} secs",<a name="line.245"></a>
-<span class="sourceLineNo">246</span>            getClass().getName(), peerId, backoff / 1000, e);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>          throw suspend(backoff);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>        } catch (IOException e) {<a name="line.248"></a>
-<span class="sourceLineNo">249</span>          LOG.warn("{} failed to call post CP hook for peer {}, " +<a name="line.249"></a>
-<span class="sourceLineNo">250</span>            "ignore since the procedure has already done", getClass().getName(), peerId, e);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>        }<a name="line.251"></a>
-<span class="sourceLineNo">252</span>        releaseLatch(env);<a name="line.252"></a>
-<span class="sourceLineNo">253</span>        return Flow.NO_MORE_STATE;<a name="line.253"></a>
-<span class="sourceLineNo">254</span>      default:<a name="line.254"></a>
-<span class="sourceLineNo">255</span>        throw new UnsupportedOperationException("unhandled state=" + state);<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>  @Override<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  protected PeerModificationState getState(int stateId) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    return PeerModificationState.forNumber(stateId);<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>  @Override<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  protected int getStateId(PeerModificationState state) {<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    return state.getNumber();<a name="line.266"></a>
-<span class="sourceLineNo">267</span>  }<a name="line.267"></a>
-<span class="sourceLineNo">268</span><a name="line.268"></a>
-<span class="sourceLineNo">269</span>  @Override<a name="line.269"></a>
-<span class="sourceLineNo">270</span>  protected PeerModificationState getInitialState() {<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    return PeerModificationState.PRE_PEER_MODIFICATION;<a name="line.271"></a>
-<span class="sourceLineNo">272</span>  }<a name="line.272"></a>
-<span class="sourceLineNo">273</span>}<a name="line.273"></a>
+<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.replication.ReplicationException;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.replication.ReplicationPeerConfig;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.replication.ReplicationUtils;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.slf4j.Logger;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.slf4j.LoggerFactory;<a name="line.36"></a>
+<span class="sourceLineNo">037</span><a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.38"></a>
+<span class="sourceLineNo">039</span><a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.PeerModificationState;<a name="line.40"></a>
+<span class="sourceLineNo">041</span><a name="line.41"></a>
+<span class="sourceLineNo">042</span>/**<a name="line.42"></a>
+<span class="sourceLineNo">043</span> * The base class for all replication peer related procedure except sync replication state<a name="line.43"></a>
+<span class="sourceLineNo">044</span> * transition.<a name="line.44"></a>
+<span class="sourceLineNo">045</span> */<a name="line.45"></a>
+<span class="sourceLineNo">046</span>@InterfaceAudience.Private<a name="line.46"></a>
+<span class="sourceLineNo">047</span>public abstract class ModifyPeerProcedure extends AbstractPeerProcedure&lt;PeerModificationState&gt; {<a name="line.47"></a>
+<span class="sourceLineNo">048</span><a name="line.48"></a>
+<span class="sourceLineNo">049</span>  private static final Logger LOG = LoggerFactory.getLogger(ModifyPeerProcedure.class);<a name="line.49"></a>
+<span class="sourceLineNo">050</span><a name="line.50"></a>
+<span class="sourceLineNo">051</span>  protected ModifyPeerProcedure() {<a name="line.51"></a>
+<span class="sourceLineNo">052</span>  }<a name="line.52"></a>
+<span class="sourceLineNo">053</span><a name="line.53"></a>
+<span class="sourceLineNo">054</span>  protected ModifyPeerProcedure(String peerId) {<a name="line.54"></a>
+<span class="sourceLineNo">055</span>    super(peerId);<a name="line.55"></a>
+<span class="sourceLineNo">056</span>  }<a name="line.56"></a>
+<span class="sourceLineNo">057</span><a name="line.57"></a>
+<span class="sourceLineNo">058</span>  /**<a name="line.58"></a>
+<span class="sourceLineNo">059</span>   * Called before we start the actual processing. The implementation should call the pre CP hook,<a name="line.59"></a>
+<span class="sourceLineNo">060</span>   * and also the pre-check for the peer modification.<a name="line.60"></a>
+<span class="sourceLineNo">061</span>   * &lt;p&gt;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>   * If an IOException is thrown then we will give up and mark the procedure as failed directly. If<a name="line.62"></a>
+<span class="sourceLineNo">063</span>   * all checks passes then the procedure can not be rolled back any more.<a name="line.63"></a>
+<span class="sourceLineNo">064</span>   */<a name="line.64"></a>
+<span class="sourceLineNo">065</span>  protected abstract void prePeerModification(MasterProcedureEnv env)<a name="line.65"></a>
+<span class="sourceLineNo">066</span>      throws IOException, ReplicationException, InterruptedException;<a name="line.66"></a>
+<span class="sourceLineNo">067</span><a name="line.67"></a>
+<span class="sourceLineNo">068</span>  protected abstract void updatePeerStorage(MasterProcedureEnv env) throws ReplicationException;<a name="line.68"></a>
+<span class="sourceLineNo">069</span><a name="line.69"></a>
+<span class="sourceLineNo">070</span>  /**<a name="line.70"></a>
+<span class="sourceLineNo">071</span>   * Called before we finish the procedure. The implementation can do some logging work, and also<a name="line.71"></a>
+<span class="sourceLineNo">072</span>   * call the coprocessor hook if any.<a name="line.72"></a>
+<span class="sourceLineNo">073</span>   * &lt;p&gt;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>   * Notice that, since we have already done the actual work, throwing {@code IOException} here will<a name="line.74"></a>
+<span class="sourceLineNo">075</span>   * not fail this procedure, we will just ignore it and finish the procedure as suceeded. If<a name="line.75"></a>
+<span class="sourceLineNo">076</span>   * {@code ReplicationException} is thrown we will retry since this usually means we fails to<a name="line.76"></a>
+<span class="sourceLineNo">077</span>   * update the peer storage.<a name="line.77"></a>
+<span class="sourceLineNo">078</span>   */<a name="line.78"></a>
+<span class="sourceLineNo">079</span>  protected abstract void postPeerModification(MasterProcedureEnv env)<a name="line.79"></a>
+<span class="sourceLineNo">080</span>      throws IOException, ReplicationException;<a name="line.80"></a>
+<span class="sourceLineNo">081</span><a name="line.81"></a>
+<span class="sourceLineNo">082</span>  protected void releaseLatch(MasterProcedureEnv env) {<a name="line.82"></a>
+<span class="sourceLineNo">083</span>    ProcedurePrepareLatch.releaseLatch(latch, this);<a name="line.83"></a>
+<span class="sourceLineNo">084</span>  }<a name="line.84"></a>
+<span class="sourceLineNo">085</span><a name="line.85"></a>
+<span class="sourceLineNo">086</span>  /**<a name="line.86"></a>
+<span class="sourceLineNo">087</span>   * Implementation class can override this method. By default we will jump to<a name="line.87"></a>
+<span class="sourceLineNo">088</span>   * POST_PEER_MODIFICATION and finish the procedure.<a name="line.88"></a>
+<span class="sourceLineNo">089</span>   */<a name="line.89"></a>
+<span class="sourceLineNo">090</span>  protected PeerModificationState nextStateAfterRefresh() {<a name="line.90"></a>
+<span class="sourceLineNo">091</span>    return PeerModificationState.POST_PEER_MODIFICATION;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>  }<a name="line.92"></a>
+<span class="sourceLineNo">093</span><a name="line.93"></a>
+<span class="sourceLineNo">094</span>  /**<a name="line.94"></a>
+<span class="sourceLineNo">095</span>   * The implementation class should override this method if the procedure may enter the serial<a name="line.95"></a>
+<span class="sourceLineNo">096</span>   * related states.<a name="line.96"></a>
+<span class="sourceLineNo">097</span>   */<a name="line.97"></a>
+<span class="sourceLineNo">098</span>  protected boolean enablePeerBeforeFinish() {<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    throw new UnsupportedOperationException();<a name="line.99"></a>
+<span class="sourceLineNo">100</span>  }<a name="line.100"></a>
+<span class="sourceLineNo">101</span><a name="line.101"></a>
+<span class="sourceLineNo">102</span>  protected ReplicationPeerConfig getOldPeerConfig() {<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    return null;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>  }<a name="line.104"></a>
+<span class="sourceLineNo">105</span><a name="line.105"></a>
+<span class="sourceLineNo">106</span>  protected ReplicationPeerConfig getNewPeerConfig() {<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    throw new UnsupportedOperationException();<a name="line.107"></a>
+<span class="sourceLineNo">108</span>  }<a name="line.108"></a>
+<span class="sourceLineNo">109</span><a name="line.109"></a>
+<span class="sourceLineNo">110</span>  protected void updateLastPushedSequenceIdForSerialPeer(MasterProcedureEnv env)<a name="line.110"></a>
+<span class="sourceLineNo">111</span>      throws IOException, ReplicationException {<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    throw new UnsupportedOperationException();<a name="line.112"></a>
+<span class="sourceLineNo">113</span>  }<a name="line.113"></a>
+<span class="sourceLineNo">114</span><a name="line.114"></a>
+<span class="sourceLineNo">115</span>  // If the table is in enabling state, we need to wait until it is enabled and then reopen all its<a name="line.115"></a>
+<span class="sourceLineNo">116</span>  // regions.<a name="line.116"></a>
+<span class="sourceLineNo">117</span>  private boolean needReopen(TableStateManager tsm, TableName tn) throws IOException {<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    for (;;) {<a name="line.118"></a>
+<span class="sourceLineNo">119</span>      try {<a name="line.119"></a>
+<span class="sourceLineNo">120</span>        TableState state = tsm.getTableState(tn);<a name="line.120"></a>
+<span class="sourceLineNo">121</span>        if (state.isEnabled()) {<a name="line.121"></a>
+<span class="sourceLineNo">122</span>          return true;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>        }<a name="line.123"></a>
+<span class="sourceLineNo">124</span>        if (!state.isEnabling()) {<a name="line.124"></a>
+<span class="sourceLineNo">125</span>          return false;<a name="line.125"></a>
+<span class="sourceLineNo">126</span>        }<a name="line.126"></a>
+<span class="sourceLineNo">127</span>        Thread.sleep(SLEEP_INTERVAL_MS);<a name="line.127"></a>
+<span class="sourceLineNo">128</span>      } catch (TableStateNotFoundException e) {<a name="line.128"></a>
+<span class="sourceLineNo">129</span>        return false;<a name="line.129"></a>
+<span class="sourceLineNo">130</span>      } catch (InterruptedException e) {<a name="line.130"></a>
+<span class="sourceLineNo">131</span>        throw (IOException) new InterruptedIOException(e.getMessage()).initCause(e);<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      }<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    }<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  }<a name="line.134"></a>
+<span class="sourceLineNo">135</span><a name="line.135"></a>
+<span class="sourceLineNo">136</span>  // will be override in test to simulate error<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  @VisibleForTesting<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  protected void reopenRegions(MasterProcedureEnv env) throws IOException {<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    ReplicationPeerConfig peerConfig = getNewPeerConfig();<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    ReplicationPeerConfig oldPeerConfig = getOldPeerConfig();<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    TableStateManager tsm = env.getMasterServices().getTableStateManager();<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    for (TableDescriptor td : env.getMasterServices().getTableDescriptors().getAll().values()) {<a name="line.142"></a>
+<span class="sourceLineNo">143</span>      if (!td.hasGlobalReplicationScope()) {<a name="line.143"></a>
+<span class="sourceLineNo">144</span>        continue;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>      }<a name="line.145"></a>
+<span class="sourceLineNo">146</span>      TableName tn = td.getTableName();<a name="line.146"></a>
+<span class="sourceLineNo">147</span>      if (!ReplicationUtils.contains(peerConfig, tn)) {<a name="line.147"></a>
+<span class="sourceLineNo">148</span>        continue;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      }<a name="line.149"></a>
+<span class="sourceLineNo">150</span>      if (oldPeerConfig != null &amp;&amp; oldPeerConfig.isSerial() &amp;&amp;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>        ReplicationUtils.contains(oldPeerConfig, tn)) {<a name="line.151"></a>
+<span class="sourceLineNo">152</span>        continue;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>      }<a name="line.153"></a>
+<span class="sourceLineNo">154</span>      if (needReopen(tsm, tn)) {<a name="line.154"></a>
+<span class="sourceLineNo">155</span>        addChildProcedure(new ReopenTableRegionsProcedure(tn));<a name="line.155"></a>
+<span class="sourceLineNo">156</span>      }<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    }<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  }<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  @Override<a name="line.160"></a>
+<span class="sourceLineNo">161</span>  protected Flow executeFromState(MasterProcedureEnv env, PeerModificationState state)<a name="line.161"></a>
+<span class="sourceLineNo">162</span>      throws ProcedureSuspendedException, InterruptedException {<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    switch (state) {<a name="line.163"></a>
+<span class="sourceLineNo">164</span>      case PRE_PEER_MODIFICATION:<a name="line.164"></a>
+<span class="sourceLineNo">165</span>        try {<a name="line.165"></a>
+<span class="sourceLineNo">166</span>          prePeerModification(env);<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        } catch (IOException e) {<a name="line.167"></a>
+<span class="sourceLineNo">168</span>          LOG.warn("{} failed to call pre CP hook or the pre check is failed for peer {}, " +<a name="line.168"></a>
+<span class="sourceLineNo">169</span>            "mark the procedure as failure and give up", getClass().getName(), peerId, e);<a name="line.169"></a>
+<span class="sourceLineNo">170</span>          setFailure("master-" + getPeerOperationType().name().toLowerCase() + "-peer", e);<a name="line.170"></a>
+<span class="sourceLineNo">171</span>          releaseLatch(env);<a name="line.171"></a>
+<span class="sourceLineNo">172</span>          return Flow.NO_MORE_STATE;<a name="line.172"></a>
+<span class="sourceLineNo">173</span>        } catch (ReplicationException e) {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>          throw suspend(env.getMasterConfiguration(),<a name="line.174"></a>
+<span class="sourceLineNo">175</span>            backoff -&gt; LOG.warn("{} failed to call prePeerModification for peer {}, sleep {} secs",<a name="line.175"></a>
+<span class="sourceLineNo">176</span>              getClass().getName(), peerId, backoff / 1000, e));<a name="line.176"></a>
+<span class="sourceLineNo">177</span>        }<a name="line.177"></a>
+<span class="sourceLineNo">178</span>        resetRetry();<a name="line.178"></a>
+<span class="sourceLineNo">179</span>        setNextState(PeerModificationState.UPDATE_PEER_STORAGE);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>        return Flow.HAS_MORE_STATE;<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      case UPDATE_PEER_STORAGE:<a name="line.181"></a>
+<span class="sourceLineNo">182</span>        try {<a name="line.182"></a>
+<span class="sourceLineNo">183</span>          updatePeerStorage(env);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>        } catch (ReplicationException e) {<a name="line.184"></a>
+<span class="sourceLineNo">185</span>          throw suspend(env.getMasterConfiguration(),<a name="line.185"></a>
+<span class="sourceLineNo">186</span>            backoff -&gt; LOG.warn("{} update peer storage for peer {} failed, sleep {} secs",<a name="line.186"></a>
+<span class="sourceLineNo">187</span>              getClass().getName(), peerId, backoff / 1000, e));<a name="line.187"></a>
+<span class="sourceLineNo">188</span>        }<a name="line.188"></a>
+<span class="sourceLineNo">189</span>        resetRetry();<a name="line.189"></a>
+<span class="sourceLineNo">190</span>        setNextState(PeerModificationState.REFRESH_PEER_ON_RS);<a name="line.190"></a>
+<span class="sourceLineNo">191</span>        return Flow.HAS_MORE_STATE;<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      case REFRESH_PEER_ON_RS:<a name="line.192"></a>
+<span class="sourceLineNo">193</span>        refreshPeer(env, getPeerOperationType());<a name="line.193"></a>
+<span class="sourceLineNo">194</span>        setNextState(nextStateAfterRefresh());<a name="line.194"></a>
+<span class="sourceLineNo">195</span>        return Flow.HAS_MORE_STATE;<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      case SERIAL_PEER_REOPEN_REGIONS:<a name="line.196"></a>
+<span class="sourceLineNo">197</span>        try {<a name="line.197"></a>
+<span class="sourceLineNo">198</span>          reopenRegions(env);<a name="line.198"></a>
+<span class="sourceLineNo">199</span>        } catch (Exception e) {<a name="line.199"></a>
+<span class="sourceLineNo">200</span>          throw suspend(env.getMasterConfiguration(),<a name="line.200"></a>
+<span class="sourceLineNo">201</span>            backoff -&gt; LOG.warn("{} reopen regions for peer {} failed,  sleep {} secs",<a name="line.201"></a>
+<span class="sourceLineNo">202</span>              getClass().getName(), peerId, backoff / 1000, e));<a name="line.202"></a>
+<span class="sourceLineNo">203</span>        }<a name="line.203"></a>
+<span class="sourceLineNo">204</span>        resetRetry();<a name="line.204"></a>
+<span class="sourceLineNo">205</span>        setNextState(PeerModificationState.SERIAL_PEER_UPDATE_LAST_PUSHED_SEQ_ID);<a name="line.205"></a>
+<span class="sourceLineNo">206</span>        return Flow.HAS_MORE_STATE;<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      case SERIAL_PEER_UPDATE_LAST_PUSHED_SEQ_ID:<a name="line.207"></a>
+<span class="sourceLineNo">208</span>        try {<a name="line.208"></a>
+<span class="sourceLineNo">209</span>          updateLastPushedSequenceIdForSerialPeer(env);<a name="line.209"></a>
+<span class="sourceLineNo">210</span>        } catch (Exception e) {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>          throw suspend(env.getMasterConfiguration(),<a name="line.211"></a>
+<span class="sourceLineNo">212</span>            backoff -&gt; LOG.warn("{} set last sequence id for peer {} failed,  sleep {} secs",<a name="line.212"></a>
+<span class="sourceLineNo">213</span>              getClass().getName(), peerId, backoff / 1000, e));<a name="line.213"></a>
+<span class="sourceLineNo">214</span>        }<a name="line.214"></a>
+<span class="sourceLineNo">215</span>        resetRetry();<a name="line.215"></a>
+<span class="sourceLineNo">216</span>        setNextState(enablePeerBeforeFinish() ? PeerModificationState.SERIAL_PEER_SET_PEER_ENABLED<a name="line.216"></a>
+<span class="sourceLineNo">217</span>          : PeerModificationState.POST_PEER_MODIFICATION);<a name="line.217"></a>
+<span class="sourceLineNo">218</span>        return Flow.HAS_MORE_STATE;<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      case SERIAL_PEER_SET_PEER_ENABLED:<a name="line.219"></a>
+<span class="sourceLineNo">220</span>        try {<a name="line.220"></a>
+<span class="sourceLineNo">221</span>          enablePeer(env);<a name="line.221"></a>
+<span class="sourceLineNo">222</span>        } catch (ReplicationException e) {<a name="line.222"></a>
+<span class="sourceLineNo">223</span>          throw suspend(env.getMasterConfiguration(),<a name="line.223"></a>
+<span class="sourceLineNo">224</span>            backoff -&gt; LOG.warn("{} enable peer before finish for peer {} failed,  sleep {} secs",<a name="line.224"></a>
+<span class="sourceLineNo">225</span>              getClass().getName(), peerId, backoff / 1000, e));<a name="line.225"></a>
+<span class="sourceLineNo">226</span>        }<a name="line.226"></a>
+<span class="sourceLineNo">227</span>        resetRetry();<a name="line.227"></a>
+<span class="sourceLineNo">228</span>        setNextState(PeerModificationState.SERIAL_PEER_ENABLE_PEER_REFRESH_PEER_ON_RS);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>        return Flow.HAS_MORE_STATE;<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      case SERIAL_PEER_ENABLE_PEER_REFRESH_PEER_ON_RS:<a name="line.230"></a>
+<span class="sourceLineNo">231</span>        refreshPeer(env, PeerOperationType.ENABLE);<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        setNextState(PeerModificationState.POST_PEER_MODIFICATION);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>        return Flow.HAS_MORE_STATE;<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      case POST_PEER_MODIFICATION:<a name="line.234"></a>
+<span class="sourceLineNo">235</span>        try {<a name="line.235"></a>
+<span class="sourceLineNo">236</span>          postPeerModification(env);<a name="line.236"></a>
+<span class="sourceLineNo">237</span>        } catch (ReplicationException e) {<a name="line.237"></a>
+<span class="sourceLineNo">238</span>          throw suspend(env.getMasterConfiguration(),<a name="line.238"></a>
+<span class="sourceLineNo">239</span>            backoff -&gt; LOG.warn(<a name="line.239"></a>
+<span class="sourceLineNo">240</span>              "{} failed to call postPeerModification for peer {},  sleep {} secs",<a name="line.240"></a>
+<span class="sourceLineNo">241</span>              getClass().getName(), peerId, backoff / 1000, e));<a name="line.241"></a>
+<span class="sourceLineNo">242</span>        } catch (IOException e) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>          LOG.warn("{} failed to call post CP hook for peer {}, " +<a name="line.243"></a>
+<span class="sourceLineNo">244</span>            "ignore since the procedure has already done", getClass().getName(), peerId, e);<a name="line.244"></a>
+<span class="sourceLineNo">245</span>        }<a name="line.245"></a>
+<span class="sourceLineNo">246</span>        releaseLatch(env);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>        return Flow.NO_MORE_STATE;<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      default:<a name="line.248"></a>
+<span class="sourceLineNo">249</span>        throw new UnsupportedOperationException("unhandled state=" + state);<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    }<a name="line.250"></a>
+<span class="sourceLineNo">251</span>  }<a name="line.251"></a>
+<span class="sourceLineNo">252</span><a name="line.252"></a>
+<span class="sourceLineNo">253</span>  @Override<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  protected PeerModificationState getState(int stateId) {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    return PeerModificationState.forNumber(stateId);<a name="line.255"></a>
+<span class="sourceLineNo">256</span>  }<a name="line.256"></a>
+<span class="sourceLineNo">257</span><a name="line.257"></a>
+<span class="sourceLineNo">258</span>  @Override<a name="line.258"></a>
+<span class="sourceLineNo">259</span>  protected int getStateId(PeerModificationState state) {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    return state.getNumber();<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>  @Override<a name="line.263"></a>
+<span class="sourceLineNo">264</span>  protected PeerModificationState getInitialState() {<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    return PeerModificationState.PRE_PEER_MODIFICATION;<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  }<a name="line.266"></a>
+<span class="sourceLineNo">267</span>}<a name="line.267"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALProcedure.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALProcedure.html
index 18f1cc8..77c4ea1 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALProcedure.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALProcedure.html
@@ -31,138 +31,136 @@
 <span class="sourceLineNo">023</span>import org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv;<a name="line.23"></a>
 <span class="sourceLineNo">024</span>import org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer;<a name="line.24"></a>
 <span class="sourceLineNo">025</span>import org.apache.hadoop.hbase.procedure2.ProcedureSuspendedException;<a name="line.25"></a>
-<span class="sourceLineNo">026</span>import org.apache.hadoop.hbase.procedure2.ProcedureUtil;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import org.slf4j.Logger;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import org.slf4j.LoggerFactory;<a name="line.29"></a>
-<span class="sourceLineNo">030</span><a name="line.30"></a>
-<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.SyncReplicationReplayWALState;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.SyncReplicationReplayWALStateData;<a name="line.33"></a>
-<span class="sourceLineNo">034</span><a name="line.34"></a>
-<span class="sourceLineNo">035</span>/**<a name="line.35"></a>
-<span class="sourceLineNo">036</span> * The procedure for replaying a set of remote wals. It will get an available region server and<a name="line.36"></a>
-<span class="sourceLineNo">037</span> * schedule a {@link SyncReplicationReplayWALRemoteProcedure} to actually send the request to region<a name="line.37"></a>
-<span class="sourceLineNo">038</span> * server.<a name="line.38"></a>
-<span class="sourceLineNo">039</span> */<a name="line.39"></a>
-<span class="sourceLineNo">040</span>@InterfaceAudience.Private<a name="line.40"></a>
-<span class="sourceLineNo">041</span>public class SyncReplicationReplayWALProcedure<a name="line.41"></a>
-<span class="sourceLineNo">042</span>    extends AbstractPeerNoLockProcedure&lt;SyncReplicationReplayWALState&gt; {<a name="line.42"></a>
-<span class="sourceLineNo">043</span><a name="line.43"></a>
-<span class="sourceLineNo">044</span>  private static final Logger LOG =<a name="line.44"></a>
-<span class="sourceLineNo">045</span>    LoggerFactory.getLogger(SyncReplicationReplayWALProcedure.class);<a name="line.45"></a>
-<span class="sourceLineNo">046</span><a name="line.46"></a>
-<span class="sourceLineNo">047</span>  private ServerName worker = null;<a name="line.47"></a>
-<span class="sourceLineNo">048</span><a name="line.48"></a>
-<span class="sourceLineNo">049</span>  private List&lt;String&gt; wals;<a name="line.49"></a>
-<span class="sourceLineNo">050</span><a name="line.50"></a>
-<span class="sourceLineNo">051</span>  public SyncReplicationReplayWALProcedure() {<a name="line.51"></a>
-<span class="sourceLineNo">052</span>  }<a name="line.52"></a>
-<span class="sourceLineNo">053</span><a name="line.53"></a>
-<span class="sourceLineNo">054</span>  public SyncReplicationReplayWALProcedure(String peerId, List&lt;String&gt; wals) {<a name="line.54"></a>
-<span class="sourceLineNo">055</span>    this.peerId = peerId;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>    this.wals = wals;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>  }<a name="line.57"></a>
-<span class="sourceLineNo">058</span><a name="line.58"></a>
-<span class="sourceLineNo">059</span>  @Override<a name="line.59"></a>
-<span class="sourceLineNo">060</span>  protected Flow executeFromState(MasterProcedureEnv env, SyncReplicationReplayWALState state)<a name="line.60"></a>
-<span class="sourceLineNo">061</span>      throws ProcedureSuspendedException {<a name="line.61"></a>
-<span class="sourceLineNo">062</span>    SyncReplicationReplayWALManager syncReplicationReplayWALManager =<a name="line.62"></a>
-<span class="sourceLineNo">063</span>      env.getMasterServices().getSyncReplicationReplayWALManager();<a name="line.63"></a>
-<span class="sourceLineNo">064</span>    switch (state) {<a name="line.64"></a>
-<span class="sourceLineNo">065</span>      case ASSIGN_WORKER:<a name="line.65"></a>
-<span class="sourceLineNo">066</span>        worker = syncReplicationReplayWALManager.acquirePeerWorker(peerId, this);<a name="line.66"></a>
-<span class="sourceLineNo">067</span>        setNextState(SyncReplicationReplayWALState.DISPATCH_WALS_TO_WORKER);<a name="line.67"></a>
-<span class="sourceLineNo">068</span>        return Flow.HAS_MORE_STATE;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>      case DISPATCH_WALS_TO_WORKER:<a name="line.69"></a>
-<span class="sourceLineNo">070</span>        addChildProcedure(new SyncReplicationReplayWALRemoteProcedure(peerId, wals, worker));<a name="line.70"></a>
-<span class="sourceLineNo">071</span>        setNextState(SyncReplicationReplayWALState.RELEASE_WORKER);<a name="line.71"></a>
-<span class="sourceLineNo">072</span>        return Flow.HAS_MORE_STATE;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>      case RELEASE_WORKER:<a name="line.73"></a>
-<span class="sourceLineNo">074</span>        boolean finished = false;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>        try {<a name="line.75"></a>
-<span class="sourceLineNo">076</span>          finished = syncReplicationReplayWALManager.isReplayWALFinished(wals.get(0));<a name="line.76"></a>
-<span class="sourceLineNo">077</span>        } catch (IOException e) {<a name="line.77"></a>
-<span class="sourceLineNo">078</span>          long backoff = ProcedureUtil.getBackoffTimeMs(attempts);<a name="line.78"></a>
-<span class="sourceLineNo">079</span>          LOG.warn("Failed to check whether replay wals {} finished for peer id={}" +<a name="line.79"></a>
-<span class="sourceLineNo">080</span>            ", sleep {} secs and retry", wals, peerId, backoff / 1000, e);<a name="line.80"></a>
-<span class="sourceLineNo">081</span>          throw suspend(backoff);<a name="line.81"></a>
-<span class="sourceLineNo">082</span>        }<a name="line.82"></a>
-<span class="sourceLineNo">083</span>        syncReplicationReplayWALManager.releasePeerWorker(peerId, worker,<a name="line.83"></a>
-<span class="sourceLineNo">084</span>          env.getProcedureScheduler());<a name="line.84"></a>
-<span class="sourceLineNo">085</span>        if (!finished) {<a name="line.85"></a>
-<span class="sourceLineNo">086</span>          LOG.warn("Failed to replay wals {} for peer id={}, retry", wals, peerId);<a name="line.86"></a>
-<span class="sourceLineNo">087</span>          setNextState(SyncReplicationReplayWALState.ASSIGN_WORKER);<a name="line.87"></a>
-<span class="sourceLineNo">088</span>          return Flow.HAS_MORE_STATE;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>        }<a name="line.89"></a>
-<span class="sourceLineNo">090</span>        return Flow.NO_MORE_STATE;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>      default:<a name="line.91"></a>
-<span class="sourceLineNo">092</span>        throw new UnsupportedOperationException("unhandled state=" + state);<a name="line.92"></a>
-<span class="sourceLineNo">093</span>    }<a name="line.93"></a>
-<span class="sourceLineNo">094</span>  }<a name="line.94"></a>
-<span class="sourceLineNo">095</span><a name="line.95"></a>
-<span class="sourceLineNo">096</span>  @Override<a name="line.96"></a>
-<span class="sourceLineNo">097</span>  protected void rollbackState(MasterProcedureEnv env, SyncReplicationReplayWALState state)<a name="line.97"></a>
-<span class="sourceLineNo">098</span>      throws IOException, InterruptedException {<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    if (state == getInitialState()) {<a name="line.99"></a>
-<span class="sourceLineNo">100</span>      return;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    }<a name="line.101"></a>
-<span class="sourceLineNo">102</span>    throw new UnsupportedOperationException();<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  }<a name="line.103"></a>
-<span class="sourceLineNo">104</span><a name="line.104"></a>
-<span class="sourceLineNo">105</span>  @Override<a name="line.105"></a>
-<span class="sourceLineNo">106</span>  protected SyncReplicationReplayWALState getState(int state) {<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    return SyncReplicationReplayWALState.forNumber(state);<a name="line.107"></a>
-<span class="sourceLineNo">108</span>  }<a name="line.108"></a>
-<span class="sourceLineNo">109</span><a name="line.109"></a>
-<span class="sourceLineNo">110</span>  @Override<a name="line.110"></a>
-<span class="sourceLineNo">111</span>  protected int getStateId(SyncReplicationReplayWALState state) {<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    return state.getNumber();<a name="line.112"></a>
-<span class="sourceLineNo">113</span>  }<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>  @Override<a name="line.115"></a>
-<span class="sourceLineNo">116</span>  protected SyncReplicationReplayWALState getInitialState() {<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    return SyncReplicationReplayWALState.ASSIGN_WORKER;<a name="line.117"></a>
-<span class="sourceLineNo">118</span>  }<a name="line.118"></a>
-<span class="sourceLineNo">119</span><a name="line.119"></a>
-<span class="sourceLineNo">120</span>  @Override<a name="line.120"></a>
-<span class="sourceLineNo">121</span>  protected void serializeStateData(ProcedureStateSerializer serializer) throws IOException {<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    super.serializeStateData(serializer);<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    SyncReplicationReplayWALStateData.Builder builder =<a name="line.123"></a>
-<span class="sourceLineNo">124</span>      SyncReplicationReplayWALStateData.newBuilder().setPeerId(peerId).addAllWal(wals);<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    if (worker != null) {<a name="line.125"></a>
-<span class="sourceLineNo">126</span>      builder.setWorker(ProtobufUtil.toServerName(worker));<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    }<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    serializer.serialize(builder.build());<a name="line.128"></a>
-<span class="sourceLineNo">129</span>  }<a name="line.129"></a>
-<span class="sourceLineNo">130</span><a name="line.130"></a>
-<span class="sourceLineNo">131</span>  @Override<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  protected void deserializeStateData(ProcedureStateSerializer serializer) throws IOException {<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    super.deserializeStateData(serializer);<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    SyncReplicationReplayWALStateData data =<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      serializer.deserialize(SyncReplicationReplayWALStateData.class);<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    peerId = data.getPeerId();<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    wals = data.getWalList();<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    if (data.hasWorker()) {<a name="line.138"></a>
-<span class="sourceLineNo">139</span>      worker = ProtobufUtil.toServerName(data.getWorker());<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    }<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  }<a name="line.141"></a>
-<span class="sourceLineNo">142</span><a name="line.142"></a>
-<span class="sourceLineNo">143</span>  @Override<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public PeerOperationType getPeerOperationType() {<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    return PeerOperationType.SYNC_REPLICATION_REPLAY_WAL;<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  }<a name="line.146"></a>
-<span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>  @Override<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  protected void afterReplay(MasterProcedureEnv env) {<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    // If the procedure is not finished and the worker is not null, we should add it to the used<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    // worker set, to prevent the worker being used by others.<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    if (worker != null &amp;&amp; !isFinished()) {<a name="line.152"></a>
-<span class="sourceLineNo">153</span>      env.getMasterServices().getSyncReplicationReplayWALManager().addUsedPeerWorker(peerId,<a name="line.153"></a>
-<span class="sourceLineNo">154</span>        worker);<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    }<a name="line.155"></a>
-<span class="sourceLineNo">156</span>  }<a name="line.156"></a>
-<span class="sourceLineNo">157</span>}<a name="line.157"></a>
+<span class="sourceLineNo">026</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.26"></a>
+<span class="sourceLineNo">027</span>import org.slf4j.Logger;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import org.slf4j.LoggerFactory;<a name="line.28"></a>
+<span class="sourceLineNo">029</span><a name="line.29"></a>
+<span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.SyncReplicationReplayWALState;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.SyncReplicationReplayWALStateData;<a name="line.32"></a>
+<span class="sourceLineNo">033</span><a name="line.33"></a>
+<span class="sourceLineNo">034</span>/**<a name="line.34"></a>
+<span class="sourceLineNo">035</span> * The procedure for replaying a set of remote wals. It will get an available region server and<a name="line.35"></a>
+<span class="sourceLineNo">036</span> * schedule a {@link SyncReplicationReplayWALRemoteProcedure} to actually send the request to region<a name="line.36"></a>
+<span class="sourceLineNo">037</span> * server.<a name="line.37"></a>
+<span class="sourceLineNo">038</span> */<a name="line.38"></a>
+<span class="sourceLineNo">039</span>@InterfaceAudience.Private<a name="line.39"></a>
+<span class="sourceLineNo">040</span>public class SyncReplicationReplayWALProcedure<a name="line.40"></a>
+<span class="sourceLineNo">041</span>    extends AbstractPeerNoLockProcedure&lt;SyncReplicationReplayWALState&gt; {<a name="line.41"></a>
+<span class="sourceLineNo">042</span><a name="line.42"></a>
+<span class="sourceLineNo">043</span>  private static final Logger LOG =<a name="line.43"></a>
+<span class="sourceLineNo">044</span>    LoggerFactory.getLogger(SyncReplicationReplayWALProcedure.class);<a name="line.44"></a>
+<span class="sourceLineNo">045</span><a name="line.45"></a>
+<span class="sourceLineNo">046</span>  private ServerName worker = null;<a name="line.46"></a>
+<span class="sourceLineNo">047</span><a name="line.47"></a>
+<span class="sourceLineNo">048</span>  private List&lt;String&gt; wals;<a name="line.48"></a>
+<span class="sourceLineNo">049</span><a name="line.49"></a>
+<span class="sourceLineNo">050</span>  public SyncReplicationReplayWALProcedure() {<a name="line.50"></a>
+<span class="sourceLineNo">051</span>  }<a name="line.51"></a>
+<span class="sourceLineNo">052</span><a name="line.52"></a>
+<span class="sourceLineNo">053</span>  public SyncReplicationReplayWALProcedure(String peerId, List&lt;String&gt; wals) {<a name="line.53"></a>
+<span class="sourceLineNo">054</span>    this.peerId = peerId;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>    this.wals = wals;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>  }<a name="line.56"></a>
+<span class="sourceLineNo">057</span><a name="line.57"></a>
+<span class="sourceLineNo">058</span>  @Override<a name="line.58"></a>
+<span class="sourceLineNo">059</span>  protected Flow executeFromState(MasterProcedureEnv env, SyncReplicationReplayWALState state)<a name="line.59"></a>
+<span class="sourceLineNo">060</span>      throws ProcedureSuspendedException {<a name="line.60"></a>
+<span class="sourceLineNo">061</span>    SyncReplicationReplayWALManager syncReplicationReplayWALManager =<a name="line.61"></a>
+<span class="sourceLineNo">062</span>      env.getMasterServices().getSyncReplicationReplayWALManager();<a name="line.62"></a>
+<span class="sourceLineNo">063</span>    switch (state) {<a name="line.63"></a>
+<span class="sourceLineNo">064</span>      case ASSIGN_WORKER:<a name="line.64"></a>
+<span class="sourceLineNo">065</span>        worker = syncReplicationReplayWALManager.acquirePeerWorker(peerId, this);<a name="line.65"></a>
+<span class="sourceLineNo">066</span>        setNextState(SyncReplicationReplayWALState.DISPATCH_WALS_TO_WORKER);<a name="line.66"></a>
+<span class="sourceLineNo">067</span>        return Flow.HAS_MORE_STATE;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>      case DISPATCH_WALS_TO_WORKER:<a name="line.68"></a>
+<span class="sourceLineNo">069</span>        addChildProcedure(new SyncReplicationReplayWALRemoteProcedure(peerId, wals, worker));<a name="line.69"></a>
+<span class="sourceLineNo">070</span>        setNextState(SyncReplicationReplayWALState.RELEASE_WORKER);<a name="line.70"></a>
+<span class="sourceLineNo">071</span>        return Flow.HAS_MORE_STATE;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>      case RELEASE_WORKER:<a name="line.72"></a>
+<span class="sourceLineNo">073</span>        boolean finished = false;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>        try {<a name="line.74"></a>
+<span class="sourceLineNo">075</span>          finished = syncReplicationReplayWALManager.isReplayWALFinished(wals.get(0));<a name="line.75"></a>
+<span class="sourceLineNo">076</span>        } catch (IOException e) {<a name="line.76"></a>
+<span class="sourceLineNo">077</span>          throw suspend(env.getMasterConfiguration(),<a name="line.77"></a>
+<span class="sourceLineNo">078</span>            backoff -&gt; LOG.warn("Failed to check whether replay wals {} finished for peer id={}" +<a name="line.78"></a>
+<span class="sourceLineNo">079</span>              ", sleep {} secs and retry", wals, peerId, backoff / 1000, e));<a name="line.79"></a>
+<span class="sourceLineNo">080</span>        }<a name="line.80"></a>
+<span class="sourceLineNo">081</span>        syncReplicationReplayWALManager.releasePeerWorker(peerId, worker,<a name="line.81"></a>
+<span class="sourceLineNo">082</span>          env.getProcedureScheduler());<a name="line.82"></a>
+<span class="sourceLineNo">083</span>        if (!finished) {<a name="line.83"></a>
+<span class="sourceLineNo">084</span>          LOG.warn("Failed to replay wals {} for peer id={}, retry", wals, peerId);<a name="line.84"></a>
+<span class="sourceLineNo">085</span>          setNextState(SyncReplicationReplayWALState.ASSIGN_WORKER);<a name="line.85"></a>
+<span class="sourceLineNo">086</span>          return Flow.HAS_MORE_STATE;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>        }<a name="line.87"></a>
+<span class="sourceLineNo">088</span>        return Flow.NO_MORE_STATE;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>      default:<a name="line.89"></a>
+<span class="sourceLineNo">090</span>        throw new UnsupportedOperationException("unhandled state=" + state);<a name="line.90"></a>
+<span class="sourceLineNo">091</span>    }<a name="line.91"></a>
+<span class="sourceLineNo">092</span>  }<a name="line.92"></a>
+<span class="sourceLineNo">093</span><a name="line.93"></a>
+<span class="sourceLineNo">094</span>  @Override<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  protected void rollbackState(MasterProcedureEnv env, SyncReplicationReplayWALState state)<a name="line.95"></a>
+<span class="sourceLineNo">096</span>      throws IOException, InterruptedException {<a name="line.96"></a>
+<span class="sourceLineNo">097</span>    if (state == getInitialState()) {<a name="line.97"></a>
+<span class="sourceLineNo">098</span>      return;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    }<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    throw new UnsupportedOperationException();<a name="line.100"></a>
+<span class="sourceLineNo">101</span>  }<a name="line.101"></a>
+<span class="sourceLineNo">102</span><a name="line.102"></a>
+<span class="sourceLineNo">103</span>  @Override<a name="line.103"></a>
+<span class="sourceLineNo">104</span>  protected SyncReplicationReplayWALState getState(int state) {<a name="line.104"></a>
+<span class="sourceLineNo">105</span>    return SyncReplicationReplayWALState.forNumber(state);<a name="line.105"></a>
+<span class="sourceLineNo">106</span>  }<a name="line.106"></a>
+<span class="sourceLineNo">107</span><a name="line.107"></a>
+<span class="sourceLineNo">108</span>  @Override<a name="line.108"></a>
+<span class="sourceLineNo">109</span>  protected int getStateId(SyncReplicationReplayWALState state) {<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    return state.getNumber();<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  }<a name="line.111"></a>
+<span class="sourceLineNo">112</span><a name="line.112"></a>
+<span class="sourceLineNo">113</span>  @Override<a name="line.113"></a>
+<span class="sourceLineNo">114</span>  protected SyncReplicationReplayWALState getInitialState() {<a name="line.114"></a>
+<span class="sourceLineNo">115</span>    return SyncReplicationReplayWALState.ASSIGN_WORKER;<a name="line.115"></a>
+<span class="sourceLineNo">116</span>  }<a name="line.116"></a>
+<span class="sourceLineNo">117</span><a name="line.117"></a>
+<span class="sourceLineNo">118</span>  @Override<a name="line.118"></a>
+<span class="sourceLineNo">119</span>  protected void serializeStateData(ProcedureStateSerializer serializer) throws IOException {<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    super.serializeStateData(serializer);<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    SyncReplicationReplayWALStateData.Builder builder =<a name="line.121"></a>
+<span class="sourceLineNo">122</span>      SyncReplicationReplayWALStateData.newBuilder().setPeerId(peerId).addAllWal(wals);<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    if (worker != null) {<a name="line.123"></a>
+<span class="sourceLineNo">124</span>      builder.setWorker(ProtobufUtil.toServerName(worker));<a name="line.124"></a>
+<span class="sourceLineNo">125</span>    }<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    serializer.serialize(builder.build());<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  }<a name="line.127"></a>
+<span class="sourceLineNo">128</span><a name="line.128"></a>
+<span class="sourceLineNo">129</span>  @Override<a name="line.129"></a>
+<span class="sourceLineNo">130</span>  protected void deserializeStateData(ProcedureStateSerializer serializer) throws IOException {<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    super.deserializeStateData(serializer);<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    SyncReplicationReplayWALStateData data =<a name="line.132"></a>
+<span class="sourceLineNo">133</span>      serializer.deserialize(SyncReplicationReplayWALStateData.class);<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    peerId = data.getPeerId();<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    wals = data.getWalList();<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    if (data.hasWorker()) {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>      worker = ProtobufUtil.toServerName(data.getWorker());<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    }<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  }<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>  @Override<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public PeerOperationType getPeerOperationType() {<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    return PeerOperationType.SYNC_REPLICATION_REPLAY_WAL;<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  }<a name="line.144"></a>
+<span class="sourceLineNo">145</span><a name="line.145"></a>
+<span class="sourceLineNo">146</span>  @Override<a name="line.146"></a>
+<span class="sourceLineNo">147</span>  protected void afterReplay(MasterProcedureEnv env) {<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    // If the procedure is not finished and the worker is not null, we should add it to the used<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    // worker set, to prevent the worker being used by others.<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    if (worker != null &amp;&amp; !isFinished()) {<a name="line.150"></a>
+<span class="sourceLineNo">151</span>      env.getMasterServices().getSyncReplicationReplayWALManager().addUsedPeerWorker(peerId,<a name="line.151"></a>
+<span class="sourceLineNo">152</span>        worker);<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    }<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  }<a name="line.154"></a>
+<span class="sourceLineNo">155</span>}<a name="line.155"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/replication/TransitPeerSyncReplicationStateProcedure.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/replication/TransitPeerSyncReplicationStateProcedure.html
index a17aad6..edbe6b6 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/replication/TransitPeerSyncReplicationStateProcedure.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/replication/TransitPeerSyncReplicationStateProcedure.html
@@ -36,365 +36,359 @@
 <span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.master.procedure.ReopenTableRegionsProcedure;<a name="line.28"></a>
 <span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer;<a name="line.29"></a>
 <span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.procedure2.ProcedureSuspendedException;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.procedure2.ProcedureUtil;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.replication.ReplicationException;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.replication.ReplicationPeerDescription;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.replication.ReplicationUtils;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.replication.SyncReplicationState;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.slf4j.Logger;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.slf4j.LoggerFactory;<a name="line.38"></a>
-<span class="sourceLineNo">039</span><a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.40"></a>
-<span class="sourceLineNo">041</span><a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.PeerSyncReplicationStateTransitionState;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.TransitPeerSyncReplicationStateStateData;<a name="line.43"></a>
-<span class="sourceLineNo">044</span><a name="line.44"></a>
-<span class="sourceLineNo">045</span>/**<a name="line.45"></a>
-<span class="sourceLineNo">046</span> * The procedure for transit current sync replication state for a synchronous replication peer.<a name="line.46"></a>
-<span class="sourceLineNo">047</span> */<a name="line.47"></a>
-<span class="sourceLineNo">048</span>@InterfaceAudience.Private<a name="line.48"></a>
-<span class="sourceLineNo">049</span>public class TransitPeerSyncReplicationStateProcedure<a name="line.49"></a>
-<span class="sourceLineNo">050</span>    extends AbstractPeerProcedure&lt;PeerSyncReplicationStateTransitionState&gt; {<a name="line.50"></a>
-<span class="sourceLineNo">051</span><a name="line.51"></a>
-<span class="sourceLineNo">052</span>  private static final Logger LOG =<a name="line.52"></a>
-<span class="sourceLineNo">053</span>    LoggerFactory.getLogger(TransitPeerSyncReplicationStateProcedure.class);<a name="line.53"></a>
-<span class="sourceLineNo">054</span><a name="line.54"></a>
-<span class="sourceLineNo">055</span>  protected SyncReplicationState fromState;<a name="line.55"></a>
-<span class="sourceLineNo">056</span><a name="line.56"></a>
-<span class="sourceLineNo">057</span>  private SyncReplicationState toState;<a name="line.57"></a>
-<span class="sourceLineNo">058</span><a name="line.58"></a>
-<span class="sourceLineNo">059</span>  private boolean enabled;<a name="line.59"></a>
-<span class="sourceLineNo">060</span><a name="line.60"></a>
-<span class="sourceLineNo">061</span>  private boolean serial;<a name="line.61"></a>
-<span class="sourceLineNo">062</span><a name="line.62"></a>
-<span class="sourceLineNo">063</span>  public TransitPeerSyncReplicationStateProcedure() {<a name="line.63"></a>
-<span class="sourceLineNo">064</span>  }<a name="line.64"></a>
-<span class="sourceLineNo">065</span><a name="line.65"></a>
-<span class="sourceLineNo">066</span>  public TransitPeerSyncReplicationStateProcedure(String peerId, SyncReplicationState state) {<a name="line.66"></a>
-<span class="sourceLineNo">067</span>    super(peerId);<a name="line.67"></a>
-<span class="sourceLineNo">068</span>    this.toState = state;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>  }<a name="line.69"></a>
-<span class="sourceLineNo">070</span><a name="line.70"></a>
-<span class="sourceLineNo">071</span>  @Override<a name="line.71"></a>
-<span class="sourceLineNo">072</span>  public PeerOperationType getPeerOperationType() {<a name="line.72"></a>
-<span class="sourceLineNo">073</span>    return PeerOperationType.TRANSIT_SYNC_REPLICATION_STATE;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>  }<a name="line.74"></a>
-<span class="sourceLineNo">075</span><a name="line.75"></a>
-<span class="sourceLineNo">076</span>  @Override<a name="line.76"></a>
-<span class="sourceLineNo">077</span>  protected void serializeStateData(ProcedureStateSerializer serializer) throws IOException {<a name="line.77"></a>
-<span class="sourceLineNo">078</span>    super.serializeStateData(serializer);<a name="line.78"></a>
-<span class="sourceLineNo">079</span>    TransitPeerSyncReplicationStateStateData.Builder builder =<a name="line.79"></a>
-<span class="sourceLineNo">080</span>      TransitPeerSyncReplicationStateStateData.newBuilder()<a name="line.80"></a>
-<span class="sourceLineNo">081</span>        .setToState(ReplicationPeerConfigUtil.toSyncReplicationState(toState));<a name="line.81"></a>
-<span class="sourceLineNo">082</span>    if (fromState != null) {<a name="line.82"></a>
-<span class="sourceLineNo">083</span>      builder.setFromState(ReplicationPeerConfigUtil.toSyncReplicationState(fromState));<a name="line.83"></a>
-<span class="sourceLineNo">084</span>    }<a name="line.84"></a>
-<span class="sourceLineNo">085</span>    serializer.serialize(builder.build());<a name="line.85"></a>
-<span class="sourceLineNo">086</span>  }<a name="line.86"></a>
-<span class="sourceLineNo">087</span><a name="line.87"></a>
-<span class="sourceLineNo">088</span>  @Override<a name="line.88"></a>
-<span class="sourceLineNo">089</span>  protected void deserializeStateData(ProcedureStateSerializer serializer) throws IOException {<a name="line.89"></a>
-<span class="sourceLineNo">090</span>    super.deserializeStateData(serializer);<a name="line.90"></a>
-<span class="sourceLineNo">091</span>    TransitPeerSyncReplicationStateStateData data =<a name="line.91"></a>
-<span class="sourceLineNo">092</span>      serializer.deserialize(TransitPeerSyncReplicationStateStateData.class);<a name="line.92"></a>
-<span class="sourceLineNo">093</span>    toState = ReplicationPeerConfigUtil.toSyncReplicationState(data.getToState());<a name="line.93"></a>
-<span class="sourceLineNo">094</span>    if (data.hasFromState()) {<a name="line.94"></a>
-<span class="sourceLineNo">095</span>      fromState = ReplicationPeerConfigUtil.toSyncReplicationState(data.getFromState());<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    }<a name="line.96"></a>
-<span class="sourceLineNo">097</span>  }<a name="line.97"></a>
-<span class="sourceLineNo">098</span><a name="line.98"></a>
-<span class="sourceLineNo">099</span>  @Override<a name="line.99"></a>
-<span class="sourceLineNo">100</span>  protected PeerSyncReplicationStateTransitionState getState(int stateId) {<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    return PeerSyncReplicationStateTransitionState.forNumber(stateId);<a name="line.101"></a>
-<span class="sourceLineNo">102</span>  }<a name="line.102"></a>
-<span class="sourceLineNo">103</span><a name="line.103"></a>
-<span class="sourceLineNo">104</span>  @Override<a name="line.104"></a>
-<span class="sourceLineNo">105</span>  protected int getStateId(PeerSyncReplicationStateTransitionState state) {<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    return state.getNumber();<a name="line.106"></a>
-<span class="sourceLineNo">107</span>  }<a name="line.107"></a>
-<span class="sourceLineNo">108</span><a name="line.108"></a>
-<span class="sourceLineNo">109</span>  @Override<a name="line.109"></a>
-<span class="sourceLineNo">110</span>  protected PeerSyncReplicationStateTransitionState getInitialState() {<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    return PeerSyncReplicationStateTransitionState.PRE_PEER_SYNC_REPLICATION_STATE_TRANSITION;<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  }<a name="line.112"></a>
-<span class="sourceLineNo">113</span><a name="line.113"></a>
-<span class="sourceLineNo">114</span>  @VisibleForTesting<a name="line.114"></a>
-<span class="sourceLineNo">115</span>  protected void preTransit(MasterProcedureEnv env) throws IOException {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    MasterCoprocessorHost cpHost = env.getMasterCoprocessorHost();<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    if (cpHost != null) {<a name="line.117"></a>
-<span class="sourceLineNo">118</span>      cpHost.preTransitReplicationPeerSyncReplicationState(peerId, toState);<a name="line.118"></a>
-<span class="sourceLineNo">119</span>    }<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    ReplicationPeerDescription desc =<a name="line.120"></a>
-<span class="sourceLineNo">121</span>      env.getReplicationPeerManager().preTransitPeerSyncReplicationState(peerId, toState);<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    if (toState == SyncReplicationState.ACTIVE) {<a name="line.122"></a>
-<span class="sourceLineNo">123</span>      Path remoteWALDirForPeer =<a name="line.123"></a>
-<span class="sourceLineNo">124</span>        ReplicationUtils.getPeerRemoteWALDir(desc.getPeerConfig().getRemoteWALDir(), peerId);<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      // check whether the remote wal directory is present<a name="line.125"></a>
-<span class="sourceLineNo">126</span>      if (!remoteWALDirForPeer.getFileSystem(env.getMasterConfiguration())<a name="line.126"></a>
-<span class="sourceLineNo">127</span>        .exists(remoteWALDirForPeer)) {<a name="line.127"></a>
-<span class="sourceLineNo">128</span>        throw new DoNotRetryIOException(<a name="line.128"></a>
-<span class="sourceLineNo">129</span>          "The remote WAL directory " + remoteWALDirForPeer + " does not exist");<a name="line.129"></a>
-<span class="sourceLineNo">130</span>      }<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    }<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    fromState = desc.getSyncReplicationState();<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    enabled = desc.isEnabled();<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    serial = desc.getPeerConfig().isSerial();<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  }<a name="line.135"></a>
-<span class="sourceLineNo">136</span><a name="line.136"></a>
-<span class="sourceLineNo">137</span>  private void postTransit(MasterProcedureEnv env) throws IOException {<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    LOG.info(<a name="line.138"></a>
-<span class="sourceLineNo">139</span>      "Successfully transit current cluster state from {} to {} for sync replication peer {}",<a name="line.139"></a>
-<span class="sourceLineNo">140</span>      fromState, toState, peerId);<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    MasterCoprocessorHost cpHost = env.getMasterCoprocessorHost();<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    if (cpHost != null) {<a name="line.142"></a>
-<span class="sourceLineNo">143</span>      env.getMasterCoprocessorHost().postTransitReplicationPeerSyncReplicationState(peerId,<a name="line.143"></a>
-<span class="sourceLineNo">144</span>        fromState, toState);<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    }<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  }<a name="line.146"></a>
-<span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>  @VisibleForTesting<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  protected void reopenRegions(MasterProcedureEnv env) {<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    addChildProcedure(<a name="line.150"></a>
-<span class="sourceLineNo">151</span>      env.getReplicationPeerManager().getPeerConfig(peerId).get().getTableCFsMap().keySet().stream()<a name="line.151"></a>
-<span class="sourceLineNo">152</span>        .map(ReopenTableRegionsProcedure::new).toArray(ReopenTableRegionsProcedure[]::new));<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  }<a name="line.153"></a>
-<span class="sourceLineNo">154</span><a name="line.154"></a>
-<span class="sourceLineNo">155</span>  @VisibleForTesting<a name="line.155"></a>
-<span class="sourceLineNo">156</span>  protected void createDirForRemoteWAL(MasterProcedureEnv env) throws IOException {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    MasterFileSystem mfs = env.getMasterFileSystem();<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    Path remoteWALDir = new Path(mfs.getWALRootDir(), ReplicationUtils.REMOTE_WAL_DIR_NAME);<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    Path remoteWALDirForPeer = ReplicationUtils.getPeerRemoteWALDir(remoteWALDir, peerId);<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    FileSystem walFs = mfs.getWALFileSystem();<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    if (walFs.exists(remoteWALDirForPeer)) {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      LOG.warn("Wal dir {} already exists, usually this should not happen, continue anyway",<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        remoteWALDirForPeer);<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    } else if (!walFs.mkdirs(remoteWALDirForPeer)) {<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      throw new IOException("Failed to create remote wal dir " + remoteWALDirForPeer);<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    }<a name="line.166"></a>
-<span class="sourceLineNo">167</span>  }<a name="line.167"></a>
-<span class="sourceLineNo">168</span><a name="line.168"></a>
-<span class="sourceLineNo">169</span>  private void setNextStateAfterRefreshBegin() {<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    if (fromState.equals(SyncReplicationState.ACTIVE)) {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      setNextState(toState.equals(SyncReplicationState.STANDBY)<a name="line.171"></a>
-<span class="sourceLineNo">172</span>        ? PeerSyncReplicationStateTransitionState.REMOVE_ALL_REPLICATION_QUEUES_IN_PEER<a name="line.172"></a>
-<span class="sourceLineNo">173</span>        : PeerSyncReplicationStateTransitionState.REOPEN_ALL_REGIONS_IN_PEER);<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    } else if (fromState.equals(SyncReplicationState.DOWNGRADE_ACTIVE)) {<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      setNextState(toState.equals(SyncReplicationState.STANDBY)<a name="line.175"></a>
-<span class="sourceLineNo">176</span>        ? PeerSyncReplicationStateTransitionState.REMOVE_ALL_REPLICATION_QUEUES_IN_PEER<a name="line.176"></a>
-<span class="sourceLineNo">177</span>        : PeerSyncReplicationStateTransitionState.REOPEN_ALL_REGIONS_IN_PEER);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    } else {<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      assert toState.equals(SyncReplicationState.DOWNGRADE_ACTIVE);<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      // for serial peer, we need to reopen all the regions and then update the last pushed sequence<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      // id, before replaying any remote wals, so that the serial replication will not be stuck, and<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      // also guarantee the order when replicating the remote wal back.<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      setNextState(serial ? PeerSyncReplicationStateTransitionState.REOPEN_ALL_REGIONS_IN_PEER<a name="line.183"></a>
-<span class="sourceLineNo">184</span>        : PeerSyncReplicationStateTransitionState.REPLAY_REMOTE_WAL_IN_PEER);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    }<a name="line.185"></a>
... 23457 lines suppressed ...